Optimización de una máquina de vectores de soporte con programación cuadrática

12

Estoy tratando de entender el proceso para entrenar una máquina de vectores de soporte lineal . Me doy cuenta de que las propiedades de los SMV permiten que se optimicen mucho más rápido que mediante el uso de un solucionador de programación cuadrática, pero con fines de aprendizaje, me gustaría ver cómo funciona esto.

Datos de entrenamiento

set.seed(2015)
df <- data.frame(X1=c(rnorm(5), rnorm(5)+5), X2=c(rnorm(5), rnorm(5)+3), Y=c(rep(1,5), rep(-1, 5)))
df
           X1       X2  Y
1  -1.5454484  0.50127  1
2  -0.5283932 -0.80316  1
3  -1.0867588  0.63644  1
4  -0.0001115  1.14290  1
5   0.3889538  0.06119  1
6   5.5326313  3.68034 -1
7   3.1624283  2.71982 -1
8   5.6505985  3.18633 -1
9   4.3757546  1.78240 -1
10  5.8915550  1.66511 -1

library(ggplot2)
ggplot(df, aes(x=X1, y=X2, color=as.factor(Y)))+geom_point()

ingrese la descripción de la imagen aquí

Encontrar el hiperplano de margen máximo

De acuerdo con este artículo de Wikipedia sobre SVM , para encontrar el hiperplano de margen máximo que necesito resolver

argmin(w,b)12w2
sujeto a (para cualquier i = 1, ..., n)
yi(wxib)1.

¿Cómo 'conecto' mis datos de muestra a un solucionador de QP en R (por ejemplo, quadprog ) para determinar ?w

Ben
fuente
Tienes que resolver el problema dual
2
@fcop puedes elaborar? ¿Cuál es el dual en este caso? ¿Cómo lo resuelvo usando R? etc.
Ben

Respuestas:

6

SUGERENCIA :

Quadprog resuelve lo siguiente:

minXreTX+1/ /2XTreXtal que UNATXX0 0

Considere

X=(wsi)re=(yo0 00 00 0)

donde es la matriz de identidad.yo

Si es e es :wpag×1ynorte×1

X:(2pag+1)×1re:(2pag+1)×(2pag+1)

En líneas similares:

X0 0=(11)norte×1

Formule usando las sugerencias anteriores para representar su restricción de desigualdad.UNA

derechos
fuente
1
Estoy perdido. ¿Qué es ? reT
Ben
1
¿Cuál es el coeficiente de en su función objetivo? No pero ? wEl |El |wEl |El |22w
Rightskewed el
1
Agradezco la ayuda. Yo pensaba que me di cuenta de esto, pero cuando me puse D = la matriz que sugiero quadprogdevuelve el error "matriz D en función cuadrática no es definida positiva!"
Ben
3
HACK: Perturb agregando un pequeño valor, digamos en la diagonalre1mi-6 6
derechos de autor
7

Siguiendo los consejos de rightskewed ...

library(quadprog)

# min(−dvec^T b + 1/2 b^T Dmat b) with the constraints Amat^T b >= bvec)
Dmat       <- matrix(rep(0, 3*3), nrow=3, ncol=3)
diag(Dmat) <- 1
Dmat[nrow(Dmat), ncol(Dmat)] <- .0000001
dvec       <- rep(0, 3)
Amat       <- as.matrix(df[, c("X1", "X2")])
Amat <- cbind(Amat, b=rep(-1, 10))
Amat <- Amat * df$Y
bvec       <- rep(1, 10)
solve.QP(Dmat,dvec,t(Amat),bvec=bvec)

plotMargin <- function(w = 1*c(-1, 1), b = 1){
  x1 = seq(-20, 20, by = .01)
  x2 = (-w[1]*x1 + b)/w[2]
  l1 = (-w[1]*x1 + b + 1)/w[2]
  l2 = (-w[1]*x1 + b - 1)/w[2]
  dt <- data.table(X1=x1, X2=x2, L1=l1, L2=l2)
  ggplot(dt)+geom_line(aes(x=X1, y=X2))+geom_line(aes(x=X1, y=L1), color="blue")+geom_line(aes(x=X1, y=L2), color="green")+
    geom_hline(yintercept=0, color="red")+geom_vline(xintercept=0, color="red")+xlim(-5, 5)+ylim(-5, 5)+
    labs(title=paste0("w=(", w[1], ",", w[2], "), b=", b))
}

plotMargin(w=c(-0.5065, -0.2525), b=-1.2886)+geom_point(data=df, aes(x=X1, y=X2, color=as.factor(Y)))

ingrese la descripción de la imagen aquí

Ben
fuente