カーネル関数の使い方:scikit-learn

Pythonのscikit-learnのカーネル関数を使ってみたので,メモ書きしておきます.いやぁ,今までJavaで一生懸命書いてましたが,やっぱりPythonだと楽でいいですねー.

もくじ

最初に注意する点

最初につまずいた所.一次元の配列だとエラーが出るみたいです.

import numpy as np
from sklearn.metrics import pairwise

x = np.array([1, 1]) #([[1, 1]])と書かないとエラーになります

print(pairwise.rbf_kernel(x))

と書くと,

DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.

と言う具合に「データとしての1次元配列の受け渡しは0.17で廃止されました」と言われます.なので,ベクトルを使う場合は一次元の列であることを書かないと駄目みたいです.

線形カーネル

検算が簡単そうな線形カーネルから試してみたいと思います.
リファレンスはこちら
sklearn.metrics.pairwise.linear_kernel — scikit-learn 0.19.1 documentation

まずは簡単な例から

リファレンスを見ながら単純な例を試しみました.

import numpy as np
from sklearn.metrics import pairwise

x = np.array([[1, 1]])
y = np.array([[2, 2]])

print(pairwise.linear_kernel(x,y))

線形カーネルの計算式は次の通りです.
{k\left( x,y \right) = \mathbf{x}^T \mathbf{y} }
内積を計算しているので,出力は4になるはずです.

出力結果
[[ 4.]]

と狙い通りになりました.

データが多次元だったら

実際のデータは,例えば2次元のデータならば {\left(1,2   \right),\left(3,4   \right),\left(5,6   \right), \dots }という具合になるわけです.
ではデータが多次元の場合はどうなるでしょうか??

import numpy as np
from sklearn.metrics import pairwise

x = np.array([[1, 1],[2, 2],[3, 3]])

print(pairwise.linear_kernel(x))

と書くと出力結果はこうなります

出力結果
[[  2.   4.   6.]
 [  4.   8.  12.]
 [  6.  12.  18.]]

これって例えば {\mathbf{X}=(\mathbf{x}_1,\mathbf{x}_2,\mathbf{x}_3) }とあったら,上の行は {\mathbf{x}_{1}^T\mathbf{x}_1 }{\mathbf{x}_{1}^T\mathbf{x}_2 }{\mathbf{x}_{1}^T\mathbf{x}_3 }と計算しているみたいで,上から二段目の行は {\mathbf{x}_{2}^T\mathbf{x}_1 }{\mathbf{x}_{2}^T\mathbf{x}_2 }{\mathbf{x}_{2}^T\mathbf{x}_3 }と計算しているみたいです.3行目も同じようです.

ガウシアンの動径基底関数

ドキュメントは下記の通り

動径基底関数はなんぞや?という話は次の通り

実際に使ってみるとこんな感じです.

import numpy as np
from sklearn.metrics import pairwise

x = np.array([[1, 1]])
y = np.array([[2, 2]])

print(pairwise.rbf_kernel(x,y))

と書くと

[[ 0.36787944]]

 {k\left( x,y \right) =exp\left( -\gamma \left\| \mathbf{x}-\mathbf{y} \right\|  \right) 
}

物の本を読むと{ \gamma ={ 1 }/{ 2{ \sigma  }^{ 2 } } 
}らしいのですが,このライブラリの場合はなにもしないと{ \gamma ={ 1 }/{ (\mathbf{x}の要素数) } 
}らしいです.なので{ exp\left\{ { -1 }/{ 2 }\left( { 1 }^{ 2 }+{ 1 }^{ 2 } \right)  \right\} =0.36787944\cdots  
}





きょうはこんな感じで