Optimieren einer Support Vector Machine mit quadratischer Programmierung

12

Ich versuche, den Prozess zum Trainieren einer linearen Unterstützungsvektormaschine zu verstehen . Mir ist klar, dass die Eigenschaften von SMVs es ermöglichen, sie viel schneller zu optimieren als mit einem quadratischen Programmierlöser, aber zu Lernzwecken würde ich gerne sehen, wie dies funktioniert.

Trainingsdaten

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()

Geben Sie hier die Bildbeschreibung ein

Finden der Hyperebene mit maximaler Marge

Laut diesem Wikipedia-Artikel über SVMs muss ich die Hyperebene mit maximalem Rand finden, die ich lösen muss

argmin(w,b)12w2
vorbehaltlich (für jedes i = 1, ..., n)
yi(wxib)1.

Wie stecke ich meine Beispieldaten in einen QP-Solver in R (zum Beispiel Quadprog ), um zu bestimmen ?w

Ben
quelle
Sie müssen das doppelte Problem lösen
2
@fcop kannst du das näher erläutern? Was ist das Dual in diesem Fall? Wie löse ich mit R? usw.
Ben

Antworten:

6

TIPP :

Quadprog löst Folgendes:

minxdTx+1/2xTDxsuch that ATxx0

Betrachten Sie

x=(wb)and D=(I000)

wo die Identitätsmatrix .I

Wenn ist und ist :wp×1yn×1

x:(2p+1)×1D:(2p+1)×(2p+1)

In ähnlichen Zeilen:

x0=(11)n×1

Formulieren Sie mit den obigen Hinweisen, um Ihre Ungleichheitsbedingung darzustellen.A

rechtsgesägt
quelle
1
Ich bin verloren. was ist ? dT
Ben
1
Was ist der Koeffizient von in Ihrer Zielfunktion? Nicht sondern ? w||w||22w
Rightskewed
1
Schätzen Sie die Hilfe. Ich dachte, ich hätte das herausgefunden, aber wenn ich D = die von Ihnen vorgeschlagene Matrix setze, wird quadprogder Fehler "Matrix D in quadratischer Funktion ist nicht positiv definitiv!" Zurückgegeben.
Ben
3
HACK: Störung durch Hinzufügen eines kleinen Wertes, sagen wir auf der DiagonaleD1e6
rechtssicher
7

Den Hinweisen von Rightskewed folgen ...

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)))

Geben Sie hier die Bildbeschreibung ein

Ben
quelle