# code based on files " Code regarding the first part of section 5.6",
# "Code regarding section 4.8", and "Code regarding section 5.7"
# (copyright 2003, 2004, 2012 A.Azzalini and B.Scarpa)

library(class)
library(e1071)

# help functions
pred.square <- function(model, x1, x2, grid = 50, Z.flag = FALSE)
{
  u <- pretty(x1, n = 10)
  x <- seq(u[1], u[10], length = grid)
  u <- pretty(x2, n = 10)
  y <- seq(u[1], u[10], length = grid)
  nx <- length(x)
  ny <- length(y)
  xoy <- cbind(rep(x, ny), as.vector(matrix(y, nx, ny, byrow = TRUE)))
  X <- matrix(xoy, nx * ny, 2, byrow = FALSE)
  if(Z.flag) pred <- predict(model, newdata = data.frame(z1 = X[ , 1], z2 = X[ , 2]))
  else  pred <- predict(model, newdata = data.frame(x1 = X[ , 1], x2 = X[ , 2]))
  list(pred = pred, x = x, y = y, X = X)
}


dataset <- read.table("http://azzalini.stat.unipd.it/Book-DM/classes.dat", header = TRUE, nrows = 200)
gr <- (2 - dataset[ , 3]) # groups are indicated by 0 and 1
K <- 2
n <- nrow(dataset)
attach(dataset)
n.grid <- 800
plot(dataset[ , 1:2], type = "n", xlab = expression(italic(x)[1]), ylab = expression(italic(x)[2]))
for(k in 1:K)
{
  g <- (group == k)
  points(dataset[g, 1:2], pch = 15 + k, col = 1 + k, cex = 1.5)
}

s3 <- svm(factor(group) ~ x1 + x2, data = dataset, kernel = "polynomial", degree = 3, cost = 1)
# figure 5.26a
plot(dataset[ , 1:2], type = "n", xlab = expression(italic(x)[1]), 
     ylab = expression(italic(x)[2]))
for(k in 1:K)
{
  g <- (group == k)
  points(dataset[g, 1:2], pch = 15 + k, col = 1 + k, cex = 1.5)
}
p <- pred.square(s3, x1, x2, grid = n.grid)
pred<- matrix(as.numeric(p$pred), n.grid, n.grid)
contour(p$x, p$y, pred, add = TRUE, levels = 1.5, lty = 2, drawlabels = FALSE)

#--------
s2 <- svm(factor(group) ~ x1 + x2, data = dataset, kernel = "radial", cost = 1)
# figure 5.26b
plot(dataset[ , 1:2], type = "n", xlab = expression(italic(x)[1]), ylab = expression(italic(x)[2]))
for(k in 1:K)
{
  g <- (group == k)
  points(dataset[g, 1:2], pch = 15 + k, col = 1 + k, cex = 1.5)
}
p <- pred.square(s2, x1, x2, grid = n.grid)
pred <- matrix(as.numeric(p$pred), n.grid, n.grid)
contour(p$x, p$y, pred, add = TRUE, levels = 1.5, lty = 2, drawlabels = FALSE)

s0P <- tune.svm(factor(group) ~ x1 + x2, data = dataset, kernel = "polynomial",
                cost = exp(seq(-1, 6, length = 25)))
# figure 5.26c
plot(dataset[ , 1:2], type = "n", xlab = expression(italic(x)[1]), ylab = expression(italic(x)[2]))
for(k in 1:K)
{
  g <- (group == k)
  points(dataset[g, 1:2], pch = 15 + k, col = 1 + k, cex = 1.5)
}
p <- pred.square(s0P$best.model, x1, x2, grid = n.grid)
pred <- matrix(as.numeric(p$pred), n.grid, n.grid)
contour(p$x, p$y, pred, add = TRUE, levels = 1.5, lty = 2, drawlabels = FALSE)

s0R <- tune.svm(factor(group) ~ x1 + x2, data = dataset, kernel = "radial",
                cost = exp(seq(-2, 4, length = 25)))
# figure 5.26d
plot(dataset[ , 1:2], type = "n", xlab = expression(italic(x)[1]), ylab = expression(italic(x)[2]))
for(k in 1:K)
{
  g <- (group == k)
  points(dataset[g, 1:2], pch = 15 + k, col = 1 + k, cex = 1.5)
}
p <- pred.square(s0R$best.model, x1, x2, grid = n.grid)
pred <- matrix(as.numeric(p$pred), n.grid, n.grid)
contour(p$x, p$y, pred, add = TRUE, levels = 1.5, lty = 2, drawlabels = FALSE)

