I problemi di classificazione con confini non lineari non possono essere risolti da un semplice percettrone . Il seguente codice R è a scopo illustrativo e si basa su questo esempio 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
Ora l'idea di un kernel e il cosiddetto trucco del kernel è di proiettare lo spazio di input in uno spazio dimensionale superiore, in questo modo ( fonti di immagini ):
La mia domanda
Come posso utilizzare il trucco del kernel (ad esempio con un semplice kernel quadratico) in modo da ottenere un perceptron del kernel , in grado di risolvere il problema di classificazione dato? Nota: questa è principalmente una domanda concettuale, ma se anche tu potessi dare la necessaria modifica del codice sarebbe fantastico
Quello che ho provato finora
ho provato quanto segue che funziona bene, ma penso che questo non sia un vero affare perché diventa computazionalmente troppo costoso per problemi più complessi (il "trucco" dietro il "trucco del kernel" non è solo l'idea di un kernel stesso ma che non è necessario calcolare la proiezione per tutte le istanze):
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)
Full Disclosure
Ho pubblicato questa domanda una settimana fa su SO ma non ha ottenuto molta attenzione. Sospetto che qui sia un posto migliore perché è più una domanda concettuale che una domanda di programmazione.