Linear SVM Classifier
We will use the e1071 package, that contains the svm function to run our codes
#install.packages("e1071")
require(e1071)
Loading required package: e1071
Creating a low dimensionion dataset, and run SVM classifier on it. Variable x - 20 observations across two classes (normally distributed) Variable y - 20 variables, 10 with -1 and 10 with +1
set.seed(10111)
x <- matrix(rnorm(40), 20, 2)
y <- rep(c(-1,1), c(10,10))
#For the indices where y = 1, we move the means from 0 to 1 for the x
x[y==1,] <- x[y==1,] + 1
plot(x, col = y + 3, pch = 19)
![](data:image/png;base64,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)
Creating a dataframe of the created dataset and running a linear SVM
#Turning y into a factor variable
dat <- data.frame(x, y = as.factor(y))
#Calling SVM function, y as response. Linear kernal. Cost parameter is 10
#We are not standardizing the variables
svm_fit <- svm(y~., data = dat, kernel = "linear", cost = 10, scale = FALSE)
print(svm_fit)
Call:
svm(formula = y ~ ., data = dat, kernel = "linear", cost = 10,
scale = FALSE)
Parameters:
SVM-Type: C-classification
SVM-Kernel: linear
cost: 10
Number of Support Vectors: 6
The above linear SVM fit has 6 support vectors (points on the boundary + on the wrong side of the boundary)
Plotting the svm fit. This is a simple plot, that shows the points, the regions and the SV points. But it flips the axis and is a little crude
![](data:image/png;base64,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)
Creating our own plot to display SVM results
- Create our own grid of values from X1 and X2 (columns of the data we created)
- Predict the class for each point
- Plot them color coded by the class to see the decision boundary
make_grid <- function(x, n = 75){
grange <- apply(x, 2, range)
x1 <- seq(from = grange[1,1], to = grange[2,1], length = n)
x2 <- seq(from = grange[1,2], to = grange[2,2], length = n)
expand.grid(X1 = x1, X2 = x2)
}
Plotting our prediction and datapoints
- Plot all the points on xgrid, then colour by the class so that we can clearly see the decision boundry
- Plot the original points on the decision boundry
- SVM fit object has an Index component that has the index of the support vectors, which we plot and highlight
plot(xgrid, col = c("red", "blue")[as.numeric(ygrid)], pch = 20, cex = .2)
points(x,col=y+3,pch=19)
points(x[svm_fit$index,],pch=5,cex=2)
![](data:image/png;base64,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)
The linear coefficients is not directly available in the SVM fit object, but can be derived from the components of the object. This coefficient makes sense for a linear kernel.
We extract the linear coefficients, and then using simple algebra, we include the decision boundary and the two margins.
- The SVM fit function has the “coefs” for the support vectors. (It is 0 for the other points as only the support vectors are instrumental in forming the hyperplane)
The formula is present in ESL
Replotting the points and using the coefficients to draw the decision boundaries
The equation is of the form - beta0 + beta1x1 + beta2x2 = 0
Figure out the slope and the intercept of the decision boundary above. abline uses the intercept and the slope
plot(xgrid,col=c("red","blue")[as.numeric(ygrid)],pch=20,cex=.2)
points(x,col=y+3,pch=19)
points(x[svm_fit$index,],pch=5,cex=2)
abline(beta0/beta[2],-beta[1]/beta[2])
abline((beta0-1)/beta[2],-beta[1]/beta[2],lty=2)
abline((beta0+1)/beta[2],-beta[1]/beta[2],lty=2)
![](data:image/png;base64,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)
We can use cross-validation to select the right cost
Non linear SVM Classifier
Taking example from ESL (mixture data, which is simulated), where the decision boundry was non-linear
names(ESL.mixture)
[1] "x" "y" "xnew" "prob" "marginal" "px1"
[7] "px2" "means"
Plotting the data and viewing the classes
![](data:image/png;base64,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)
There is a good amount of overlap in the data.
Creating a dataframe of the data and fitting a SVM with radial kernerl to it
print(radial_svm_fit)
Call:
svm(formula = factor(y) ~ ., data = dat, kernel = "radial",
cost = 5, scale = FALSE)
Parameters:
SVM-Type: C-classification
SVM-Kernel: radial
cost: 5
Number of Support Vectors: 103
Creating a grid such as before and making predictions on the grid. The ESL.mixture dataset comes with the grid as a component, and so we can use that directly. Else we will have to use the function created earlier.
xgrid <- expand.grid(X1=px1,X2=px2)
ygrid <- predict(radial_svm_fit, xgrid)
Plotting the grid and the predictions
![](data:image/png;base64,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)
The decision boundary is not linear.
Creating the actual decision boundary and plotting it using the contour function.
The ESL.mixture has a prob component, that gives the true probability of a +1 vs -1 at every value of the grid.
So, we will plot the contour at 0.5, which is the true decision boundary of the data. And the predict the decision boundary from our model (the function value itself and not the class output)
Plotting the above decision values
plot(xgrid,col=as.numeric(ygrid),pch=20,cex=.2)
points(x,col=y+1,pch=19)
contour(px1,px2,matrix(func,69,99),level=0,add=TRUE)
contour(px1,px2,matrix(prob,69,99),level=.5,add=TRUE,col="blue",lwd=2)
![](data:image/png;base64,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)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyNMaW5lYXIgU1ZNIENsYXNzaWZpZXINCg0KV2Ugd2lsbCB1c2UgdGhlIGUxMDcxIHBhY2thZ2UsIHRoYXQgY29udGFpbnMgdGhlIHN2bSBmdW5jdGlvbiB0byBydW4gb3VyIGNvZGVzDQoNCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoImUxMDcxIikNCnJlcXVpcmUoZTEwNzEpDQpgYGANCg0KDQpDcmVhdGluZyBhIGxvdyBkaW1lbnNpb25pb24gZGF0YXNldCwgYW5kIHJ1biBTVk0gY2xhc3NpZmllciBvbiBpdC4NClZhcmlhYmxlIHggLSAyMCBvYnNlcnZhdGlvbnMgYWNyb3NzIHR3byBjbGFzc2VzIChub3JtYWxseSBkaXN0cmlidXRlZCkNClZhcmlhYmxlIHkgLSAyMCB2YXJpYWJsZXMsIDEwIHdpdGggLTEgYW5kIDEwIHdpdGggKzENCmBgYHtyfQ0Kc2V0LnNlZWQoMTAxMTEpDQp4IDwtIG1hdHJpeChybm9ybSg0MCksIDIwLCAyKQ0KeSA8LSByZXAoYygtMSwxKSwgYygxMCwxMCkpDQoNCiNGb3IgdGhlIGluZGljZXMgd2hlcmUgeSA9IDEsIHdlIG1vdmUgdGhlIG1lYW5zIGZyb20gMCB0byAxIGZvciB0aGUgeA0KI1RoaXMgaXMgc28gdGhhdCB3ZSBjYW4gZ2V0IHRoZSBkYXRhc2V0IGEgbGl0dGxlIHNlcGFyYXRlZA0KeFt5PT0xLF0gPC0geFt5PT0xLF0gKyAxDQoNCnBsb3QoeCwgY29sID0geSArIDMsIHBjaCA9IDE5KQ0KYGBgDQoNCg0KQ3JlYXRpbmcgYSBkYXRhZnJhbWUgb2YgdGhlIGNyZWF0ZWQgZGF0YXNldCBhbmQgcnVubmluZyBhIGxpbmVhciBTVk0NCg0KYGBge3J9DQoNCiNUdXJuaW5nIHkgaW50byBhIGZhY3RvciB2YXJpYWJsZQ0KZGF0IDwtIGRhdGEuZnJhbWUoeCwgeSA9IGFzLmZhY3Rvcih5KSkNCg0KI0NhbGxpbmcgU1ZNIGZ1bmN0aW9uLCB5IGFzIHJlc3BvbnNlLiBMaW5lYXIga2VybmFsLiBDb3N0IHBhcmFtZXRlciBpcyAxMA0KI1dlIGFyZSBub3Qgc3RhbmRhcmRpemluZyB0aGUgdmFyaWFibGVzDQpzdm1fZml0IDwtIHN2bSh5fi4sIGRhdGEgPSBkYXQsIGtlcm5lbCA9ICJsaW5lYXIiLCBjb3N0ID0gMTAsIHNjYWxlID0gRkFMU0UpDQoNCnByaW50KHN2bV9maXQpDQpgYGANCg0KVGhlIGFib3ZlIGxpbmVhciBTVk0gZml0IGhhcyA2IHN1cHBvcnQgdmVjdG9ycyAocG9pbnRzIG9uIHRoZSBib3VuZGFyeSArIG9uIHRoZSB3cm9uZyBzaWRlIG9mIHRoZSBib3VuZGFyeSkNCg0KUGxvdHRpbmcgdGhlIHN2bSBmaXQuIFRoaXMgaXMgYSBzaW1wbGUgcGxvdCwgdGhhdCBzaG93cyB0aGUgcG9pbnRzLCB0aGUgcmVnaW9ucyBhbmQgdGhlIFNWIHBvaW50cy4gQnV0IGl0IGZsaXBzIHRoZSBheGlzIGFuZCBpcyBhIGxpdHRsZSBjcnVkZQ0KDQpgYGB7cn0NCnBsb3Qoc3ZtX2ZpdCwgZGF0KQ0KYGBgDQoNCi0tLQ0KDQpDcmVhdGluZyBvdXIgb3duIHBsb3QgdG8gZGlzcGxheSBTVk0gcmVzdWx0cw0KDQoxKSBDcmVhdGUgb3VyIG93biBncmlkIG9mIHZhbHVlcyBmcm9tIFgxIGFuZCBYMiAoY29sdW1ucyBvZiB0aGUgZGF0YSB3ZSBjcmVhdGVkKQ0KMikgUHJlZGljdCB0aGUgY2xhc3MgZm9yIGVhY2ggcG9pbnQNCjMpIFBsb3QgdGhlbSBjb2xvciBjb2RlZCBieSB0aGUgY2xhc3MgdG8gc2VlIHRoZSBkZWNpc2lvbiBib3VuZGFyeQ0KDQpgYGB7cn0NCiNGdW5jdGlvbiBjcmVhdGluZyBhIGdyaWQsIHdpdGggbnVtYmVyIG9mIHBvaW50cyBpbiBlYWNoIGRpcmVjdGlvbg0KbWFrZV9ncmlkIDwtIGZ1bmN0aW9uKHgsIG4gPSA3NSl7DQogIGdyYW5nZSA8LSBhcHBseSh4LCAyLCByYW5nZSkNCiAgeDEgPC0gc2VxKGZyb20gPSBncmFuZ2VbMSwxXSwgdG8gPSBncmFuZ2VbMiwxXSwgbGVuZ3RoID0gbikNCiAgeDIgPC0gc2VxKGZyb20gPSBncmFuZ2VbMSwyXSwgdG8gPSBncmFuZ2VbMiwyXSwgbGVuZ3RoID0gbikNCiAgZXhwYW5kLmdyaWQoWDEgPSB4MSwgWDIgPSB4MikNCn0NCg0KeGdyaWQgPC0gbWFrZV9ncmlkKHgpDQp5Z3JpZCA8LSBwcmVkaWN0KHN2bV9maXQsIHhncmlkKQ0KDQpgYGANCg0KDQpQbG90dGluZyBvdXIgcHJlZGljdGlvbiBhbmQgZGF0YXBvaW50cw0KDQoxKSBQbG90IGFsbCB0aGUgcG9pbnRzIG9uIHhncmlkLCB0aGVuIGNvbG91ciBieSB0aGUgY2xhc3Mgc28gdGhhdCB3ZSBjYW4gY2xlYXJseSBzZWUgdGhlIGRlY2lzaW9uIGJvdW5kcnkNCjIpIFBsb3QgdGhlIG9yaWdpbmFsIHBvaW50cyBvbiB0aGUgZGVjaXNpb24gYm91bmRyeQ0KMykgU1ZNIGZpdCBvYmplY3QgaGFzIGFuIEluZGV4IGNvbXBvbmVudCB0aGF0IGhhcyB0aGUgaW5kZXggb2YgdGhlIHN1cHBvcnQgdmVjdG9ycywgd2hpY2ggd2UgcGxvdCBhbmQgaGlnaGxpZ2h0DQoNCmBgYHtyfQ0KcGxvdCh4Z3JpZCwgY29sID0gYygicmVkIiwgImJsdWUiKVthcy5udW1lcmljKHlncmlkKV0sIHBjaCA9IDIwLCBjZXggPSAuMikNCnBvaW50cyh4LGNvbD15KzMscGNoPTE5KQ0KcG9pbnRzKHhbc3ZtX2ZpdCRpbmRleCxdLHBjaD01LGNleD0yKQ0KDQpgYGANCg0KLS0tDQoNClRoZSBsaW5lYXIgY29lZmZpY2llbnRzIGlzIG5vdCBkaXJlY3RseSBhdmFpbGFibGUgaW4gdGhlIFNWTSBmaXQgb2JqZWN0LCBidXQgY2FuIGJlIGRlcml2ZWQgZnJvbSB0aGUgY29tcG9uZW50cyBvZiB0aGUgb2JqZWN0LiBUaGlzIGNvZWZmaWNpZW50IG1ha2VzIHNlbnNlIGZvciBhIGxpbmVhciBrZXJuZWwuDQoNCldlIGV4dHJhY3QgdGhlIGxpbmVhciBjb2VmZmljaWVudHMsIGFuZCB0aGVuIHVzaW5nIHNpbXBsZSBhbGdlYnJhLCB3ZSBpbmNsdWRlIHRoZSBkZWNpc2lvbiBib3VuZGFyeSBhbmQgdGhlIHR3byBtYXJnaW5zLg0KDQoxKSBUaGUgU1ZNIGZpdCBmdW5jdGlvbiBoYXMgdGhlICJjb2VmcyIgZm9yIHRoZSBzdXBwb3J0IHZlY3RvcnMuIChJdCBpcyAwIGZvciB0aGUgb3RoZXIgcG9pbnRzIGFzIG9ubHkgdGhlIHN1cHBvcnQgdmVjdG9ycyBhcmUgaW5zdHJ1bWVudGFsIGluIGZvcm1pbmcgdGhlIGh5cGVycGxhbmUpDQoNClRoZSBmb3JtdWxhIGlzIHByZXNlbnQgaW4gRVNMDQpgYGB7cn0NCmJldGEgPC0gZHJvcCh0KHN2bV9maXQkY29lZnMpICUqJSB4W3N2bV9maXQkaW5kZXgsXSkNCmJldGEwIDwtIHN2bV9maXQkcmhvDQpgYGANCg0KDQpSZXBsb3R0aW5nIHRoZSBwb2ludHMgYW5kIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgdG8gZHJhdyB0aGUgZGVjaXNpb24gYm91bmRhcmllcw0KDQpUaGUgZXF1YXRpb24gaXMgb2YgdGhlIGZvcm0gLQ0KYmV0YTAgKyBiZXRhMSp4MSArIGJldGEyKngyID0gMA0KDQpGaWd1cmUgb3V0IHRoZSBzbG9wZSBhbmQgdGhlIGludGVyY2VwdCBvZiB0aGUgZGVjaXNpb24gYm91bmRhcnkgYWJvdmUuIGFibGluZSB1c2VzIHRoZSBpbnRlcmNlcHQgYW5kIHRoZSBzbG9wZQ0KDQpgYGB7cn0NCnBsb3QoeGdyaWQsY29sPWMoInJlZCIsImJsdWUiKVthcy5udW1lcmljKHlncmlkKV0scGNoPTIwLGNleD0uMikNCnBvaW50cyh4LGNvbD15KzMscGNoPTE5KQ0KcG9pbnRzKHhbc3ZtX2ZpdCRpbmRleCxdLHBjaD01LGNleD0yKQ0KYWJsaW5lKGJldGEwL2JldGFbMl0sLWJldGFbMV0vYmV0YVsyXSkNCmFibGluZSgoYmV0YTAtMSkvYmV0YVsyXSwtYmV0YVsxXS9iZXRhWzJdLGx0eT0yKQ0KYWJsaW5lKChiZXRhMCsxKS9iZXRhWzJdLC1iZXRhWzFdL2JldGFbMl0sbHR5PTIpDQoNCmBgYA0KDQoNCldlIGNhbiB1c2UgY3Jvc3MtdmFsaWRhdGlvbiB0byBzZWxlY3QgdGhlIHJpZ2h0IGNvc3QNCg0KLS0tDQoNCiMjI05vbiBsaW5lYXIgU1ZNIENsYXNzaWZpZXINCg0KVGFraW5nIGV4YW1wbGUgZnJvbSBFU0wgKG1peHR1cmUgZGF0YSwgd2hpY2ggaXMgc2ltdWxhdGVkKSwgd2hlcmUgdGhlIGRlY2lzaW9uIGJvdW5kcnkgd2FzIG5vbi1saW5lYXINCg0KYGBge3J9DQpsb2FkKHVybCgiaHR0cDovL3d3dy5zdGFuZm9yZC5lZHUvfmhhc3RpZS9FbGVtU3RhdExlYXJuL2RhdGFzZXRzL0VTTC5taXh0dXJlLnJkYSIpKQ0KbmFtZXMoRVNMLm1peHR1cmUpDQphdHRhY2goRVNMLm1peHR1cmUpDQpgYGANCg0KUGxvdHRpbmcgdGhlIGRhdGEgYW5kIHZpZXdpbmcgdGhlIGNsYXNzZXMNCg0KYGBge3J9DQpwbG90KHgsIGNvbCA9IHkgKyAxKQ0KYGBgDQoNClRoZXJlIGlzIGEgZ29vZCBhbW91bnQgb2Ygb3ZlcmxhcCBpbiB0aGUgZGF0YS4NCg0KQ3JlYXRpbmcgYSBkYXRhZnJhbWUgb2YgdGhlIGRhdGEgYW5kIGZpdHRpbmcgYSBTVk0gd2l0aCByYWRpYWwga2VybmVybCB0byBpdA0KDQpgYGB7cn0NCmRhdCA8LSBkYXRhLmZyYW1lKHkgPSBmYWN0b3IoeSksIHgpDQpyYWRpYWxfc3ZtX2ZpdCA8LSBzdm0oZmFjdG9yKHkpfi4sIGRhdGEgPSBkYXQsIHNjYWxlID0gRkFMU0UsIGtlcm5lbCA9ICJyYWRpYWwiLCBjb3N0ID0gNSkNCnByaW50KHJhZGlhbF9zdm1fZml0KQ0KYGBgDQoNCkNyZWF0aW5nIGEgZ3JpZCBzdWNoIGFzIGJlZm9yZSBhbmQgbWFraW5nIHByZWRpY3Rpb25zIG9uIHRoZSBncmlkLg0KVGhlIEVTTC5taXh0dXJlIGRhdGFzZXQgY29tZXMgd2l0aCB0aGUgZ3JpZCBhcyBhIGNvbXBvbmVudCwgYW5kIHNvIHdlIGNhbiB1c2UgdGhhdCBkaXJlY3RseS4gRWxzZSB3ZSB3aWxsIGhhdmUgdG8gdXNlIHRoZSBmdW5jdGlvbiBjcmVhdGVkIGVhcmxpZXIuDQpgYGB7cn0NCnhncmlkIDwtIGV4cGFuZC5ncmlkKFgxPXB4MSxYMj1weDIpDQp5Z3JpZCA8LSBwcmVkaWN0KHJhZGlhbF9zdm1fZml0LCB4Z3JpZCkNCmBgYA0KDQpQbG90dGluZyB0aGUgZ3JpZCBhbmQgdGhlIHByZWRpY3Rpb25zDQoNCmBgYHtyfQ0KcGxvdCh4Z3JpZCwgY29sID0gYXMubnVtZXJpYyh5Z3JpZCksIHBjaCA9IDIwLCBjZXggPSAuMikNCnBvaW50cyh4LCBjb2wgPSB5KzEsIHBjaCA9IDE5KQ0KYGBgDQoNClRoZSBkZWNpc2lvbiBib3VuZGFyeSBpcyBub3QgbGluZWFyLg0KDQpDcmVhdGluZyB0aGUgYWN0dWFsIGRlY2lzaW9uIGJvdW5kYXJ5IGFuZCBwbG90dGluZyBpdCB1c2luZyB0aGUgY29udG91ciBmdW5jdGlvbi4NCg0KVGhlIEVTTC5taXh0dXJlIGhhcyBhIHByb2IgY29tcG9uZW50LCB0aGF0IGdpdmVzIHRoZSB0cnVlIHByb2JhYmlsaXR5IG9mIGEgKzEgdnMgLTEgYXQgZXZlcnkgdmFsdWUgb2YgdGhlIGdyaWQuDQoNClNvLCB3ZSB3aWxsIHBsb3QgdGhlIGNvbnRvdXIgYXQgMC41LCB3aGljaCBpcyB0aGUgdHJ1ZSBkZWNpc2lvbiBib3VuZGFyeSBvZiB0aGUgZGF0YS4gQW5kIHRoZSBwcmVkaWN0IHRoZSBkZWNpc2lvbiBib3VuZGFyeSBmcm9tIG91ciBtb2RlbCAodGhlIGZ1bmN0aW9uIHZhbHVlIGl0c2VsZiBhbmQgbm90IHRoZSBjbGFzcyBvdXRwdXQpDQoNCmBgYHtyfQ0KI1ByZWRpY3RpbmcgZml0IG9uIHRoZSBncmlkLiBEZWNpc2lvbiB2YWx1ZXMgPSBUIGJlY2F1c2Ugd2UgbmVlZCB0aGUgdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGFuZCBub3QganVzdCB0aGUgY2xhc3NpZmljYXRpb24NCmZ1bmMgPC0gcHJlZGljdChyYWRpYWxfc3ZtX2ZpdCwgeGdyaWQsIGRlY2lzaW9uLnZhbHVlcyA9IFRSVUUpDQoNCiNUaGlzIHJldHVybnMgYW4gYXR0cmlidXRlIGFuZCB3ZSBuZWVkIHRvIHB1bGwgb2YgdGhhdA0KZnVuYyA8LSBhdHRyaWJ1dGVzKGZ1bmMpJGRlY2lzaW9uDQoNCmBgYA0KDQoNClBsb3R0aW5nIHRoZSBhYm92ZSBkZWNpc2lvbiB2YWx1ZXMNCg0KYGBge3J9DQpwbG90KHhncmlkLGNvbD1hcy5udW1lcmljKHlncmlkKSxwY2g9MjAsY2V4PS4yKQ0KcG9pbnRzKHgsY29sPXkrMSxwY2g9MTkpDQoNCg0KY29udG91cihweDEscHgyLG1hdHJpeChmdW5jLDY5LDk5KSxsZXZlbD0wLGFkZD1UUlVFKQ0KI0FkZGluZyB0aGUgdHJ1dGgsIHVzaW5nIHRoZSAwLjUgY29udG91cg0KY29udG91cihweDEscHgyLG1hdHJpeChwcm9iLDY5LDk5KSxsZXZlbD0uNSxhZGQ9VFJVRSxjb2w9ImJsdWUiLGx3ZD0yKQ0KYGBgDQoNCi0tLQ==