Chapter 9 - Support Vector Machines - q4

In [156]:
set.seed(1)
class = sample(100,50)
x = rnorm(200)
x2 = 2*x^2 + 3*x + 4 + rnorm(200)
x2[class]=x2[class]+3
x2[-class]=x2[-class]-3
y=rep(0,200)
y[class]=1
y[-class]=2
dat = data.frame(x=cbind(x,x2),y=as.factor(y))
plot(dat[,-3],col=y)
In [157]:
train = sample(200,100)
In [158]:
#linear kernel
svmfit.l = svm(y~.,data=dat[train,],kernel="linear",cost=10)
plot(svmfit.l,dat[train,])
In [162]:
#polynomial kernel
svmfit.p = svm(y~.,data=dat[train,],kernel="polynomial",cost=3)
plot(svmfit.p,dat[train,])
In [159]:
#radial kernel
svmfit.r = svm(y~.,data=dat[train,],kernel="radial",cost=10)
plot(svmfit.r,dat[train,])

The radial and polynomial kernel can generalize the training data better.

In [163]:
#linear kernel
pred = predict(svmfit.l,newdata=dat[-train,])
table(pred,dat[-train,]$y)
    
pred  1  2
   1 19  9
   2  7 65
In [164]:
#polynomial kernel
pred=predict(svmfit.p,newdata=dat[-train,])
table(pred,dat[-train,]$y)
    
pred  1  2
   1  6  0
   2 20 74
In [165]:
#radial kernel
pred=predict(svmfit.r,newdata=dat[-train,])
table(pred,dat[-train,]$y)
    
pred  1  2
   1 26  0
   2  0 74

The svm model with radial kernel doesn't misclassify even a single test sample and hence has the best performance.

In [ ]: