分類アルゴリズムいろいろ（１）

#はじめに
こんにちは、supercellです。ここでは、ロジスティック回帰、SVMについて学習したことを復習としてまとめていきます。そのため、間違っていることもあると思うので教えていただけるとありがたいです。

#目次
1．ロジスティック回帰とは？
2．正則化とSVM



#1.ロジスティック回帰とは？
ロジスティック回帰では、正事象$p$の起こりやすさの対数をとったロジット関数を定義します。

```math
logit(p)=\ln \frac{p}{(1-p)}\tag{1}
```

ロジット関数は0~1の間の入力の値を全範囲の実数値へと変換します。そこで、全入力の値をロジット関数として定義します。

```math
logit(p(y=1 | x))=\sum_{i}w_ix_i=\mathbf{w^T}\mathbf{x}\tag{2}
```

ここで、$p(y=1|x)$は、特徴量xが与えられたときにサンプルがクラス1に属するという条件付確率です。
サンプルが所属する確率を予測するために、全入力の値を0~1へ変換する必要があります。そのため、ロジット関数の逆関数を定義します。この関数は**シグモイド関数**とよばれます。

```math
\phi(z)=\frac{1}{1+e^{-z}}\tag{3}
```

ここで、$z$は全入力としました。
シグモイド関数の出力はクラス1に属する確率としてみることができるので、その値をもとに成果指標に変換します。

```math
\hat{y}
=\left\{
\begin{array}{ll}
1 & \phi(z)\geqq0.5\\
0 & \phi(z)<0.5
\end{array}
\right.\tag{4}
```

ロジスティック回帰の重みの学習のために、コスト関数を定義します。
まず、データセットが互いに独立していると仮定して、尤度(結果からみてどれだけ確からしいか)を定義します。

```math
\begin{align}
L(\mathbf{w})
& =\prod_{i}P(y^{(i)}|x^{(i)};w)\\
& =\prod_{i}(\phi(z))^{y^{(i)}}(1-\phi(z))^{1-y^{(i)}}\tag{5}
\end{align}
```

微分を簡単にするために、$(5)$式の自然対数をとります。これは、**対数尤度関数**とよばれます。

```math
\ln L(\mathbf{w})=\sum_{i}[y^{(i)}\ln (\phi(z))+(1-y^{(i)})\ln(1-\phi(z))]\tag{6}
```

コスト関数として定義する場合は、$(6)$式にマイナスをつけます。

```math
J(\mathbf{w})=\sum_{i}[-y^{(i)}\ln (\phi(z))-(1-y^{(i)})\ln(1-\phi(z))])\tag{7}
```

この式を最小化するように重みを更新することになります。
以上がロジスティック回帰の説明となります。

# 2.正則化とSVM
##(1)正則化
機械学習では、過学習と学習不足と呼ばれる問題があります。

過学習では、トレーニングデータに適合しすぎて、未知のデータに対応することができない状態です。この状態をバリアンスが高いといいます。バリアンスは、モデルの予測値の平均のまわりでの期待値になります。

学習不足では、トレーニングデータのパターンを把握できず、未知のデータへ対応することができない状態です。この状態をバイアスが高いといいます。
バイアスは、真の値から予測値がどれだけ外れているかを表します。

機械学習では、うまくバイアスとバリアンスが高くならないように調整する必要があります。その方法の一つとして、**正則化**があります。
正則化では、極端なパラメータの重みにバイアスを追加します。
最も一般的な正則化は、**L2正則化**とよばれ、以下の式で表されます。

```math
\frac{\lambda}{2}||w||^2=\frac{\lambda}{2}\sum_j w_{j}^2\tag{8}
```

正則化を適用するために、コスト関数に正則化の項をたします。

```math
\ln L(\mathbf{w})=\sum_{i}[-y^{(i)}\ln (\phi(z))-(1-y^{(i)})\ln(1-\phi(z))]+\frac{\lambda}{2}||w||^2\tag{9}
```
正則化パラメータ$\lambda$を使用することで、重みを小さくしながら適合度を調整することができます。

##(2)サポートベクトルマシン(SVM)
サポートベクトルマシンは、**マージン**を最大化することを目標とします。マージンは、決定境界（超平面）とそれに最も近いサンプルとの距離で定義されます。
マージンを最大にすることで、過学習を防ぐことができます。
超平面を境にして、正と負の平面を定義します。

```math
w_0+\mathbf{w^Tx_{pos}}=1\tag{10}
```
```math
w_0+\mathbf{w^Tx_{neg}}=-1 \tag{11}
```
両辺で引き算すると、

```math
\mathbf{w^T(x_{pos}-x_{neg})}=2\tag{12}
```

となります。
ベクトルの長さをもちいて$(12)$式を標準化すると、

```math
\frac{\mathbf{w^T(x_{pos}-x_{neg})}}{||w||}=\frac{2}{||w||}\tag{13}
```

となります。
マージンを最大化するには、$(13)$式の右辺を最大化することになります。
簡単に求めるために、$\frac{1}{2}||w||^2$を最小化することにします。これは二次計画法で解くことができます。（ここでは説明しません）

さらに、超平面を調整するために、スラック変数$\xi$を導入します。この変数の導入により、線形分離不可能なデータへも対応することができるようになりました。
スラック変数は、追加の値として、式にたされます。

```math
w_0+\mathbf{w^Tx^{(i)}}\geqq1-\xi^{(i)}\quad(y^{(i)}=1)\tag{14}
```
```math
w_0+\mathbf{w^Tx^{(i)}}\leqq-1+\xi^{(i)}\quad(y^{(i)}=-1)\tag{15}
```
$(14)$、$(15)$式から、最小化すべき対象は次のようになります。

```math
\frac{1}{2}||w||^2+C(\sum_i\xi^{(i)})\tag{16}
```

$C$の値を調整することでマージンの幅を調整することができます。

以上がサポートベクトルマシンの説明となります。

#おわりに
今回から、なかなか難しい概念が登場しました。現段階では完全に理解できていないため、これから学びたいと思います。

#参考文献
[Python機械学習プログラミング](https://books.rakuten.co.jp/rb/15372260/?scid=we_lnk_ad_all_non_pla_201803&rmatt=tsid:|cid:1554621118|agid:64765595891|tid:aud-415830394243:pla-518495966591|crid:294410261752|nw:g|rnd:16758669098549568846|dvc:c|adp:1o1|mt:|loc:1009197&gclid=CjwKCAjwvNXeBRAjEiwAjqYhFrfm_e4dg97iTmGQ6a2fyEjU4jYgGZ5Bt1lOlMW-8FDbrxx1Stms8xoCuVoQAvD_BwE)