cost에 따른 SVM margin 비교하기
library(e1071)
set.seed(10111)
x = matrix(rnorm(40), 20, 2)
y = rep(c(-1, 1), c(10, 10))
x[y == 1, ] = x[y == 1, ] + 1
plot(x, col = y + 3, pch = 19)

dat = data.frame(x, y = as.factor(y))
그리드 만들기
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)
}
xgrid = make.grid(x)
svm의 index를 이용해서 그림그리기
svmfit_cost100 = svm(y ~ ., data = dat, kernel = "linear", cost = 100, scale = FALSE)
ygrid = predict(svmfit_cost100, xgrid)
beta = drop(t(svmfit_cost100$coefs) %*% x[svmfit_cost10$index, ])
beta0 = svmfit_cost100$rho
plot(xgrid, col = c("red", "blue")[as.numeric(ygrid)], pch = 20, cex = 0.2, main="SVM with cost = 100")
points(x, col = y + 3, pch = 19)
points(x[svmfit_cost10$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)

svmfit_cost10 = svm(y ~ ., data = dat, kernel = "linear", cost = 10, scale = FALSE)
ygrid = predict(svmfit_cost10, xgrid)
beta = drop(t(svmfit_cost10$coefs) %*% x[svmfit_cost10$index, ])
beta0 = svmfit_cost10$rho
plot(xgrid, col = c("red", "blue")[as.numeric(ygrid)], pch = 20, cex = 0.2, main="SVM with cost = 10")
points(x, col = y + 3, pch = 19)
points(x[svmfit_cost10$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)

svmfit_cost1 = svm(y ~ ., data = dat, kernel = "linear", cost = 1, scale = FALSE)
ygrid = predict(svmfit_cost1, xgrid)
beta = drop(t(svmfit_cost1$coefs) %*% x[svmfit_cost1$index, ])
beta0 = svmfit_cost1$rho
plot(xgrid, col = c("red", "blue")[as.numeric(ygrid)], pch = 20, cex = 0.2, main="SVM with cost = 1")
points(x, col = y + 3, pch = 19)
points(x[svmfit_cost10$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)

svmfit_cost01 = svm(y ~ ., data = dat, kernel = "linear", cost = 0.1, scale = FALSE)
ygrid = predict(svmfit_cost01, xgrid)
beta = drop(t(svmfit_cost01$coefs) %*% x[svmfit_cost01$index, ])
beta0 = svmfit_cost01$rho
plot(xgrid, col = c("red", "blue")[as.numeric(ygrid)], pch = 20, cex = 0.2, main="SVM with cost = 0.1")
points(x, col = y + 3, pch = 19)
points(x[svmfit_cost10$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)

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgd29yZF9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQojIGNvc3Tsl5Ag65Sw66W4IFNWTSBtYXJnaW4g67mE6rWQ7ZWY6riwDQpgYGB7cn0NCmxpYnJhcnkoZTEwNzEpDQpzZXQuc2VlZCgxMDExMSkNCnggPSBtYXRyaXgocm5vcm0oNDApLCAyMCwgMikNCnkgPSByZXAoYygtMSwgMSksIGMoMTAsIDEwKSkNCnhbeSA9PSAxLCBdID0geFt5ID09IDEsIF0gKyAxDQpwbG90KHgsIGNvbCA9IHkgKyAzLCBwY2ggPSAxOSkNCmRhdCA9IGRhdGEuZnJhbWUoeCwgeSA9IGFzLmZhY3Rvcih5KSkNCmBgYA0KDQrqt7jrpqzrk5wg66eM65Ok6riwDQpgYGB7cn0NCm1ha2UuZ3JpZCA9IGZ1bmN0aW9uKHgsIG4gPSA3NSkgew0KICAgIGdyYW5nZSA9IGFwcGx5KHgsIDIsIHJhbmdlKQ0KICAgIHgxID0gc2VxKGZyb20gPSBncmFuZ2VbMSwgMV0sIHRvID0gZ3JhbmdlWzIsIDFdLCBsZW5ndGggPSBuKQ0KICAgIHgyID0gc2VxKGZyb20gPSBncmFuZ2VbMSwgMl0sIHRvID0gZ3JhbmdlWzIsIDJdLCBsZW5ndGggPSBuKQ0KICAgIGV4cGFuZC5ncmlkKFgxID0geDEsIFgyID0geDIpDQp9DQp4Z3JpZCA9IG1ha2UuZ3JpZCh4KQ0KYGBgDQoNCnN2beydmCBpbmRleOulvCDsnbTsmqntlbTshJwg6re466a86re466as6riwDQoNCmBgYHtyfQ0Kc3ZtZml0X2Nvc3QxMDAgPSBzdm0oeSB+IC4sIGRhdGEgPSBkYXQsIGtlcm5lbCA9ICJsaW5lYXIiLCBjb3N0ID0gMTAwLCBzY2FsZSA9IEZBTFNFKQ0KeWdyaWQgPSBwcmVkaWN0KHN2bWZpdF9jb3N0MTAwLCB4Z3JpZCkNCg0KYmV0YSA9IGRyb3AodChzdm1maXRfY29zdDEwMCRjb2VmcykgJSolIHhbc3ZtZml0X2Nvc3QxMCRpbmRleCwgXSkNCmJldGEwID0gc3ZtZml0X2Nvc3QxMDAkcmhvDQpwbG90KHhncmlkLCBjb2wgPSBjKCJyZWQiLCAiYmx1ZSIpW2FzLm51bWVyaWMoeWdyaWQpXSwgcGNoID0gMjAsIGNleCA9IDAuMiwgbWFpbj0iU1ZNIHdpdGggY29zdCA9IDEwMCIpDQpwb2ludHMoeCwgY29sID0geSArIDMsIHBjaCA9IDE5KQ0KcG9pbnRzKHhbc3ZtZml0X2Nvc3QxMCRpbmRleCwgXSwgcGNoID0gNSwgY2V4ID0gMikNCmFibGluZShiZXRhMC9iZXRhWzJdLCAtYmV0YVsxXS9iZXRhWzJdKQ0KYWJsaW5lKChiZXRhMCAtIDEpL2JldGFbMl0sIC1iZXRhWzFdL2JldGFbMl0sIGx0eSA9IDIpDQphYmxpbmUoKGJldGEwICsgMSkvYmV0YVsyXSwgLWJldGFbMV0vYmV0YVsyXSwgbHR5ID0gMikNCmBgYA0KDQoNCmBgYHtyfQ0Kc3ZtZml0X2Nvc3QxMCA9IHN2bSh5IH4gLiwgZGF0YSA9IGRhdCwga2VybmVsID0gImxpbmVhciIsIGNvc3QgPSAxMCwgc2NhbGUgPSBGQUxTRSkNCnlncmlkID0gcHJlZGljdChzdm1maXRfY29zdDEwLCB4Z3JpZCkNCg0KYmV0YSA9IGRyb3AodChzdm1maXRfY29zdDEwJGNvZWZzKSAlKiUgeFtzdm1maXRfY29zdDEwJGluZGV4LCBdKQ0KYmV0YTAgPSBzdm1maXRfY29zdDEwJHJobw0KcGxvdCh4Z3JpZCwgY29sID0gYygicmVkIiwgImJsdWUiKVthcy5udW1lcmljKHlncmlkKV0sIHBjaCA9IDIwLCBjZXggPSAwLjIsIG1haW49IlNWTSB3aXRoIGNvc3QgPSAxMCIpDQpwb2ludHMoeCwgY29sID0geSArIDMsIHBjaCA9IDE5KQ0KcG9pbnRzKHhbc3ZtZml0X2Nvc3QxMCRpbmRleCwgXSwgcGNoID0gNSwgY2V4ID0gMikNCmFibGluZShiZXRhMC9iZXRhWzJdLCAtYmV0YVsxXS9iZXRhWzJdKQ0KYWJsaW5lKChiZXRhMCAtIDEpL2JldGFbMl0sIC1iZXRhWzFdL2JldGFbMl0sIGx0eSA9IDIpDQphYmxpbmUoKGJldGEwICsgMSkvYmV0YVsyXSwgLWJldGFbMV0vYmV0YVsyXSwgbHR5ID0gMikNCmBgYA0KDQoNCmBgYHtyfQ0Kc3ZtZml0X2Nvc3QxID0gc3ZtKHkgfiAuLCBkYXRhID0gZGF0LCBrZXJuZWwgPSAibGluZWFyIiwgY29zdCA9IDEsIHNjYWxlID0gRkFMU0UpDQp5Z3JpZCA9IHByZWRpY3Qoc3ZtZml0X2Nvc3QxLCB4Z3JpZCkNCg0KYmV0YSA9IGRyb3AodChzdm1maXRfY29zdDEkY29lZnMpICUqJSB4W3N2bWZpdF9jb3N0MSRpbmRleCwgXSkNCmJldGEwID0gc3ZtZml0X2Nvc3QxJHJobw0KcGxvdCh4Z3JpZCwgY29sID0gYygicmVkIiwgImJsdWUiKVthcy5udW1lcmljKHlncmlkKV0sIHBjaCA9IDIwLCBjZXggPSAwLjIsIG1haW49IlNWTSB3aXRoIGNvc3QgPSAxIikNCnBvaW50cyh4LCBjb2wgPSB5ICsgMywgcGNoID0gMTkpDQpwb2ludHMoeFtzdm1maXRfY29zdDEwJGluZGV4LCBdLCBwY2ggPSA1LCBjZXggPSAyKQ0KYWJsaW5lKGJldGEwL2JldGFbMl0sIC1iZXRhWzFdL2JldGFbMl0pDQphYmxpbmUoKGJldGEwIC0gMSkvYmV0YVsyXSwgLWJldGFbMV0vYmV0YVsyXSwgbHR5ID0gMikNCmFibGluZSgoYmV0YTAgKyAxKS9iZXRhWzJdLCAtYmV0YVsxXS9iZXRhWzJdLCBsdHkgPSAyKQ0KDQpgYGANCg0KDQpgYGB7cn0NCnN2bWZpdF9jb3N0MDEgPSBzdm0oeSB+IC4sIGRhdGEgPSBkYXQsIGtlcm5lbCA9ICJsaW5lYXIiLCBjb3N0ID0gMC4xLCBzY2FsZSA9IEZBTFNFKQ0KeWdyaWQgPSBwcmVkaWN0KHN2bWZpdF9jb3N0MDEsIHhncmlkKQ0KDQpiZXRhID0gZHJvcCh0KHN2bWZpdF9jb3N0MDEkY29lZnMpICUqJSB4W3N2bWZpdF9jb3N0MDEkaW5kZXgsIF0pDQpiZXRhMCA9IHN2bWZpdF9jb3N0MDEkcmhvDQpwbG90KHhncmlkLCBjb2wgPSBjKCJyZWQiLCAiYmx1ZSIpW2FzLm51bWVyaWMoeWdyaWQpXSwgcGNoID0gMjAsIGNleCA9IDAuMiwgbWFpbj0iU1ZNIHdpdGggY29zdCA9IDAuMSIpDQpwb2ludHMoeCwgY29sID0geSArIDMsIHBjaCA9IDE5KQ0KcG9pbnRzKHhbc3ZtZml0X2Nvc3QxMCRpbmRleCwgXSwgcGNoID0gNSwgY2V4ID0gMikNCmFibGluZShiZXRhMC9iZXRhWzJdLCAtYmV0YVsxXS9iZXRhWzJdKQ0KYWJsaW5lKChiZXRhMCAtIDEpL2JldGFbMl0sIC1iZXRhWzFdL2JldGFbMl0sIGx0eSA9IDIpDQphYmxpbmUoKGJldGEwICsgMSkvYmV0YVsyXSwgLWJldGFbMV0vYmV0YVsyXSwgbHR5ID0gMikNCmBgYA0KDQo=