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 corriendo svm
desde el e1071
paquete 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 uso para calcular los parámetros (vector normal) (intercepción) del hiperplano de separación.b
La figura (a) a continuación muestra mis puntos y el hiperplano devuelto por el svm
comando (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, encerrados en un círculo son puntos que no son cero (variables de holgura).
La Figura (b) muestra otro hiperplano, que es una traducción paralela del óptimo por 5 (b_new = b_optimal - 5). No es difícil ver que para este hiperplano la función objetivo (que se minimiza mediante la clasificación C svm) tendrá un valor menor que para el hiperplano óptimo que se muestra en la figura ( un). Entonces, ¿parece que hay un problema con esta función? ¿O cometí un error en alguna parte?
svm
A continuación se muestra el código R que utilicé 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)