Klassifizierungsprobleme mit nichtlinearen Grenzen können nicht mit einem einfachen Perzeptron gelöst werden . Der folgende R-Code dient nur zur Veranschaulichung und basiert auf diesem Beispiel in Python.
nonlin <- function(x, deriv = F) {
if (deriv) x*(1-x)
else 1/(1+exp(-x))
}
X <- matrix(c(-3,1,
-2,1,
-1,1,
0,1,
1,1,
2,1,
3,1), ncol=2, byrow=T)
y <- c(0,0,1,1,1,0,0)
syn0 <- runif(2,-1,1)
for (iter in 1:100000) {
l1 <- nonlin(X %*% syn0)
l1_error <- y - l1
l1_delta <- l1_error * nonlin(l1,T)
syn0 <- syn0 + t(X) %*% l1_delta
}
print("Output After Training:")
## [1] "Output After Training:"
round(l1,3)
## [,1]
## [1,] 0.488
## [2,] 0.468
## [3,] 0.449
## [4,] 0.429
## [5,] 0.410
## [6,] 0.391
## [7,] 0.373
Die Idee eines Kernels und des sogenannten Kernel-Tricks besteht nun darin, den Eingaberaum wie folgt in einen höherdimensionalen Raum zu projizieren ( Bildquellen ):
Meine Frage
Wie verwende ich den Kernel-Trick (z. B. mit einem einfachen quadratischen Kernel), um ein Kernel-Perzeptron zu erhalten , das das gegebene Klassifizierungsproblem lösen kann? Bitte beachten Sie: Dies ist hauptsächlich eine konzeptionelle Frage, aber wenn Sie auch die erforderliche Code-Änderung vornehmen könnten, wäre dies großartig
Was ich bisher versucht habe, habe
ich das Folgende versucht, was in Ordnung funktioniert, aber ich denke, dass dies nicht das eigentliche Geschäft ist, da es für komplexere Probleme rechenintensiv wird (der "Trick" hinter dem "Kernel-Trick" ist nicht nur die Idee eines Kernel selbst, aber dass Sie die Projektion nicht für alle Instanzen berechnen müssen):
X <- matrix(c(-3,9,1,
-2,4,1,
-1,1,1,
0,0,1,
1,1,1,
2,4,1,
3,9,1), ncol=3, byrow=T)
y <- c(0,0,1,1,1,0,0)
syn0 <- runif(3,-1,1)
Vollständige Offenlegung
Ich habe diese Frage vor einer Woche auf SO gepostet, aber sie hat nicht viel Aufmerksamkeit erhalten. Ich vermute, dass hier ein besserer Ort ist, weil es eher eine konzeptionelle Frage als eine Programmierfrage ist.