Les problèmes de classification avec des limites non linéaires ne peuvent pas être résolus par un simple perceptron . Le code R suivant est à des fins d'illustration et est basé sur cet exemple en 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
Maintenant, l'idée d'un noyau et la soi-disant astuce du noyau est de projeter l'espace d'entrée dans un espace de dimension supérieure, comme ceci ( sources de photos ):
Ma question
Comment utiliser l'astuce du noyau (par exemple avec un noyau quadratique simple) pour obtenir un perceptron du noyau , capable de résoudre le problème de classification donné? Remarque: il s'agit principalement d'une question conceptuelle, mais si vous pouviez également apporter la modification de code nécessaire, ce serait parfait
Ce que j'ai essayé jusqu'à présent,
j'ai essayé ce qui suit, mais je pense que ce n'est pas la vraie affaire car cela devient trop coûteux en calcul pour des problèmes plus complexes (le "truc" derrière le "truc du noyau" n'est pas seulement l'idée d'un noyau lui-même mais que vous n'avez pas à calculer la projection pour toutes les instances):
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)
Divulgation complète
J'ai posté cette question il y a une semaine sur SO mais cela n'a pas attiré beaucoup d'attention. Je soupçonne que c'est un meilleur endroit parce que c'est plus une question conceptuelle qu'une question de programmation.