Tengo un conjunto de datos con dos clases superpuestas, siete puntos en cada clase, los puntos están en un espacio bidimensional. En R, y estoy ejecutando svm
de la e1071
para construir un hiperplano de separación para estas clases. Estoy usando el siguiente comando:
svm(x, y, scale = FALSE, type = 'C-classification', kernel = 'linear', cost = 50000)
donde x
contiene mis puntos de datos y y
contiene sus etiquetas. El comando devuelve un objeto svm, que utilizo para calcular los parámetros $w$ (vector normal) y $b$ (intercepción) del hiperplano de separación.
La figura (a) muestra mis puntos y el hiperplano devuelto por el svm
(llamemos a este hiperplano el óptimo). El punto azul con el símbolo O muestra el origen del espacio, las líneas punteadas muestran el margen, los círculos son los puntos que tienen $\xi$ (variables de holgura).
La figura (b) muestra otro hiperplano, que es una traslación paralela del óptimo en 5 (b_nuevo = b_óptimo - 5). No es difícil ver que para este hiperplano la función objetivo $$ 0.5||w||^2 + cost \sum \xi_i $$ (que es minimizado por la clasificación C svm) tendrá un valor menor que para el hiperplano óptimo mostrado en la figura (a). Entonces, ¿parece que hay un problema con este svm
¿función? ¿O he cometido un error en alguna parte?
A continuación se muestra el código R que he utilizado en este experimento.
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)