[機械学習]サポートベクトルマシン(SVM)について、できるだけ分かりやすくまとめていく③～カーネル法について～

#はじめに
今回はサポートベクトルのカーネル法についてまとめていきたいと思います。

よろしければ前回の記事もご覧ください。

[[機械学習]サポートベクトルマシン(SVM)について、できるだけ分かりやすくまとめていく①～理論と数式編～](https://qiita.com/renesisu727/items/1cf367d17b46237f9c7a)


[[機械学習]サポートベクトルマシン(SVM)について、できるだけ分かりやすくまとめていく②～ラグランジュの未定乗数法～](https://qiita.com/renesisu727/items/26fc3df7bc0d464867d5)


##カーネル法について
それではカーネル法について解説していきます。

ここで、Wikipediaからの引用を見ていきましょう。

>カーネル法（カーネルほう、英: kernel method）はパターン認識において使われる手法の一つで、 判別などのアルゴリズムに組み合わせて利用するものである。よく知られているのは、サポートベクターマシンと組み合わせて利用する方法である。
パターン認識の目的は、一般に、 データの構造(例えばクラスタ、ランキング、主成分、相関、分類)を見つけだし、研究することにある。この目的を達成するために、 カーネル法ではデータを高次元の特徴空間上へ写像する。特徴空間の各座標はデータ要素の一つの特徴に対応し、特徴空間への写像（特徴写像）によりデータの集合はユークリッド空間中の点の集合に変換される。特徴空間におけるデータの構造の分析に際しては、様々な方法がカーネル法と組み合わせて用いられる。特徴写像としては多様な写像を使うことができ（一般に非線形写像が使われる）、それに対応してデータの多様な構造を見いだすことができる。

カーネル法とは、低次元のデータを高次元に写像して分離する方法だと考えてよいと思います。

厳密には違うのですが、まあここはざっくりとした理解で良いでしょう。

それでは、なぜサポートベクトルマシンでカーネル法が用いられるのかを解説します。

以下の二種類のデータを分類する場合を考えてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/da7271b7-22b0-9bcd-9bf4-a38b302f0c3c.png)

このような二次元のデータの場合、一次元の直線で二つの種類のデータを分離することができませんね。

このように線形分離不可能な問題に対応するために、このデータを多次元のデータに拡張しましょう。

具体的には、二次元のデータ$X = (x_1, x_2)$を五次元に拡張する場合には以下のような関数を通して写像します。

$$ψ(X) = (x^2_1, x^2_2, x_1x_2, x_1, x_2)$$

このように、データの次元をより高次元に拡張したものを`高次元特徴空間`と呼び、それに対して最初の入力データの空間を`入力空間`と呼びます。

上の式をより一般化しましょう。n次元の入力空間のデータを、より高次元のr次元特徴空間に写像する関数を以下のように定義します。

```math
ψ(X) = (φ_1(X), φ_2(X), φ_3(X), ...φ_r(X))
```

$φ_1(X)$などの関数は、元の関数のデータを組み合わせて変化を加えるという関数です。

このような関数を用いて高次元特徴空間にデータを拡張していくと、ある段階で分離超平面により分離可能なデータになります。というか、究極的には一つ一つのデータを全て別の次元、データがn個あればn次元まで拡張すれば、必ずn-1次元の分離超平面で分離することができます。

つまり、線形分離可能なデータに変化するのです。

後はこの分離超平面を逆写像して元のデータの分離超平面に変換することで、入力空間においてデータを分離する曲線(厳密には入力空間よりも一つ次元が小さな次元に曲線を拡張したもの)を得ることができます。

それでは、高次元特徴空間における最適化問題の式を考えていきましょう。

高次元特徴空間の最適化問題の式を考える前に、入力空間の最適化問題の復習です。

```math
max\Bigl\{{\tilde{L}(α) = \sum_{i=1}^{N}α_i - \frac{1}{2}\sum_{i=1}^{N}\sum_{i=j}^{N}α_iα_jt_it_j{X_i}^TX_j\Bigr\}}\\
\sum_{i=1}^{N}α_it_i = 0, \quad 0 \leqq α_i \leqq C, i = 1,2,...N

```

高次元特徴空間のデータは入力空間のデータ$X_i^T$,$X_j$1を関数$ψ(X)$を用いて写像したものであるので、高次元特徴空間の最適化問題は以下のようになります。

```math
max\Bigl\{{\tilde{L}(α) = \sum_{i=1}^{N}α_i - \frac{1}{2}\sum_{i=1}^{N}\sum_{i=j}^{N}α_iα_jt_it_j{ψ(X)_i}^Tψ(X)_j\Bigr\}}\\
\sum_{i=1}^{N}α_it_i = 0, \quad 0 \leqq α_i \leqq C, i = 1,2,...N

```

高次元特徴空間において、この最適化問題をといていけばよいことが分かりますね。

ここで問題になるのは以下の項です。

```math
{ψ(X)_i}^Tψ(X)_j
```

特徴空間が高次元になればなるほど、この項の計算量がとんでもないことになりますよね。

この部分の計算を簡単にする方法がカーネルトリックと呼ばれる方法です。

以下のように`カーネル関数`を定義します。

```math
K(X_i, X_j) = {ψ(X)_i}^Tψ(X)_j
```

少しごまかしますが、このカーネル関数を用いると$ψ(X)$を直接計算せずに内積を計算することができます。

このように、$ψ(X)$を直接計算せずに内積を計算するためにはある条件を満たす必要があるのですが、~~なんだかよく分からない~~ 説明するのが大変なので参考となるサイトだけ貼っておきます。

[Mercerの定理](http://ibisforest.org/index.php?Mercer%E3%81%AE%E5%AE%9A%E7%90%86)
[正定値カーネル](http://ibisforest.org/index.php?%E6%AD%A3%E5%AE%9A%E5%80%A4%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB)

双対問題において$ψ(X)$は内積の形でしか出てこないため、この方法は非常に有用です。

以下のような三つのカーネル関数が用いられます。


`ガウスカーネル`

```math
K(X_i, X_j) = exp\bigl\{-\frac{||X_i -X_j||^2}{2σ^2}\bigl\}
```

`多項式カーネル`

```math
K(X_i, X_j) = (X_i^TX_j + c)^d
```

`シグモイドカーネル`

```math
K(X_i, X_j) = tanh(bX_i^TX_j + c)
```

それでは、実際に多項式カーネルにより内積が簡単に計算できる具体例をみていきましょう。

以下のような二次元入力空間を三次元特徴空間に写像する関数を考えます。

```math
ψ(X) = ψ(x_1, x_2) = (x_1^2, \sqrt{2}x_1x_2, x_2^2)
```

この関数を用いると、二つの二次元ベクトルX, Yは以下のようになります。

```math
ψ(X) = ψ(x_1, x_2) = (x_1^2, \sqrt{2}x_1x_2, x_2^2)\\
ψ(Y) = ψ(y_1, y_2) = (y_1^2, \sqrt{2}y_1y_2, y_2^2)
```

それではこれらの内積を考えていきましょう。

```math
\begin{align}
ψ(X)^Tψ(Y) & = (x_1^2, \sqrt{2}x_1x_2, x_2^2)^T(y_1^2, \sqrt{2}y_1y_2, y_2^2)\\
&=x_1^2y_1^2 + 2x_1y_1x_2y_2 + x_2^2y_2^2\\
&= (x_1y_1 + x_2y_2)^2\\
&=((x_1,x_2)^T(y_1,y_2))^2\\
&=(X^TY)^2

\end{align}
```


このように、$ψ(X)^Tψ(Y)$を直接計算せずに、元のベクトルの内積を二乗することで、$ψ(X)^Tψ(Y)$を計算することができます。

カーネル法についてもう少し詳しく知りたい方は[こちら](http://enakai00.hatenablog.com/entry/2017/10/13/145337)の記事を参考にしてください。


#終わりに
ここまでで今回の記事は終了です。

ここまで読んで頂きありがとうございました。

よろしければ次回の記事もご覧ください

[[機械学習]サポートベクトルマシン(SVM)について、できるだけ分かりやすくまとめていく④～ソフトマージンとハードマージンの実装～](https://qiita.com/renesisu727/items/3fbed61e3253934eb68e)

[[機械学習]サポートベクトルマシン(SVM)について、できるだけ分かりやすくまとめていく⑤～カーネル法を用いた分類の実装～](https://qiita.com/renesisu727/items/c53dc3ad1fd7280064bd)