【機械学習】社内輪講 Week7 〜サポートベクターマシン〜

## はじめに

[スタンフォード大学 Andrew Ng氏による機械学習の講義動画](https://www.coursera.org/learn/machine-learning)を各週社内メンバーで持ち回りで受講し、学んだことを発表、Qiitaで共有しています。  
その第七回が今回の記事です。

社内輪講をやるにあたっての記事です。  
[【機械学習】社内輪講はじめました](https://qiita.com/aoki-k/items/a25fe5e9d504f90f72f3)

第六回の講義が以下の記事
[【機械学習】社内輪講 Week6 〜モデルの評価と改善〜](https://qiita.com/i-chida/items/aaa84836e425e33d78c8)

## 本講義の導入
これまでの講義の中で、ロジスティック回帰やニューラルネットワークなど、様々なアルゴリズムを学んできましたが、
複雑な非線形のものを分類するアルゴリズムとして、もう一つ、紹介します。
それが、サポートベクターマシン。
アルゴリズムが明確で、優れた認識性能を発揮するので、様々なところで活用されており、人気のアルゴリズムの一つです。

### そもそもサポートベクターって？
データを分類し、他のクラスに一番近いデータをサポートベクトルと言います。
下記のような○と✖︎のデータがあったとすると、それぞれに一番近いデータ(赤丸)をサポートベクターとなります。
![1図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469340/2b0f3911-c977-dda0-ab79-cd72053055bd.png)

このサポートベクター間のマージンを最大化するのが、サポートベクターマシンです。

### まずは目的関数から
ロジスティック回帰の時はコスト関数を下記のように表しておりました。
(忘れたかたは[こちら](https://qiita.com/aoki-k/items/9c4214d6b5c955b91591))

```math
J(\theta) = -ylog(\frac{1}{1+e^{-z}})-(1-y)log(1-\frac{1}{1+e^{-z}})
```
```math
z = \theta^{T}x
```

上記を最小化するために、
- $y=1$のとき、$z>0$
- $y=0$のとき、$z<0$
となる$\theta$を学習させてました。

今回のサポートベクターマシンでは、ややこしいことはやめて、

$y=1$の時、$z$が1以上の時はコストが0、$z$が1以下の時は線形に増加
$y=0$の時、$z$が-1以下の時はコストが0、$z$が-1以上の時は線形に増加

とし、それぞれのコスト関数を

$y=1$の時、$cost_1(z)$
$y=0$の時、$cost_0(z)$

とします。

![1図1 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469340/5bf7c41d-cd1d-1e46-f41e-b9b612346e44.png)

その時、サポートベクターマシンの目的関数をロジスティック回帰の時のように当てはめると、下記のように記述できます。

```math
\frac{1}{m}[\sum_{i=1}^my^{(i)}cost_1(\theta^Tx^{(i)})+(1-y)^{(i)}cost_1(\theta^Tx^{(i)})]+\frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2
```
また、サポートベクターマシン用に、新しいパラメタ$C(C=\frac{m}{\lambda})$を設定すると、

```math
C[\sum_{i=1}^my^{(i)}cost_1(\theta^Tx^{(i)})+(1-y)^{(i)}cost_1(\theta^Tx^{(i)})]+\sum_{j=1}^n\theta_j^2
```
となります。
$C$がとても大きな値だとすると、、、
この目的関数を最小化しないといけないので、下記を最小化させたい。

```math
\sum_{i=1}^my^{(i)}cost_1(\theta^Tx^{(i)})+(1-y)^{(i)}cost_1(\theta^Tx^{(i)})
```

先ほどの、
$y=1$の時、$z$が1以上の時は$cost_1=0$
$y=0$の時、$z$が-1以下の時は$cost_0=0$
$z=\theta^Tx^{(i)}$
から考えると、
$y^{(i)}=1$の時、$\theta^Tx^{(i)}\geq1$
$y^{(i)}=0$の時、$\theta^Tx^{(i)}\leq-1$

その時の目的関数は以下となります。

```math
\sum_{j=1}^n\theta_j^2
```

すごいシンプルになりました。

### 決定境界の考え方

サポートベクターマシンがどのようにマージンを決定しているのかを考えていきます。

下記の図のようにベクトル$x$をベクトル$\theta$上に射影したものの長さを$p^{(i)}$とすると、
![図1 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469340/bd5dfe3e-af73-54f9-8ba6-3137bf2e0805.png)

$\theta^Tx^{(i)}$はベクトルの内積を計算してますので、

```math
\theta^Tx^{(i)}=p^{i}・\|\theta\|
```
となります。

さてここで、◯と×のような2種類のデータがあった時に、下記のように適当に2つを分類するような直線を引きます。

![図1 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469340/5d187288-b867-51a9-3d8e-b15b338bf0b9.png)

なんとなく、悪そう。

直線の垂線ベクトルを$\theta$、一番近い◯データを$x^{(i)}$とすると下記のようになります。

![図1 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469340/d222a196-d13b-1c6d-a6cd-21e9179f7edb.png)

ここで思い出していただきたいのが、

```math
\theta^Tx^{(i)}\leq-1
```
```math
\theta^Tx^{(i)}=p^{i}・\|\theta\|
```

この2つの式。
$\theta^Tx^{(i)}$を-1より小さい値にするためには、$\|\theta\|$は固定なので、$p^{i}$をできる限り長くなるような直線を引かなければならない。
こうして求められた直線が決定境界となります。

## カーネルについて
これまで、サポートベクターマシンで扱ってきたのが、線形分類のみでしたが、サポートベクターマシンでも非線形分類にも対応することができます。
それを可能にするのが、カーネルを用いた手法になります。
カーネルは重づけを行い、非線形の問題を線形に置き換えて考えようという手法です。

例えば下記のような非線形分類をサポートベクターマシンで行う時に、カーネルを使用します。(グラフが汚くてすみません。。。)

![図10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469340/ead90ece-9588-c2a8-fdf1-4194ae030e35.png)

そこで、入力値$x^{(i)}$を用いて新たな関数$f$を定義してきます。

まずは下記のように任意の3つのランドマーク$l^{(1)},l^{(2)},l^{(3)}$を設定したとします。

![図11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469340/cb8e0941-96c1-62a6-371d-a6321a54e55f.png)

この時、入力$x^{(i)}$とランドマークの近似値を$f_{(i)}$を下記のように表します。

```math
f_i=similarity(x, l^{(i)})=exp(-\frac{\|x-l^{(i)}\|}{2\sigma})
```

$\|x-l^{(i)}\|$はランドマークと入力とのユークリッド距離を表しており、
$x$が$l^{(i)}$から近ければ、$f_i\approx1$
$x$が$l^{(i)}$から遠ければ、$f_i\approx0$となります。

$\sigma$はどこまでの距離を許容するかのパラメータとなります。
$\sigma$が大きいと、ランドマークから離れるに連れて、$f_i$が緩やかに1から0になり、
$\sigma$が小さいと、ランドマークから離れるに連れて、$f_i$がすぐに1から0になります。

先ほどの3つのランドマーク$l^{(1)},l^{(2)},l^{(3)}$を設定した際は

```math
y=1　if　\theta_0+\theta_1f_1+\theta_2f_2+\theta_3f_3\geq0
```

```math
y=0　if　\theta_0+\theta_1f_1+\theta_2f_2+\theta_3f_3<0
```

と定義し、予測を行います。
こうすることで、サポートベクターマシンにおいても、非線形分類を解くことができます。


## ロジスティック回帰とサポートベクターマシンの使い分け
では、どの様にロジスティック回帰とサポートベクターマシンを使い分ければ良いのかをご紹介いたします。
大きく分けて下記の通り3つあります。

1. 特徴量の数が、サンプル数より多い場合は、ロジスティック回帰か、カーネルを使用しないサポートベクターマシン
2. 特徴量の数が、1000以下程度で、サンプル数が10,000程度とそこそこの場合は、カーネルを使用したサポートベクターマシン
3. 特徴量の数が、1000以下程度で、サンプル数が50,000以上と多い場合は、ロジスティック回帰か、カーネルを使用しないサポートベクターマシン

この3つをベースに、使い分けると、より効果的に活用できます。

以上、今回はサポートベクターマシンについての説明でした。

次回は[Week8 〜教師なし学習: 特に固有値問題〜](https://qiita.com/yyyokoy/items/4bec0f7aa1800da9e4f8)について学んでいきます。