Clasificación de problemas no lineales de los límites no pueden ser resueltos por una simple tipo perceptrón. El siguiente código R es para propósitos ilustrativos y se basa en este ejemplo 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
Ahora, la idea de un núcleo y el llamado núcleo truco es el proyecto del espacio de entrada en un espacio de dimensiones superiores, como así (fuentes de las fotos):
Mi pregunta
¿Cómo puedo hacer uso de el kernel truco (por ejemplo, con un simple cuadrática kernel) así que tengo un kernel de tipo perceptrón, que es capaz de resolver determinado problema de clasificación? Por favor nota: Esta es principalmente conceptual de la pregunta, pero si usted podría también dar la necesaria modificación del código esto sería genial
Lo que he probado hasta ahora
He intentado lo siguiente que funciona muy bien, pero creo que este no es el verdadero negocio, porque se convierte en computacionalmente muy costoso para los problemas más complejos (el "truco" detrás del núcleo "truco" no es sólo la idea de un núcleo en sí, pero que usted no tiene que calcular la proyección para todos los casos):
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)
La Divulgación Completa
He publicado esta pregunta hace una semana en MODO pero no recibe mucha atención. Sospecho que aquí es un lugar mejor porque es más conceptual de la pregunta de una programación de que se trate.