Support Vector Machine in R: Hyperplane und Maximal Margin Classifier (Teil 01) | von Yanan Wu | Juni 2023

0
26


  1. Was ist eine Hyperebene?

In n-Dimension Raum, eine Hyperebene ist ein flacher affiner Unterraum mit einem n-1 Abmessungen. Im zweidimensionalen Raum ist eine Hyperebene beispielsweise eine eindimensionale Linie (Abbildung 1). Die mathematische Definition einer zweidimensionalen Hyperebene ist einfach und wird durch die Gleichung (1.1) definiert.

1.1 Gleichung. Eine Linie in 2 Dimensionen

Im p-dimensionalen Raum beträgt die Dimension der Hyperebene p-1, wie in Gleichung (1.2) dargestellt.

1.2 Gleichung. Eine Linie in p-Dimensionen

2. Klassifizierung mithilfe einer Hyperebene

Eine Hyperebene (schwarze durchgezogene Linie: 2+3 * x_1 + 2 * x_2 = 0 (Gl. 1.3)) im zweidimensionalen Raum ist in Abbildung 1 dargestellt. Wir haben zwei Beobachtungen in zwei Klassen – das heißt y_1,…,y_n ∈ { 1,-1}. Grüne Punkte und rote Punkte sind die Punkte, die (1.3) nicht erfüllen, zum Beispiel:

1.4 Gleichung. Rot: Punkte in Klasse 1; Grün: Punkte in Klasse -1
## user-defined operate to attract 2-d hyperplane
hyper_func = operate(intercept, slope1, slope2, min,max, size){
data_ = checklist()
data_[[1]] <- seq(min, max, size.out = size)
data_[[2]] <- (intercept + slope1 * data_[[1]]) / -slope2
return(data_)
}

## randomly generate factors for a selected vary
x1 = runif(200, min=-2, max=2)
x2 = runif(200, min=-2, max=2)
input_data = cbind(x1, x2)
plot(x1,x2, pch = 16)

plane_func = 2+3 * x1 + 2 * x2
input_data = cbind(input_data, plane_func)
## calculate the category for every factors based mostly on which facet they find.
group_data = lapply(input_data[,3], operate(x) if(x>0){return('crimson')}else{
return('inexperienced')})
input_data = cbind(input_data, teams = unlist(group_data))
plot(input_data[,'x1'],input_data[,'x2'],col = input_data[,'groups'], pch = 16, xlab = 'x1', ylab = 'x2')

##draw a 2-D hyperplane,beta_0 = 2, beta_1 = 3, beta_2 = 2. min & max = 2. Size = 200
pts_plane = hyper_func(2,3,2,-2,2,200)
traces(pts_plane[[1]], pts_plane[[2]], col = "black", lwd = 2)

Abbildung 1.
Abbildung 1. Die Hyperebene 2+3 * x1 + 2 * x2 = 0 ist in der schwarzen Linie dargestellt. Rote Punkte entsprechen 2+3 * x1 + 2 * x2 > 0. Grüne Punkte entsprechen 2+3 * x1 + 2 * x2 < 0.

3. Der Maximal-Marge-Klassifikator

Wir können unendlich viele Hyperebenen haben, da selbst eine geringfügige Anpassung der Hyperebene keine der Beobachtungen im Trainingssatz schneidet. Zum Beispiel drei mögliche Hyperebenen, wie in Abbildung 2 dargestellt.

#filter some factors for example this pattern
sample_pts = input_data[which(abs(as.numeric(input_data[,'plane_func'])) > 3),]
plot(sample_pts[,'x1'],sample_pts[,'x2'], col = sample_pts[,'groups'],pch = 16, xlab = 'x1', ylab = 'x2')

# draw three potential hyperplane
pts_plane = hyper_func(2,3,2,-2,2,200)
traces(pts_plane[[1]], pts_plane[[2]], col = "black", lwd = 2)

pts_plane = hyper_func(1.5,1.5,2,-2,2,200)
traces(pts_plane[[1]], pts_plane[[2]], col = "black", lwd = 2)

pts_plane = hyper_func(2.2,2.2,2,-2,2,200)
traces(pts_plane[[1]], pts_plane[[2]], col = "black", lwd = 2)

Wir haben zwei Gruppenpunkte, einer wird in roter Farbe dargestellt, die hauptsächlich in der rechten oberen Ecke verteilt ist, und die zweite Gruppe wird in grüner Farbe dargestellt, die hauptsächlich in der linken unteren Ecke verteilt ist.  Wir haben drei Hyperebenen, die die beiden Gruppenpunkte trennen können.  Und keiner von ihnen interagiert mit irgendwelchen Punkten.
Abbildung 2. Drei mögliche Hyperebenen (durchgezogene schwarze Linien), die die Punkte in zwei verschiedene Klassen unterteilen

