非線形境界の分類問題は、単純なパーセプトロンでは解決できません。次の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
カーネルといわゆるカーネルトリックのアイデアは、入力空間を次のように高次元空間に投影することです(picsのソース)。
私の質問与えられた分類問題を解決できるカーネルパーセプトロン
を取得するために、カーネルトリック(たとえば、単純な2次カーネル)をどのように利用しますか?注意:これは主に概念的な質問ですが、必要なコードの変更も提供できる場合、これは素晴らしいことです
これまで
に試したことで、うまくいく次のことを試しましたが、複雑な問題には計算が高すぎるため、これは本当のことではないと思います(「カーネルトリック」の背後にある「トリック」は、カーネル自体ですが、すべてのインスタンスの予測を計算する必要はありません)。
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)
完全な開示
この質問を1週間前にSOに投稿しましたが、あまり注目されませんでした。ここはプログラミングの問題よりも概念的な問題なので、こちらのほうがいいと思います。