【ラビットチャレンジ】要点のまとめ - 機械学習 その６

# 1. はじめに
本記事はJDLA E資格の認定プログラム「ラビットチャレンジ」における機械学習のレポート記事である。
本記事では機械学習における「サポートベクターマシン（SVM）」について要点をまとめている。

[【ラビットチャレンジ】要点のまとめ - 機械学習 その１](https://qiita.com/PoppeDwarf/items/92ba5a6ebd35a9f53ae0)
[【ラビットチャレンジ】要点のまとめ - 機械学習 その２](https://qiita.com/PoppeDwarf/items/80724b0b92d01c9a9421)
[【ラビットチャレンジ】要点のまとめ - 機械学習 その３](https://qiita.com/PoppeDwarf/items/30944bca17d2c7f8c5ee)
[【ラビットチャレンジ】要点のまとめ - 機械学習 その４](https://qiita.com/PoppeDwarf/items/01cc119c707fe3e26f1d)
[【ラビットチャレンジ】要点のまとめ - 機械学習 その５](https://qiita.com/PoppeDwarf/items/6cb3929a4668ecf1c2ab)
【ラビットチャレンジ】要点のまとめ - 機械学習 その６

# 2. サポートベクターマシン（SVM）
## 2.1. サポートベクターマシン（SVM）
- 2クラス分類のための機械学習手法であり、線形モデルの正負で2値分類する
- 最も近いデータ点との距離（マージン）が最大となる線形判別関数を求める。

目的関数：$ \smash{ min_{w, b}\dfrac{1}{2}||w||^{2} } $

制約条件：$ \smash{ t\_{i}(\boldsymbol{w}^{T}\boldsymbol{x}\_{i} + b) \geq 1} $　　$ (i=1,2, \cdots , n) $

$ \qquad \smash{ \boldsymbol{w} } $：パラメータ
$ \qquad \smash{ b } $：バイアス
$ \qquad \smash{ t\_{i} } $：分類。$-1$か$1$
$ \qquad \smash{ \boldsymbol{x}\_{i} } $：説明変数
$ \qquad \smash{ i } $：説明変数のインデックス。$1～k$までをとる

## 2.2. ラグランジュの未定乗数法
- サポートベクターマシンにおいて、目的関数の制約付き最適化問題を解くにはラグランジュの未定乗数法を用いる。
- 制約$ g\_{i}(\boldsymbol{x}) \geq 0(i = 1,2, \cdots , n) $の下で、$ f(\boldsymbol{x}) $が最小になる$ \boldsymbol{x} $は、変数$ \lambda\_{i} \geq 0(i = 1,2, \cdots , n) $を用いて新たに定義したラグランジュ関数$ \smash{ L(\boldsymbol{x}, \boldsymbol{\lambda}) = f(\boldsymbol{x}) - \sum\_{i=1}^{n}\lambda\_{i}g(\boldsymbol{x}) } $において$ \smash{ \dfrac{\partial L}{\partial x\_{j}} = 0(j = 1,2, \cdots , m) } $を満たす

  - $ \lambda\_{i} \geq 0(i = 1,2, \cdots , n) $：ラグランジュ乗数
  - $ \smash{ L(\boldsymbol{x}, \boldsymbol{\lambda}) = f(\boldsymbol{x}) - \sum\_{i=1}^{n}\lambda\_{i}g(\boldsymbol{x}) } $：ラグランジュ関数
　

このとき、SVMの主問題の目的変数と制約条件より、
$ \qquad \smash{ f(\boldsymbol{x}) = \dfrac{1}{2}||w||^{2} } \qquad \smash{ g\_{i}(\boldsymbol{x}) = t\_{i}(\boldsymbol{w}^{T}\boldsymbol{x}\_{i} + b) - 1} $
と捉えると、
$ \qquad \smash{ L(\boldsymbol{x}, \boldsymbol{\lambda}) = f(\boldsymbol{x}) - \sum\_{i=1}^{n}\lambda\_{i}g(\boldsymbol{x}) = \dfrac{1}{2}||w||^{2} - \sum\_{i=1}^{n}\lambda\_{i}(t\_{i}(\boldsymbol{w}^{T}\boldsymbol{x}\_{i} + b) - 1})  $
とできる。
ただし、ここで変数となっているのは$\boldsymbol{x}$ではなく$\boldsymbol{w}, b$のため、正確には
$ \qquad \smash{ L(\boldsymbol{w}, b, \boldsymbol{\lambda}) = \dfrac{1}{2}||w||^{2} - \sum\_{i=1}^{n}\lambda\_{i}(t\_{i}(\boldsymbol{w}^{T}\boldsymbol{x}\_{i} + b) - 1})  $
と記述するのがふさわしいと思われる。

最小となる$\boldsymbol{w}, b$は以下を満たす。
$ \qquad \dfrac{\partial L}{\partial \boldsymbol{w}} = \boldsymbol{w} - \sum\_{i=1}^{n}a\_{i}t\_{i}\boldsymbol{x}\_{i} = 0 \qquad \dfrac{\partial L}{\partial b} =  - \sum\_{i=1}^{n}a\_{i}t\_{i} = 0 $
つまり、
$ \qquad \boldsymbol{w} = \sum\_{i=1}^{n}a\_{i}t\_{i}\boldsymbol{x}\_{i} \qquad \sum\_{i=1}^{n}a\_{i}t\_{i} = 0 $
　

- 参考：[ラグランジュの未定乗数法 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%B0%E3%83%A9%E3%83%B3%E3%82%B8%E3%83%A5%E3%81%AE%E6%9C%AA%E5%AE%9A%E4%B9%97%E6%95%B0%E6%B3%95)

## 2.3. サポートベクター
サポートベクターは線形判別関数の最も近くにあるデータを指す。
分離超平面を構成する学習データは、サポートベクターだけで残りのデータは不要。

- 参考：[サポートベクトルマシンの考え方 | Logics of Blue](https://logics-of-blue.com/svm-concept/)

## 2.4. ソフトマージンSVM
サンプルを線形分離できないとき、誤差を許容し、誤差に対してペナルティを与えることで対応できるようにしたSVM。

目的関数：$ \dfrac{1}{2}||w||^{2} $

制約条件：$ C\sum\_{i=1}^{n}\xi\_{i} $
　　　　　このとき $ \xi\_{i} = 1 - \boldsymbol{w}^{T}\boldsymbol{x}\_{i} + b > 0 $

パラメータ$C$の大小で決定境界が変化する。

## 2.5. 非線形分離
線形分離できないとき、特徴空間に写像してその空間で線形に分離する。
　→元の空間上では非線形な分離となる。

## 2.6. カーネルトリック
非線形分離において、複雑な問題になるとより高次元に写像する必要が出てくるが、そのまま計算しては計算量が膨大になってしまう。しかしSVMの場合は実際は写像を求める必要があるわけではなく、ベクトルの内積（カーネル関数）のみわかれば計算ができる。このときカーネル関数を用いて高次元ベクトルの内積を表現する方法をカーネルトリックという。

特徴空間が高次元でも計算コストを抑えることができるという特徴がある。

- 参考：[カーネルトリック - Shogo Computing](https://shogo82148.github.io/homepage/memo/algorithm/svm/kernel.html)

# 3. ハンズオン
## 3.1. サポートベクターマシン
### 3.1.1. 課題
サポートベクターマシンの動作を確認する。
- 訓練データが線形分離可能な場合
- 訓練データが線形分離不可能な場合
- 訓練データに重なりがある場合（ソフトマージンSVM）

### 3.1.2. 演習結果
### 3.1.2.1. 準備
必要なモジュールのインポート。
![06_support_vector_machine_01_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/e7c70b4c-3244-5dfb-fdbe-a4e760f0fba4.jpeg)

### 3.1.2.2. 訓練データが線形分離可能な場合
線形分離が可能なように2つの分類のデータを標準正規分布に沿った乱数で作成する。
![06_support_vector_machine_01_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/d4cb8b66-8222-0e09-6b74-adfb0fa30c3f.jpeg)
![06_support_vector_machine_02_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/eb009d0c-4871-7963-1c9f-d6864c8f413a.jpeg)
最急降下法の使用。
![06_support_vector_machine_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/ddcfbf9f-a7a3-8f2f-2407-df0b74d1e593.jpeg)
![06_support_vector_machine_04_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/4fbcf413-1192-a7b7-c12d-a7c92ede7daa.jpeg)
バイアスの取得およびSVMの決定関数による予測。
![06_support_vector_machine_04_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/4dfc4e00-f721-55b0-dd9e-27d906951d29.jpeg)
データおよびマージン、決定境界をプロットすると、ちゃんと決定境界で分かれていることがわかる。
![06_support_vector_machine_05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/0d1387b6-cf53-0a42-473b-d7ea74ff1026.jpeg)

### 3.1.2.3. 訓練データが線形分離不可能な場合
線形分離が不可能なように2つの分類のデータを作成する。
![06_support_vector_machine_06_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/e981db28-474b-6ceb-ffb5-1c290a090253.jpeg)
![06_support_vector_machine_07_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/31e92a25-08e2-235d-bb8b-9098964f9f1f.jpeg)
RBFカーネルの関数の使用。
![06_support_vector_machine_07_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/3b4db4f6-61ff-b0ac-30e5-b79bec338cd8.jpeg)
バイアスの取得およびSVMの決定関数による予測。
![06_support_vector_machine_08_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/34bf38ac-2e0a-04f5-567c-4707577959d5.jpeg)
データおよびマージン、決定境界をプロットすると、非線形においても決定境界で分かれていることがわかる。
![06_support_vector_machine_09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/8833c343-adad-cff7-e423-26e1de4d1be0.jpeg)

### 3.1.2.4. 訓練データに重なりがある場合（ソフトマージンSVM）
2つの分類のデータを重なりがある状態になるように、標準正規分布に沿った乱数で作成する。
![06_support_vector_machine_10_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/9b236bad-3fcc-5e11-fadc-a7b3faf2949a.jpeg)
![06_support_vector_machine_11_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/3e8a3c0a-7f86-d02a-e1b0-43d809f08ee9.jpeg)
最急降下法の使用（ただし外れ値に対応するため各イテレータの最後に値aを0からCの間に収めている。）
![06_support_vector_machine_11_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/ba1d6726-57e0-7405-5762-2aa87683f333.jpeg)
バイアスの取得およびSVMの決定関数による予測。
![06_support_vector_machine_12_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/039dee17-f71a-b347-a7ef-0b9968162a36.jpeg)
データおよびマージン、決定境界をプロットすると、ソフトマージンSVMでは重なりがあっても決定境界で分けられていることがわかる。
![06_support_vector_machine_13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/ea19946c-a53e-2ab7-5fe1-f8144ba632ef.jpeg)