Die Regel, die wir anwenden, um die auszuwählen optimale Hyperebenebekannt als Maximal Margin Hyperplane (MMH), basiert auf der Maximierung der Marge. Der Rand bezieht sich auf den minimalen Abstand zwischen den Punkten im Trainingssatz und der Hyperebene (d+ ist der kürzeste Abstand von der Hyperebene zum nächsten positiven Punkt und d- ist der kürzeste Abstand von der Hyperebene zum nächsten negativen Punkt. Additionally Marge = d+ plus d-).

Indem wir die Hyperebene mit dem größten Abstand suchen, wollen wir diejenige finden, die den weitesten Mindestabstand zu den Trainingspunkten hat. Im Wesentlichen stellt der MMH die lineare Hyperebene dar, die die Daten optimum trennt. Sobald das MMH identifiziert ist, können wir die Testpunkte klassifizieren, indem wir bestimmen, auf welcher Seite der Hyperebene sie liegen. Dieser Ansatz wird allgemein als bezeichnet Maximaler Margin-Klassifikator.

##This instance illustrate the classification for 2 courses based mostly on svm. 
##so x variable needs to be numeric format, y variable needs to be issue.
svm_data = knowledge.body(x1 = as.numeric(sample_pts[,'x1']), x2 = as.numeric(sample_pts[,'x2']),teams = as.issue(sample_pts[,'groups']))
##utilizing svm to search out the optimum hyperplane.
svmfit = svm(teams~x1+x2, knowledge = svm_data, kernel = 'linear', price = 5, scale = FALSE)

##generate an everyday grid dots
make.grid = operate(x, n = 75) {
grange = apply(x, 2, vary)
x1 = seq(from = grange[1,1], to = grange[2,1], size = n)
x2 = seq(from = grange[1,2], to = grange[2,2], size = n)
develop.grid(x1 = x1, x2 = x2)
}
##x is the x_1 and x_2.
x = svm_data[,c(1,2)]
xgrid = make.grid(svm_data[,c(1,2)])
##predict class for normal grid dots
ygrid = predict(svmfit, xgrid)
##plot common grid dots
plot(xgrid, col = c("inexperienced","crimson")[as.numeric(ygrid)], pch = 20, cex = .2)
##plots factors in two class
factors(svm_data, col = as.character(svm_data[,3]), pch = 19)
##plot assist vector, svmfit$index can present index for assist vector
factors(x[svmfit$index,], pch = 5, cex = 2, col = 'blue')

## get coefficients of optimum hyperplane (beta_0 (intercept), beta_1 and beta_2)
coeffis = coef(svmfit)
## draw optimum hyperplane
pts_plane = hyper_func(coeffis[1],coeffis[2],coeffis[3],-2,2,200)
traces(pts_plane[[1]], pts_plane[[2]], col = "black", lwd = 2)
## draw margin for damaging class, so intercept plus 1. Why plus 1? See in Equation 1.5
pts_plane = hyper_func(coeffis[1]+1,coeffis[2],coeffis[3],-2,2,200)
traces(pts_plane[[1]], pts_plane[[2]], col = "black", lwd = 2, lty = 3)
## draw margin for optimistic class, so intercept minus 1. Why minus 1? See in Equation 1.5
pts_plane = hyper_func(coeffis[1]-1,coeffis[2],coeffis[3],-2,2,200)
traces(pts_plane[[1]], pts_plane[[2]], col = "black", lwd = 2, lty = 3)

Abbildung 3. Optimale Hyperebene, maximaler Rand, Ebene und Unterstützungsvektor

In Abbildung 3 beobachten wir drei Punkte, die in gleichen Abständen von der maximalen Randhyperebene positioniert sind und an den gestrichelten Linien ausgerichtet sind. Diese drei Punkte sind Unterstützungsvektoren um die Hyperebene mit maximalem Rand zu „unterstützen“ (jede Klasse muss mindestens eine haben). Unterstützungsvektor). Mit anderen Worten, jede geringfügige Änderung der Place von a Unterstützungsvektor würde folglich die optimale Hyperebene verschieben, während Änderungen an den anderen Punkten die Hyperebene nicht beeinflussen würden

Die beiden gestrichelten Linien (Ebene: H_1 und H_-1)sind die Grenze der optimalen Hyperebene.

1.5 Gleichung. Ebene für H_1 und H_-1

Alle Punkte in der Positivklasse erfüllen additionally die Anforderungen

1.6 Gleichung. Punkte in Klasse 1

Alle Punkte in der Negativklasse

1.7 Gleichung. Punkte in Klasse -1



Source link

HINTERLASSEN SIE EINE ANTWORT

Please enter your comment!
Please enter your name here