두 개의 겹치는 클래스, 각 클래스의 7 점, 2 차원 공간에있는 데이터 세트가 있습니다. R에서는 패키지 svm
에서 실행 e1071
하여 이러한 클래스에 대한 분리 초평면을 작성합니다. 다음 명령을 사용하고 있습니다.
svm(x, y, scale = FALSE, type = 'C-classification', kernel = 'linear', cost = 50000)
여기서 x
내 데이터 요소와 y
레이블이 포함되어 있습니다. 이 명령은 svm 객체를 반환합니다.이 객체 는 분리 초평면의 매개 변수 (정규 벡터) 및 (절편) 를 계산하는 데 사용됩니다 .b
아래 그림 (a)는 내 요점과 svm
명령에 의해 반환 된 초평면을 보여줍니다 (이 초평면을 최적의 것으로 부르겠습니다). 기호 O가있는 파란색 점은 공간 원점을 나타내고, 점선은 여백을 나타내고, 원은 0이 아닌 (느슨한 변수) 를 갖는 점입니다 .
그림 (b)는 또 다른 초평면을 보여 주며, 이는 최적의 1을 5로 병렬 변환 한 것이다 (b_new = b_optimal-5). 이 초평면에 대해 목적 함수 (C- 분류 svm으로 최소화 됨)가 그림에 표시된 최적 초평면보다 값이 낮다는 것을 ( ㅏ). 이 기능에 문제가있는 것 같 습니까? 아니면 어딘가에 실수를 했습니까?
svm
아래는이 실험에서 사용한 R 코드입니다.
library(e1071)
get_obj_func_info <- function(w, b, c_par, x, y) {
xi <- rep(0, nrow(x))
for (i in 1:nrow(x)) {
xi[i] <- 1 - as.numeric(as.character(y[i]))*(sum(w*x[i,]) + b)
if (xi[i] < 0) xi[i] <- 0
}
return(list(obj_func_value = 0.5*sqrt(sum(w * w)) + c_par*sum(xi),
sum_xi = sum(xi), xi = xi))
}
x <- structure(c(41.8226593092589, 56.1773406907411, 63.3546813814822,
66.4912298720281, 72.1002963174962, 77.649309469458, 29.0963054665561,
38.6260575252066, 44.2351239706747, 53.7648760293253, 31.5087701279719,
24.3314294372308, 21.9189647758150, 68.9036945334439, 26.2543850639859,
43.7456149360141, 52.4912298720281, 20.6453186185178, 45.313889181287,
29.7830021158501, 33.0396571934088, 17.9008386892901, 42.5694092520593,
27.4305907479407, 49.3546813814822, 40.6090664454681, 24.2940422573947,
36.9603428065912), .Dim = c(14L, 2L))
y <- structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L,
1L), .Label = c("-1", "1"), class = "factor")
a <- svm(x, y, scale = FALSE, type = 'C-classification', kernel = 'linear', cost = 50000)
w <- t(a$coefs) %*% a$SV;
b <- -a$rho;
obj_func_str1 <- get_obj_func_info(w, b, 50000, x, y)
obj_func_str2 <- get_obj_func_info(w, b - 5, 50000, x, y)