ガウシアンカーネルの無限次元性

  • サポートベクターマシンではカーネル関数を使って、高次元空間に投げ上げて、そこでの内積を利用する
  • 観測変数を組み合わせて新たな次元軸を作って、その増やした次元での内積を計算するときに、地道に計算してもよいけれど、うまい方法があるといいな、と。
  • そのうまい方法を用いるのが「カーネル・トリック」を使う、という話
  • この記事は解りやすい
  • 手作業で新たな変数を作り出し、それに対する「トリック」を紹介してくれて、最終的に、ガウシアンカーネルを紹介し、それが「無限の変数」を作り出してその内積を計算してくれていることを紹介している
  • 残念なのは、そのガウシアンカーネルが分解されて、無限次元に飛んでいるところの説明式の符号が間違っていること…。正しい式はこちらにあるように、以下の式
    • K(x_1,x_2) = exp(-\frac{||x_1-x_2||^2}{2\sigma^2}) =  exp(-\frac{||x_1||^2}{2\sigma^2})  exp(-\frac{||x_2||^2}{2\sigma^2})  exp(\frac{\text{innerProd}(x_1,x_2)}{\sigma^2})
  • これを展開すると
    • K(x_1,x_2) = exp(-\frac{||x_1||^2}{2\sigma^2})  exp(-\frac{||x_2||^2}{2\sigma^2})  \sum_{i=0}^{\infty} \frac{\text{innerProd}(x_1,x_2)^i}{i!}
  • 指数関数を使わず、ある程度の項数で近似するなら、内積だけ計算しておけばよいこともわかる
  • 念のため、この展開の収束をRでやっておくと:
d <- 5

x1 <- rnorm(d)
x2 <- rnorm(d)

V <- exp(-sum((x1-x2)^2)/2)

C <- exp(-sum(x1^2)/2) * exp(-sum(x2^2)/2) 

n <- 0:10

v <- rep(0,length(n))

v[1] <- C

for(i in 2:length(n)){
	#v[i] <- v[i-1] +C* sign(-1)^n[i] * sum(x1*x2)^n[i]/factorial(n[i])
	v[i] <- v[i-1] +C * sum(x1*x2)^n[i]/factorial(n[i])
}

plot(n,v)
abline(h=V)