Optymalizacja maszyny wektora pomocniczego za pomocą programowania kwadratowego

12

Próbuję zrozumieć proces szkolenia maszyny wektora liniowego wsparcia . Zdaję sobie sprawę, że właściwości SMV pozwalają na ich optymalizację znacznie szybciej niż za pomocą kwadratowego solvera programistycznego, ale do celów edukacyjnych chciałbym zobaczyć, jak to działa.

Dane treningowe

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

wprowadź opis zdjęcia tutaj

Znalezienie hiperpłaszczyzny maksymalnego marginesu

Zgodnie z tym artykułem Wikipedii na temat maszyn SVM , aby znaleźć hiperpłaszczyznę maksymalnego marginesu, którą muszę rozwiązać

YI(wxı-b)1.

argmin(w,b)12w2
zastrzeżeniem (dla dowolnego i = 1, ..., n)
yi(wxib)1.

Jak „podłączyć” moje przykładowe dane do solvera QP w R (na przykład quadprog ), aby ustalić ?w

Ben
źródło
Musisz rozwiązać podwójny problem
2
@fcop możesz rozwinąć? Jaki jest dual w tym przypadku? Jak rozwiązać za pomocą R? itp.
Ben

Odpowiedzi:

6

WSKAZÓWKA :

Quadprog rozwiązuje następujące problemy:

minxreT.x+1/2)xT.rextakie, że ZAT.xx0

Zastanów się

x=(wb)re=(ja000)

gdzie matrycą tożsamości.ja

Jeśli jest a jest :p × 1 y n × 1wp×1yn×1

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

W podobnych wierszach:

x0=(11)n×1

Sformułuj korzystając z powyższych wskazówek, aby przedstawić swoje ograniczenie nierówności.ZA

prawoskrętny
źródło
1
Zgubiłem się. co to jest ? reT.
Ben
1
Co to jest współczynnik w funkcji celu? Nie ale ? w||w||22w
przesunięty w prawo
1
Doceń pomoc. Myślałem, że to rozgryzłem, ale kiedy ustawię D = macierz, którą sugerujesz, quadprogzwraca błąd: „macierz D w funkcji kwadratowej nie jest pozytywnie określona!”
Ben
3
HACK: Perturb , dodając małą wartość powiedz na przekątnejre1mi-6
prawy przekrzywiony
7

Podążając za wskazówkami po prawej stronie ...

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

wprowadź opis zdjęcia tutaj

Ben
źródło