2014-02-17 3 views
5

e1071을 사용하여 R에 SVM을 설정했습니다. 불행히도 마진과 다이 초평면의 플롯은 원하는대로 보이지 않습니다. 나는 마진이 지원 벡터를 통과하기를 원했다. 이럴 수 있니? 아무도 내 실수를 감지 할 수 있습니까?지원 벡터 머신을위한 플롯 여백

rm(list=ls(all=TRUE)) 

x1s <- c(.5,1,1,2,3,3.5,  1,3.5,4,5,5.5,6) 
x2s <- c(3.5,1,2.5,2,1,1.2, 5.8,3,4,5,4,1) 
ys <- c(rep(+1,6),   rep(-1,6)) 
my.data <- data.frame(x1=x1s, x2=x2s, type=as.factor(ys)) 
my.data 

library('e1071') 
svm.model <- svm(type ~ ., data=my.data, type='C-classification', kernel='linear',scale=FALSE) 

plot(my.data[,-3],col=(ys+3)/2, pch=19, xlim=c(-1,6), ylim=c(-1,6)) 
points(my.data[svm.model$index,c(1,2)],col="blue",cex=2) 

w <- t(svm.model$coefs) %*% svm.model$SV 
b <- -svm.model$rho 
p <- svm.model$SV 

abline(a=-b/w[1,2], b=-w[1,1]/w[1,2], col="black", lty=1) 
abline(a=--b/p[1,2], b=-w[1,1]/w[1,2], col="orange", lty=3) 
abline(a=--b/p[3,2], b=-w[1,1]/w[1,2], col="orange", lty=3) 

답변

6

귀하의 마지막이 명령은 또 다른 방법

abline(a=(-b-1)/w[1,2], b=-w[1,1]/w[1,2], col="orange", lty=3) 
abline(a=(-b+1)/w[1,2], b=-w[1,1]/w[1,2], col="orange", lty=3) 

해야

plot(my.data[,-3],col=(ys+3)/2, pch=19, xlim=c(-1,6), ylim=c(-1,6)) 
points(my.data[svm.model$index,c(1,2)],col="blue",cex=2) 

x1min = min(x1s); x1max = max(x1s); 
x2min = min(x2s); x2max = max(x2s); 

coef1 = sum(svm.model$coefs*x1s[svm.model$index]); 
coef2 = sum(svm.model$coefs*x2s[svm.model$index]); 
lines(c(x1min,x1max), (svm.model$rho-coef1*c(x1min, x1max))/coef2) 
lines(c(x1min,x1max), (svm.model$rho+1-coef1*c(x1min, x1max))/coef2, lty=2) 
lines(c(x1min,x1max), (svm.model$rho-1-coef1*c(x1min, x1max))/coef2, lty=2) 
+0

보기이 페이지 https://class.stanford.edu : 여기

내 코드입니다 /c4x/HumanitiesScience/StatLearning/asset/ch9.html –

+0

우수! 고마워요! –