機械学習の手法についてまとめてみた（随時更新中）

**随時更新していきます（最終更新：2020/08/02）**

# はじめに
以前ちょっとだけ勉強したことがある機械学習を改めて学び直したい
→手法が多すぎてよくわからない
→とりあえず機械学習の手法について一通り触れておこう
、ということで[こちら](https://www.amazon.co.jp/%E8%A6%8B%E3%81%A6%E8%A9%A6%E3%81%97%E3%81%A6%E3%82%8F%E3%81%8B%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E5%9B%B3%E9%91%91-%E7%A7%8B%E5%BA%AD-%E4%BC%B8%E4%B9%9F-ebook/dp/B07KPSJKH8/ref=sr_1_1?adgrpid=89910844983&dchild=1&gclid=Cj0KCQjw0rr4BRCtARIsAB0_48NY3hUkcBryR_OH_B6BeN_RNxe6zdB_LBTvehx03NwN7mLaEBvg5loaAstZEALw_wcB&hvadid=413392632423&hvdev=c&hvlocphy=1009565&hvnetw=g&hvqmt=e&hvrand=3383347542780101867&hvtargid=kwd-973513833832&hydadcr=7974_11092240&jp-ad-ap=0&keywords=%E6%A9%9F%E6%A2%B0+%E5%AD%A6%E7%BF%92+%E5%9B%B3%E9%91%91&qid=1594797360&sr=8-1&tag=googhydr-22)をベースにまとめてみました。個人的なメモみたいなものなので、その点ご了承ください。

# 機械学習
機械学習は以下の3つに分類できる．

- 教師あり学習
- 教師なし学習
- 強化学習

## 教師あり学習
- [線形回帰](#線形回帰)
- [正則化](#正則化)
- [ロジスティック回帰](#ロジスティック回帰)
- [線形サポートベクトルマシン](#線形サポートベクトルマシン)
- [サポートベクトルマシン（カーネル法）](#サポートベクトルマシンカーネル法)
- [ナイーブベイズ](#ナイーブベイズ単純ベイズ)
- ランダムフォレスト
- ニューラルネットワーク 
- k近傍法（kNN）

## 教師なし学習
- 主成分分析（PCA）
- LSA
- NMF
- LDA
- k-means法
- 混合ガウス分布
- LLE
- t-SNE

## 強化学習
- TD学習
  - [Q学習](#q-学習)
  - [Sarsa](#sarsa)

---

## 特徴
### 線形回帰
異なる分布を持つデータ（曲線的な傾向，外れ値をもつなど）に対しても同じ学習パラメータになることがある．データを事前に可視化して検討するべき．

### 正則化
過学習を防ぐための手法の一つ．過学習の原因として，学習パラメータが極端に大きい（または小さい）値をとってしまうことが挙げられる．そのため，正則化では罰則項（正則化項）を加えそれを抑える．代表的な正則化手法として Ridge 回帰と Lasso 回帰がある．2次式の線形回帰（多項式回帰）に利用した例を以下に示す．
####  Ridge 回帰
$$ R(w) = \sum^{n}_{i=1} {(y_i-(w_0+w_1x_i+w_2x_i^2))^2+\alpha(w_1^2+w_2^2)} (\alpha\geq0)$$
$\alpha$は正則化の強さを表す．

####  Lasso 回帰
学習パラメータが0になりやすいため，特徴量を選択できる．

$$ R(w) = \sum^{n}_{i=1} {(y_i-(w_0+w_1x_i+w_2x_i^2))^2+\alpha(|w_1|+|w_2|)} (\alpha\geq0)$$
上記2つを混ぜた Elastic Net というのもある．
####  Elastic Net

$$ R(w) = \sum^{n}_{i=1}(y\_i-(w_0+w_1x_i+w_2x_i^2))^2+ \lambda \sum^{2}\_{j=1}(\alpha |w\_j| + (1-\alpha)w\_j^2) (\lambda\geq0, 0\leq\alpha\geq1)$$

### ロジスティック回帰
「回帰」とついているが分類に適用される。シグモイド関数$\sigma(z)$を用いる。
$$ \sigma(z) = \frac{1}{1+e^{-z}} $$
確率$p$を$p=\sigma(w^Tx+w_0)$で計算。損失関数は以下。
$$ L(y, f(x,w)) = \log{(1+\exp(-yf(x,w)))} $$
決定境界（分類結果が切り替わる境目）は50％になる箇所。

### 線形サポートベクトルマシン
分類と回帰どちらにも使える。マージン最大化により決定境界ができるだけデータから離れるように学習する。マージン内にデータが入り込むことを許容するかどうかでハードマージン、ソフトマージンに分けられる。マージン上とその内側のデータをサポートベクトルと呼ぶ。

### サポートベクトルマシン（カーネル法）
曲線のような複雑な決定境界を学習できる。線形分離不可能なデータを線形分離可能な高次元空間に移すことで決定境界を得る。カーネル関数により高次元空間を構築する。線形カーネル、シグモイドカーネル、多項カーネル、RBFカーネルなどがある。何を特徴量として見ているのかわからなくなるので、精度が要求される場合に利用すると良い。

### ナイーブベイズ（単純ベイズ）
自然言語の分類に利用されることが多い。文章を単語の集合に分解し、one-hot vectorとして扱う。分類（カテゴリ）毎に各単語の出現確率を計算する。このとき確率0は0.01などの小さい値にする（スムージング：学習データを増やすとその単語が出現した可能性があるため）。「すべての特徴量が互いに独立」という仮定があるが、それが成り立たないであろう実データに対しても、良い結果を出す場合がある。

### ランダムフォレスト

### ニューラルネットワーク 

### k近傍法（kNN）

---

## 強化学習
- 強化学習は動的計画法、モンテカルロ法、TD学習に分類される
- キーワード：状態、行動、報酬、方策、状態価値、行動価値、Bellman 方程式、etc

### TD 学習
- Temporal Difference（時間的差分）
- Q学習、Sarsaが有名
- 状態価値関数 $V(s)$ を以下の式で更新する（**TD(0)法**と呼ぶ）
- 行動はランダム

#### TD(0)法
$$
V(s_{t}) &larr; V(s_{t}) + \alpha (r_{t+1}+\gamma V(s_{t+1})-V(s_{t})) \\
=V(s_{t})+\alpha \delta_t
$$

#### nステップTD法
- TD(0)法において報酬をnステップ先まで拡張したもの
$$
V(s_{t}) &larr; V(s_{t}) + \alpha \\{R_t^{(n)} - V(s_{t})\\} \\\
R_t^{(n)} = R_{t+1}+\gamma R_{t+2} + \gamma^2 R_{t+3} + ... + \gamma^{n-1} R_{t+n} + \gamma^n V(s_{t+n})
$$

#### TD(λ)法
- 以下のn個の報酬を考える
  - $R_t^{(1)} = R_{t+1} + \gamma V(s_{t+!})$
  - $R_t^{(2)} = R_{t+1} + \gamma R_{t+2} + \gamma^2 V(s_{t+!})$
  - ...
  - $R_t^{(n)} = R_{t+1}+\gamma R_{t+2} + \gamma^2 R_{t+3} + ... + \gamma^{n-1} R_{t+n} + \gamma^n V(s_{t+n})$
- これらを$\lambda^{n-1}(0<\lambda<1)$で重み付けする（近いステップの報酬を重視するため）
$$R_t^{(1)} + \lambda R_t^{(2)} + \lambda^2 R_t^{(3)} + ...$$
- $R_t^{(n)}$の係数について、$1+\lambda+\lambda^2+...\to \frac{1}{1-\lambda}$なので、正規化するために$(1-\lambda)$をかけて、これを収益とする
$$R_t^{\lambda} = (1-\lambda)\sum_{n=1}^{T-t-1}\lambda^{n-1}R_t^{(n)} + \lambda^{T-t-1}R_t$$
  - 時間ステップ$T$を終端とする
  - $R_t$：終端に達した後のnステップ収益
  - $\lambda=0$のとき、$R_t^{\lambda}=R_t^{(1)}$：TD(0)法
  - $\lambda=1$のとき、$R_t^{\lambda}=R_t$：モンテカルロ法

###  Q 学習
- 行動価値関数 $Q(s,a)$ を以下の式で更新する
- ε-greedy 法などで行動を決定

$$Q(s_t,a_t) &larr; Q(s_t,a_t) + \alpha (r_{t+1}+\gamma \max_a Q(s_{t+1},a)-Q(s_t,a_t))$$

### Sarsa
- 行動価値関数 $Q(s,a)$ を以下の式で更新する
- Q学習と違うのは、値の更新に次の行動 $a_t$ に対応する $Q(s_t,a_t)$ を使うかどうか
  - Q学習：更新→行動選択
  - Sarsa：行動選択→更新

$$Q(s\_t,a_t) &larr; Q(s_t,a_t) + \alpha (r_{t+1}+\gamma Q(s_{t+1},a_{t+1})-Q(s_t,a_t))$$


## 参考
- [超入門！リッジ回帰・Lasso回帰・Elastic Netの基本と特徴をサクッと理解！](https://aizine.ai/ridge-lasso-elasticnet/)
- [機械学習で抑えておくべき損失関数（分類編）](https://www.hellocybernetics.tech/entry/2017/06/20/135402)
- [機械学習入門者向け Naive Bayes(単純ベイズ)アルゴリズムに触れてみる](https://avinton.com/academy/naive-bayes/)
- [データ解析14 ナイーブベイズ](https://www.slideshare.net/HirotakaHachiya/14-122960312)
- [深層強化学習アルゴリズムまとめ](https://qiita.com/shionhonda/items/ec05aade07b5bea78081)
- [今さら聞けない強化学習（9）: TD法の導出](https://qiita.com/triwave33/items/277210c7be4e47c28565)
- http://yagami12.hatenablog.com/entry/2019/02/22/210608
- [強化学習理論の基礎2](https://qiita.com/sconeman/items/b1aacfa924e52102e9d6)
- [強化学習について学んでみた。（その24）](https://yamaimo.hatenablog.jp/entry/2015/12/11/200000)