Задачи классификации с нелинейными границами не могут быть решены простым персептроном . Следующий код R предназначен для иллюстративных целей и основан на этом примере в 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
Теперь идея ядра и так называемого трюка с ядром состоит в том, чтобы спроецировать входное пространство в пространство более высокого измерения, вот так ( источники рисунков ):
Мой вопрос
Как мне использовать трюк с ядром (например, с простым квадратичным ядром), чтобы я получил персептрон ядра , который способен решить данную проблему классификации? Обратите внимание: это в основном концептуальный вопрос, но если бы вы могли также внести необходимые изменения в код, это было бы здорово
То, что я пробовал до сих пор,
я попробовал следующее, которое работает хорошо, но я думаю, что это не реальная сделка, потому что она становится слишком сложной в вычислительном отношении для более сложных задач («хитрость» за «хитростью ядра» - это не просто идея само ядро, но вам не нужно вычислять проекцию для всех случаев):
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)
Полное раскрытие
Я разместил этот вопрос неделю назад на SO, но он не привлек большого внимания. Я подозреваю, что здесь лучше, потому что это скорее концептуальный вопрос, чем вопрос программирования.