学習レポート: 機械学習

# 前段
## 機械学習
- コンピュータプログラムは、タスクT(アプリケーションにさせたいこと)を性能指標Pで測定し、その性能が経験E(データ)により改善される場合、 タスクTおよび性能指標Pに関して経験Eから学習すると言われている (トム・ミッチェル 1997)
    - 人がプログラムするのは認識の仕方ではなく、学習の仕方

## 機械学習のモデリングプロセス
1. 問題設定
1. データ選定
1. データの前処理
1. 機械学習モデルの選定
1. モデルの学習(パラメータ推定)
1. モデルの評価

## 機械学習モデルの種類
- 教師あり学習: 予め正解が得られている
    - タスク: 予測
        - 線形回帰・非線形回帰(Regression)
    - タスク: 分類(Classification)
        - ロジスティック回帰
        - 最近傍・k-近傍アルゴリズム(k近傍法)
        - SVM(Support Vector Machine)
- 教師なし学習
    - タスク: クラスタリング
        - k-meansアルゴリズム(k平均法)
    - タスク: 次元削減
        - 主成分分析
- 半教師学習といったものもある
- 強化学習

## データの前処理(Preprocessing)
- 中心化(Centering)
    - データの平均値が0になるように全てのデータを平行移動する処理
    - これによって切片を考慮しなくてよくなる

# 線形回帰モデル
## 線形
- 比例で表される直線(2次元空間)、平面(3次元空間)、超平面(4次元以上空間)
    - 2次元空間だと$ y = ax + b $、3次元空間だと$ z = a·x + b·y + c$
    - n次元空間における超平面(hyperplane)の方程式
        - $ y = a_0 + a_1·x_1 + a_2·x_2 + \cdots + a_{n-1}·x_{n-1} $
        - $ y = a_0 + \displaystyle \sum_{i=1}^{n-1}a_i·x_i $
        - $ y = \displaystyle \sum_{i=0}^{n-1}a_i·x_i  , where &ensp; x_0 = 1 $
        - $ y = \boldsymbol{a}^T·\boldsymbol{x}, where &ensp; \boldsymbol{a} = \left(\begin{matrix} a_0 \\\ a_1 \\\ \vdots \\\ a_{n-1}\end{matrix}\right)$
            - $ \boldsymbol{a} $はn次元ベクトル
            - $ \boldsymbol{a}^T $で$ \left(\begin{matrix} a_0 & a_1 & \cdots & a_{n-1} \end{matrix}\right)$
            - $\boldsymbol{x}$もn次元ベクトル、$ \boldsymbol{x} = \left(\begin{matrix} x_0 \\\ x_1 \\\ \vdots \\\ x_{n-1}\end{matrix}\right)$

## 回帰問題
- ある入力(離散あるいは連続値)から出力(連続値)を予測する問題
    - 直線で予測: 線形回帰
    - 曲線で予測: 非線形回帰
- 回帰で扱うデータ
    - 入力: m次元のベクトル
        - 入力の各要素を説明変数または特徴量と呼ぶ
        - $ \boldsymbol{x} = \left(\begin{matrix} x_1 & x_2 & \cdots & x_{m} \end{matrix}\right)^T \in \mathbb{R}^m$
    - 出力: スカラー値
        - 目的変数
        - $ y \in \mathbb{R}^1 $

## 線形回帰モデル
- 回帰問題を解くための機械学習モデルの一つ
- 入力とm次元パラメータの線型結合を出力するモデル
    - 入力
        - $ \boldsymbol{x} = \left(\begin{matrix} x_1 & x_2 & \cdots & x_m \end{matrix}\right)^T \in \mathbb{R}^m$
    - パラメーター(重み、回帰係数)
        - $ \boldsymbol{w} = \left(\begin{matrix} w_0 & w_1 & w_2 & \cdots & w_m \end{matrix}\right)^T \in \mathbb{R}^{m+1}$
            - パラメーターは最小二乗法で推定する
    - 線型結合(入力とパラメーターの内積)
        - $ \hat{y} = \boldsymbol{w}^T \boldsymbol{x} + w_0 = \displaystyle \sum_{j=1}^{m}w_jx_j + w_0$
            - 予測値にはハットをつける

- 単回帰モデル
    - 説明変数(入力)が一次元
    - $ \boldsymbol{y} = \boldsymbol{X} \boldsymbol{w} + \boldsymbol{ε} $
        - $ \boldsymbol{X} = \left(\begin{matrix} \boldsymbol{x_1} & \boldsymbol{x_2} & \cdots & \boldsymbol{x_n} \end{matrix}\right)^T $
        - $ \boldsymbol{y} = \left(\begin{matrix} y_1 & y_2 & \cdots & y_n \end{matrix}\right)^T $
        - $ \boldsymbol{x_i} = \left(\begin{matrix} 1 &  x_i \end{matrix}\right)^T $
            - $x_0$を1とすることによって、$w_0$も同様に扱えるようにする
        - $ \boldsymbol{ε} = \left(\begin{matrix} ε_1 & ε_2 & \cdots & ε_n \end{matrix}\right)^T $
        - $ \boldsymbol{w} = \left(\begin{matrix} w_0 & w_i \end{matrix}\right)^T $
        - $ \left(\begin{matrix} y_1 \\\ y_2 \\\ \vdots \\\ y_n \end{matrix}\right) = \left(\begin{matrix} 1 & x_1 \\\ 1 & x_2 \\\ \vdots \\\ 1 & x_n \end{matrix}\right) \left(\begin{matrix} w_0 \\\ w_1 \end{matrix}\right) + \left(\begin{matrix} ε_1 \\\ ε_2 \\\ \vdots \\\ ε_n \end{matrix}\right) $
            - $ \boldsymbol{X} \boldsymbol{w} $はn×2行列と2×1行列の内積(結果はn×1行列となる)
- 線形重回帰モデル
    - 説明変数が多次元(m>1)
        - 重みは偏回帰係数と呼ぶ
    - 単回帰は直線だが、重回帰は超平面
    - $ \boldsymbol{y} = \boldsymbol{X} \boldsymbol{w} + \boldsymbol{ε} $
        - $ \boldsymbol{X} = \left(\begin{matrix} \boldsymbol{x_1} & \boldsymbol{x_2} & \cdots & \boldsymbol{x_n} \end{matrix}\right)^T $
        - $ \boldsymbol{y} = \left(\begin{matrix} y_1 & y_2 & \cdots & y_n \end{matrix}\right)^T $
        - $ \boldsymbol{x_i} = \left(\begin{matrix} 1 &  x_{i1} & \cdots & x_{im} \end{matrix}\right)^T $
        - $ \boldsymbol{ε} = \left(\begin{matrix} ε_0 & ε_1 & \cdots & ε_n \end{matrix}\right)^T $
        - $ \boldsymbol{w} = \left(\begin{matrix} w_0 & w_1 & \cdots & w_m \end{matrix}\right)^T $
        - $ \left(\begin{matrix} y_1 \\\ y_2 \\\ \vdots \\\ y_n \end{matrix}\right) = \left(\begin{matrix} 1 & x_{11} & \cdots & x_{1m} \\\ 1 & x_{21} & \cdots & x_{2m} \\\ \vdots & \vdots & \vdots & \vdots\\\ 1 & x_{n1} & \cdots & x_{nm} \end{matrix}\right) \left(\begin{matrix} w_0 \\\ w_1 \\\ \vdots \\\ w_m \end{matrix}\right) + \left(\begin{matrix} ε_1 \\\ ε_2 \\\ \vdots \\\ ε_n \end{matrix}\right) $
            - $ \boldsymbol{X} \boldsymbol{w} $はn×(m+1)行列と(m+1)×1行列の内積(結果はn×1行列となる)
            - $ \boldsymbol{X} $は計画行列/デザイン行列
- 線形回帰モデルでは最小二乗法でパラメーターを推定
    - 二乗誤差(残差平方和): データとモデル出力の二乗誤差の和
    - 平均二乗誤差MSE: Mean Squared Error
    $$ MSE_{train} = \dfrac{1}{n_{train}} \displaystyle \sum_{i=1}^{n_{train}} (\hat{y_i}^{(train)} - y_i^{(train)})^2 $$
    - 最小二乗法では、学習データの平均二乗誤差を最小とするパラメーターを探索する
        - その勾配がゼロになる点を求める
    - $ \hat{\boldsymbol{w}} = arg&ensp;min_{\boldsymbol{w} \in  \mathbb{R}^{m+1}}&ensp;MSE_{train} $
        - $ \dfrac{∂}{∂\boldsymbol{w}}MSE_{train} = 0 $
            - 以下では$_{train}, ^{(train)}は省略$
        - ⇒ $ \dfrac{∂}{∂\boldsymbol{w}}\lbrace\dfrac{1}{n} \displaystyle \sum_{i=1}^{n} (\hat{y_i} - y_i)^2 \rbrace = 0 $
            - $MSE$を展開
        - ⇒ $ \dfrac{1}{n}\dfrac{∂}{∂\boldsymbol{w}}\lbrace (\boldsymbol{X}\boldsymbol{w} - \boldsymbol{y})^T (\boldsymbol{X}\boldsymbol{w} - \boldsymbol{y})\rbrace = 0　$
            - 二乗を行列で表現(1×n行列とn×1行列の内積)
        - ⇒ $ \dfrac{1}{n}\dfrac{∂}{∂\boldsymbol{w}}\lbrace (\boldsymbol{w}^T\boldsymbol{X}^T - \boldsymbol{y}^T) (\boldsymbol{X}\boldsymbol{w} - \boldsymbol{y})\rbrace = 0　$
            - 転置の線形性　＆ 転置の公式        
        - ⇒ $ \dfrac{1}{n}\dfrac{∂}{∂\boldsymbol{w}}\lbrace \boldsymbol{w}^T\boldsymbol{X}^T\boldsymbol{X}\boldsymbol{w} - \boldsymbol{w}^T\boldsymbol{X}^T\boldsymbol{y} - \boldsymbol{y}^T\boldsymbol{X}\boldsymbol{w} + \boldsymbol{y}^T\boldsymbol{y})\rbrace = 0　$
            - $\lbrace\rbrace$内を展開 
        - ⇒ $ \dfrac{1}{n}\dfrac{∂}{∂\boldsymbol{w}}\lbrace \boldsymbol{w}^T\boldsymbol{X}^T\boldsymbol{X}\boldsymbol{w} - 2\boldsymbol{w}^T\boldsymbol{X}^T\boldsymbol{y} + \boldsymbol{y}^T\boldsymbol{y} \rbrace = 0　$
            - $ \boldsymbol{y}^T\boldsymbol{X}\boldsymbol{w}$はスカラなので、$ \boldsymbol{y}^T\boldsymbol{X}\boldsymbol{w} = (\boldsymbol{y}^T\boldsymbol{X}\boldsymbol{w})^T $
            - これを転置の公式で、$ (\boldsymbol{y}^T\boldsymbol{X}\boldsymbol{w})^T = \boldsymbol{w}^T\boldsymbol{X}^T\boldsymbol{y} $
        - ⇒ $　2\boldsymbol{X}^T\boldsymbol{X}\boldsymbol{w} - 2\boldsymbol{X}^T\boldsymbol{y}　= 0 $
            - ベクトルの微分計算
            - $ \dfrac{∂}{∂\boldsymbol{w}}( \boldsymbol{w}^T \boldsymbol{b} ) = \boldsymbol{b} $
            - $ \dfrac{∂}{∂\boldsymbol{w}}(\boldsymbol{w}^T \boldsymbol{A} \boldsymbol{w} ) = (\boldsymbol{A} + \boldsymbol{A}^T) \boldsymbol{w} $
        - ⇒ $　\boldsymbol{X}^T\boldsymbol{X}\boldsymbol{w} = \boldsymbol{X}^T\boldsymbol{y} $
            - 両辺を2で割って、一部を右辺に移動
        - ⇒ $　\hat{\boldsymbol{w}} = (\boldsymbol{X}^T\boldsymbol{X})^{-1}\boldsymbol{X}^T\boldsymbol{y} $
            - 両辺に左から$ (\boldsymbol{X}^T\boldsymbol{X})^{-1} $をかける
            - 正規方程式(Normal equation)が得られた
    - 回帰係数
        - $ \hat{\boldsymbol{w}} = (\boldsymbol{X}^{(train)T}\boldsymbol{X}^{(train)})^{-1}\boldsymbol{X}^{(train)T}\boldsymbol{y}^{train} $
        ```Python
        # (X^TX)^{-1}X^Tの部分を計算する
        w_wo_y = np.dot(np.linalg.inv(np.dot(X_train.T, X_train)), X_train.T)
        # w = (X^TX)^{-1}X^T · y
        w = np.dot(w_wo_y, ys)
        ```
    - 予測値
        - $ \hat{\boldsymbol{y}} = \boldsymbol{X_*}(\boldsymbol{X}^{(train)T}\boldsymbol{X}^{(train)})^{-1}\boldsymbol{X}^{(train)T}\boldsymbol{y}^{train} $
            - $\boldsymbol{X_*}$は、予測したい新しい$\boldsymbol{X}$

## 非線形回帰モデル
- 非線形な構造を持つ現象に対して、非線形モデリングを適用する
    - 例えば、$ y = w_0 + w_1x + w_2x^2 + w_3x^3 $
- $x$の代わりに、基底関数である$φ(x)$を用いる
    - $φ(x)$は$x$の何らかの関数
    - 例えば、$ y = w_0 + w_1φ_1(x) + w_2φ_2(x) + w_3φ_3(x) $
    - ただし、$\boldsymbol{x}$については非線形だが、パラメーター$\boldsymbol{w}$の観点では線形である(linea-in-parameter)ことに注意
        - このため、正確には「非線形モデルによる線形回帰」と言える
- 1次元の基底関数
    - 多項式: $φ_j = x^j$
    - ガウス型基底関数: $ φ_j(x) = exp \lbrace -\dfrac{(x - μ_j)^2}{2h_j} \rbrace $
        - $μ_j$が山の位置を、$h_j$が山の幅を規定する
- n次元の基底関数
    - 2次元ガウス型基底関数: $ φ_j(\boldsymbol{x}) = exp \lbrace -\dfrac{(\boldsymbol{x} - \boldsymbol{μ_j})^T(\boldsymbol{x} - \boldsymbol{μ_j)}}{2h_j} \rbrace $


    - 説明変数: $ \boldsymbol{x_i} = \left(\begin{matrix} x_{i1} & x_{i2} & \cdots & x_{im} \end{matrix}\right)^T \in \mathbb{R}^{m}$
    - 非線形関数ベクトル: $ \boldsymbol{φ}(\boldsymbol{x_i}) = \left(\begin{matrix} φ_1(\boldsymbol{x_{i}}) & φ_2(\boldsymbol{x_{i}}) & \cdots & φ_k(\boldsymbol{x_{i}}) \end{matrix}\right)^T \in \mathbb{R}^{k}$
    - 非線形関数の計画行列: $ \boldsymbol{Φ}^{(train)} = \left(\begin{matrix} \boldsymbol{φ}(\boldsymbol{x_{1}}) & \boldsymbol{φ}(\boldsymbol{x_{2}}) & \cdots & \boldsymbol{φ}(\boldsymbol{x_{n}}) \end{matrix}\right)^T \in \mathbb{R}^{n×k}$
    - 最尤法による予測値: $ \hat{\boldsymbol{y}} = \boldsymbol{Φ_*}(\boldsymbol{Φ}^{(train)T}\boldsymbol{Φ}^{(train)})^{-1}\boldsymbol{Φ}^{(train)T}\boldsymbol{y}^{train} $
        - ロジック自体は線形回帰と同じ

## 過学習と未学習
- 未学習: 学習データに対して、十分小さな誤差が得られていないモデル
    - 対策1: 学習データの数を増やし、学習を進める 
    - 対策2: より表現力の高いモデルを利用する
- 過学習: 学習データでの誤差は小さいが、テストデータでの誤差が大きい
    - 対策1: 学習データの数を増やし、学習を進める
    - 対策2: 不要な基底関数(変数)を削除して表現力を抑止
    - 対策3: 正則化法を利用して表現力を抑止
- 正則化法
    - $ S_γ = (\boldsymbol{y} - \boldsymbol{Φ}\boldsymbol{w})^T(\boldsymbol{y} - \boldsymbol{Φ}\boldsymbol{w}) + γR(\boldsymbol{w}) $の最小化を図る
        - $γR(\boldsymbol{w})$が罰則項で、モデルの複雑さに伴う罰則を加える
    - 正則化項(罰則項)
        - ない: 最小2乗推定量
        - L2ノルム($ \sqrt{x_1^2+x_2^2+\cdots+x_n^2} $): Ridge推定量
            - Ridgeは円なので、円の中で0に近づける(が0になるのは難しい)
        - L1ノルム($ |x_1| + |x_2| + \cdots + |x_n| $): Lasso推定量
            - Lassoの方が角が尖っているので、いくつかのパラメーターが0になる(結果的にスパースになる)
    - 正則化項を加えると、($\boldsymbol{w}$が大きい)本当のMSEにはならず、L2ノルムやL1ノルムを満たす($\boldsymbol{w}$が制約される)中での最小値となる

## データ分割と汎化性能
- データの分割
    - 学習用データ：　機械学習モデルの学習に利用するデータ
    - 検証用データ： 学習済みモデルの精度を検証するためのデータ
- 分割することにより、モデルの汎化性能(Generalization)を測定する
- 過学習と未学習
    - 訓練誤差(学習用データでの誤差)もテスト誤差(検証用データでの誤差)も小さい: 汎化しているモデルの可能性
    - 訓練誤差(学習用データでの誤差)は小さいが、テスト誤差(検証用データでの誤差)が大きい(むしろ大きくなっていっている): 過学習
    - 訓練誤差(学習用データでの誤差)もテスト誤差(検証用データでの誤差)も小さくならない: 未学習
- ホールドアウト法
    - 有限のデータを学習用と検証用の2つに分割
        - 学習用データの数が少ないと、十分な学習ができない
        - 検証用データの数が少ないと、性能評価の精度が悪くなる
- クロスバリデーション(交差検証)
    - データをn分割し、そのうちの一つを検証用、残りを学習用とする
    - 検証用を入れ替えながら、n個モデルを作る(モデル1-1, 1-2, ..., モデル1-n)
    - n個のモデルをそれぞれ性能検証する
        - 精度の平均をCV(Cross Validation)値と呼ぶ
            - 精度はあくまでも検証用データでの精度
    - モデルを変えながら(例えば基底関数を変える、これによってモデル2-1, 2-2, ..., モデル2-nを作る)、それぞれCV値を算出し、CV値が最も低いモデルを採用する
- ハイパーパラメーターの調整
    - グリッドサーチ
        - パラメーターの組み合わせをしらみつぶしして、最適なものを探す
    - BO(ベイズ最適化)
        - ハイパーパラメーターも含めて最適化問題とする
        - 過去の試行結果から次に行う範囲を確率分布を用いて計算する
        - 最近はこちらが主流


# ロジスティック回帰モデル

## 分類問題
- ある入力(数値)からクラスに分類する問題
- 分類で扱うデータ
    - 入力: m次元のベクトル
        - 入力の各要素を説明変数または特徴量と呼ぶ
        - $ \boldsymbol{x} = \left(\begin{matrix} x_1 & x_2 & \cdots & x_{m} \end{matrix}\right)^T \in \mathbb{R}^m$
    - 出力: スカラー値
        - 目的変数
        - $ y \in \lbrace 0, 1 \rbrace $ (0 or 1の値)
- 3つのアプローチ
    - 識別的アプローチ
        - $ p(C_k|\boldsymbol{x}) $を直接モデル化
    - 生成的アプローチ
        - $ p(C_k) $と$ p(\boldsymbol{x}|C_k) $をモデル化し、その後Bayesの定理を用いて$ p(C_k|\boldsymbol{x}) $を求める
    - 識別的アプローチには識別関数の構成もある
        - 例えば、$ \begin{cases} f(\boldsymbol{x}) \geqq 0 ⇒ C = 1 \\\\ f(\boldsymbol{x}) < 0 ⇒ C = 0 \end{cases} $
        - SVMなど
    - ロジスティック回帰は識別的アプローチ

## ロジスティック回帰モデル
- 分類問題を解くための教師あり機械学習モデル
    - 入力とm次元パラメーターの線型結合をシグモイド関数に入力
    - 出力(シグモイド関数の出力)は$ y = 1 $になる確率の値
    - 入力
        - $ \boldsymbol{x} = \left(\begin{matrix} x_1 & x_2 & \cdots & x_m \end{matrix}\right)^T \in \mathbb{R}^m$
    - パラメーター(重み)
        - $ \boldsymbol{w} = \left(\begin{matrix} w_0 & w_1 & w_2 & \cdots & w_m \end{matrix}\right)^T \in \mathbb{R}^{m+1}$
            - パラメーターは最小二乗法で推定する
    - 線型結合(入力とパラメーターの内積)
        - $ \hat{y} = \boldsymbol{w}^T \boldsymbol{x} + w_0 = \displaystyle \sum_{j=1}^{m}w_jx_j + w_0$
        - ただこのままだと$y$は実数になってしまう
- シグモイド関数
    - ロジスティック関数ともいう
    - $ \boldsymbol{w}^T\boldsymbol{x} \in \mathbb{R} $の出力を$ y \in \lbrace 0, 1 \rbrace $につぶす
        - 入力は実数、出力は0〜1の値
    - $ σ(x) = \dfrac{1}{1 + exp(-ax)} $
        - $a$を増加させると、$x=0$付近での曲線の勾配が増加
    - シグモイド関数の微分は、シグモイド関数自身で表現できる
        - $ \dfrac{∂σ(x)}{∂x} = aσ(x)(1-σ(x)) $
- シグモイド関数を経ることによって、以下のようになる
    - $ P(Y = 1|\boldsymbol{x}) = σ(\boldsymbol{w}^T \boldsymbol{x} + w_0) $
        - $σ$はシグモイド関数
        - シグモイド関数の出力は確率になり、データYは確率が0.5以上ならば1、未満ならば0と予測することが可能になる
- 逆に、対数オッズを線形回帰により予測するという言い方もできる
    - 発生確率$P$を対数オッズ(ロジット)に変換することをロジット変換という
    - $ logit(P) = log(\dfrac{P}{1-P}) $
    - 逆に対数オッズ(ロジット)を確率に変換するのが、ロジスティック変換であり、これを実現しているのが、シグモイド関数(ロジスティック関数)

## 最尤推定
- 確率分布
    - 様々な確率分布が存在する
        - 正規分布、t分布、ガンマ分布、一様分布、ディリクレ分布…
        - ロジスティック回帰ではベルヌーイ分布を利用する
    - ベルヌーイ分布
        - 数学において、確率$p$で1 、確率$(1 − p)$で0 をとる、離散確率分布
            - コイン投げのイメージ
        - $ P(y) = p^y(1-p)^{1-y} $
            - Yが0になる確率と、1になる確率を一つの式で表している
- 最尤推定: データからそのデータを生成したであろう尤もらしい分布(パラメーター)を推定したい
    - n回の試行で$y_1, y_2, \cdots, y_n$が同時に起こる確率(pは既知)
        - $ P(y_1, y_2, \cdots, y_n; p) = \displaystyle \prod_{i=1}^n p^{y_i}(1-p)^{1-y_i} $
    - 逆に$y_1, y_2, \cdots, y_n$のデータが得られた際の尤度関数
        - $ P(y_1, y_2, \cdots, y_n; p) = \displaystyle \prod_{i=1}^n p^{y_i}(1-p)^{1-y_i} $
            - ここでは$p$が未知
        - 尤度関数を最大化するようなパラメーターを選ぶ推定方法を最尤推定という
            - $ P(y_1, y_2, \cdots, y_n| w_0, w_1, \cdots, w_m) $
            $ = \displaystyle \prod_{i=1}^n p^{y_i}(1-p)^{1-y_i} $
            $ = \displaystyle \prod_{i=1}^n σ(\boldsymbol{w}^T\boldsymbol{x_i})^{y_i}(1-σ(\boldsymbol{w}^T\boldsymbol{x_i}))^{1-y_i} $
            $ = L(\boldsymbol{w}) $

            - 尤度関数Lを最大とするパラメーターを探索する
    - 対数をとると微分の計算が簡単になる
        - 実装時の計算時の桁落ちを防ぐためにもlogをとることが必要
        - $ E(w_0, w_1, \cdots, w_m) $
        $ = - \log L(w_0, w_1, \cdots, w_m) $
        $ = - \displaystyle \sum_{i=1}^n \lbrace y_i \log p_i + (1 - y_i) \log (1 - p_i) \rbrace $
            - ここで$p_i = σ(\boldsymbol{w}^T\boldsymbol{x_i}) $
            - 尤度は積$\prod$だが、対数になることで和$\sum$になる
            - 対数尤度関数が最大になる点と尤度関数が最大になる点は同じ
            - 尤度関数にマイナスをかけたものを最小化、とすることによって、最小2乗法の最小化と考え方を揃える
- 勾配降下法(Gradient descent): 反復学習によりパラメーターを逐次的に更新するアプローチの一つ
    - 最小二乗法は、微分が0になる値を解析的に求めることが可能
    - これに対し、対数尤度関数で解析的に値を求めることが困難
    - $ \boldsymbol{w}^{(k+1)} = \boldsymbol{w}^{(k)} - η\dfrac{∂E(\boldsymbol{w})}{∂\boldsymbol{w}} $
        - $η$は学習率というハイパーパラメーターであり、パラメーターの収束のしやすさを調整
        - $ \dfrac{∂E(\boldsymbol{w})}{∂\boldsymbol{w}} = - \displaystyle \sum_{i=1}^n (y_i-p_i) \boldsymbol{x_i} $
        - 結果的に、$ \boldsymbol{w}^{(k+1)} = \boldsymbol{w}^{(k)} + η \displaystyle \sum_{i=1}^n (y_i-p_i) \boldsymbol{x_i}$
    - ただし、勾配降下法では、パラメーターを更新するのにn個全てのデータに対する和を計算する必要がある
    - これを回避するために、確率的勾配降下法が利用できる
- 最急降下法(Gradient decent, steepest descent)
    -  一般的な勾配降下法
- 確率的勾配降下法(SGD: Stochastic gradient descent)
    - バッチ学習が前提である最急降下法をオンライン学習用に改良したもの
    - データを一つずつランダムに選んでパラメーターを更新
    - 勾配降下法でパラメータを1回更新するのと同じ計算量でパラメータをn回更新できるので効率よく最適な解を探索可能
        - $ \boldsymbol{w}^{(k+1)} = \boldsymbol{w}^{(k)} + η(y_i-p_i) \boldsymbol{x_i}$
- Momentum SGD
    - SGDに慣性項(Momentum)を付与した手法
        - $ \boldsymbol{w}^{(k+1)} = \boldsymbol{w}^{(k)} - η\dfrac{∂E(\boldsymbol{w})}{∂\boldsymbol{w}}　+ αΔ\boldsymbol{w} $
            - ここで$Δ\boldsymbol{w}$は、$\boldsymbol{w}^{k} - \boldsymbol{w}^{(k-1)}$
    - αは慣性項のパラメータであり、前回の更新量にα倍して加算することでパラメータの更新をより慣性的なものにする

## 分類の評価方法
- 混同行列(Confusion Matrix)
    |--|--|実際の値|実際の値|
    |--|--|--|--|
    |--|--|positive|negative|
    |モデルの予測結果|postive|真陽性(True Positive)|偽陽性(False Positive)|
    |モデルの予測結果|negative|偽陰性(False Nagative)|真陰性(True Negative)|
- 正解率(Accuracy)
    - 正解した数 / 予測対象となった全データ数
    - $ \dfrac{TP+TN}{TP+FN+FP+TN} $
    - しかし分類したいクラスに偏りがある場合、正解率はあまり意味をなさない
        - 例えば、90%がAだった場合、全てAと予測するだけで正解率90%となる
- 再現率(Recall)
    - 「本当にPositiveなもの」の中から、Positiveと予測できる割合
        - 本当にNegativeなものは考慮していない
    - $ \dfrac{TP}{TP+FN} $
    - Positiveの抜け漏れを少なくしたい場合に利用
        - 例えば病気の検診
        - FNを最小化したい、逆にFPは再検査で救えるため許容
- 適合率(Precision)
    - モデルが「Positive」と予測したものの中で、本当にPositiveである割合
    - $ \dfrac{TP}{TP+FP} $
    - 見逃し(False Negative)が多くても、より正確な予測をしたい場合に利用
        - 「重要なメールをスパムメールと誤判別」されるより「スパムと予測したものが確実にスパム」である方が有益
        - スパムメールを検出できなくても(False Negative)、自分で対処可能
- F値
    - 再現率と適合率両方が高いのが理想的だが、実際には両者はトレードオフの関係にある
    - このため、再現率(Recall)と適合率(Precision)の調和平均をF値として利用することがある
        - F値が高いほど、Recall/Precisionが高い
    - $ F値　= 2\dfrac{Recall * Precision}{Recall + Precision} $

# サポートベクターマシーン(SVM: Support Vector Machine)
- 教師あり学習
- 分類と回帰どちらでも適用可能
- サポートベクターから最大限マージンを取るように決定境界線を決定する
    - サポートベクター: 境界線(面)の最も近くにあるデータ点（マージン上にある）
        - マージンの外側のデータは予測に影響を与えない
    - ハードマージンは誤分類を許容しないが、ソフトマージンはある程度誤分類を許容する
        - ハードマージンは外れ値一つで境界線が大きく変わってしまい、過学習を起こしやすい
        - ソフトマージンは誤分類を許容するので、外れ値によって境界線が大きく変わることがなく、ロバスト性が増す
        - ソフトマージンでは、マージンの中にデータが入ることも許容する
- マージンを最大化しつつ，誤分類を減らしていくという最適化問題を解く
    - マージンの最大化は、マージンの逆数の最小化と考え、以下を最適化する
        - $ min \lbrace \dfrac{1}{M} + C \displaystyle \sum_{i=1}^m𝜉_i \rbrace $
            - $M$はマージン、$𝜉_i$は𝑖番目のデータがマージンを侵した具合(=残差)
            - パラメーター$C$によって、どれだけ誤分類を許容するかが決まる
                - $C$が大きいと，$𝜉$は小さくないといけないので、誤分類をあまり許容しない、逆に$C$が小さいと、比較的誤分類を許容する
- 一般的な線形分類器の決定境界は超平面になる
    - 超平面は以下の式で表される
        - $ θ_0 + θ_1x_1 + θ_2x_2 + \cdots + θ_nx_n = 0 $
    - $x_0 = 1$とすると、
        - $ θ_0x_0 + θ_1x_1 + θ_2x_2 + \cdots + θ_nx_n = 0 $
    - これをベクトルで表記すると、
        - $ θ^T \boldsymbol{x} = 0 $
    - $ θ^T \boldsymbol{x} < 0 $が>0か、<0かで超平面のどちら側にあるかを判定する
- あるデータ$\boldsymbol{x}$から超平面への距離は、
    - $ d = \dfrac{|θ_0x_0 + θ_1x_1 + θ_2x_2 + \cdots + θ_nx_n|}{\sqrt{θ_0^2 + θ_1^2 + θ_2^2 + \cdots + θ_n^2}} $
    - この距離がマージンとなり、これを最大化するためには、分母である$ \sqrt{θ_0^2 + θ_1^2 + θ_2^2 + \cdots + θ_n^2} $を最小化する
        - 平方根を外して、$ min \displaystyle \sum_{j=0}^n{θ_j^2} $と表現できる
- $ θ^T \boldsymbol{x} < 0 $が>0か、<0かで超平面のどちら側にあるかを判定するが、実際にはマージンを取ることを考慮し、損失を計算する際に$ θ^T \boldsymbol{x} $が$ <-1 $(y=0の時)、また$ > 1 $(y=1の時)には損失は0とし、それ以外の場合に損失を線形に増やす
    - そのためにヒンジ損失(hinge loss)を利用する
        - 正解ラベルが1のデータでは、$ θ^T \boldsymbol{x}　> 1 $であれば損失が0
        - 正解ラベルが0のデータでは、$ θ^T \boldsymbol{x}　< -1 $であれば損失が0
- ハードマージンの場合、以下を制約として、$ \displaystyle \sum_{j=0}^n{θ_j^2} $を最小化する
    - $ θ^T \boldsymbol{x}> 1 &ensp;\text{if}&ensp; y_i = 1 $
    - $ θ^T \boldsymbol{x}< -1 &ensp;\text{if}&ensp; y_i = 0 $
- ソフトマージンの場合、変数$𝜉_i$(スラック変数)を導入して上記の制約を以下のように緩め、損失関数$ \displaystyle \sum_{j=0}^n{θ_j^2} + C \sum_{i=1}^m{𝜉_i}$ の最小化を図る
    - $ θ^T \boldsymbol{x}> 1-𝜉_i &ensp;\text{if}&ensp; y_i = 1 $
    - $ θ^T \boldsymbol{x}< -(1-𝜉_i) &ensp;\text{if}&ensp; y_i = 0 $
- カーネルトリック
    - 一見線形分離ができなそうなデータも、高次元特徴量を作ることで線形分離させることができる(高次元に写像する)
        - 例えば、$x$を$(x, x^2)$の二次元空間に写像する
        - この際、写像する関数を$Φ(x)$で表し、$Φ(x_i)^TΦ(x_j)$の計算を行う
    - 計算量を減らすために、$Φ(x_i)^TΦ(x_j)$を一つの関数に置き換える
        - $ K(x_i, x_j) = Φ(x_i)^TΦ(x_j) $
        - $ K(x_i, x_j) $がカーネル関数
    - よく使われるカーネル関数
        - 正規化線形カーネル
            - $ K(x, x') = \dfrac{x^Tx'}{||x||||x'||}$
        - 多項式カーネル
            - $ K(x_i, x_j) = (x_i^Tx_j+c)^d $
        - ガウスカーネル(RBFカーネル、動径基底関数)
            - $ K(x_i, x_j) = exp\lbrace -\dfrac{||x_i - x_j||^2}{2σ^2} \rbrace $
        - シグモイドカーネル
            - $ K(x_i, x_j) = -\dfrac{1}{1+exp(-γx_i^Tx_j)} $
        - これらのカーネル関数を使い、
            - $ f(x) = \displaystyle \sum_{i=1}^ma_iK(x, x_i) $
            - 未知のデータ$x$に対して全ての学習データ$x_i$とのカーネル関数の結果を係数$a_i$を使って線形結合した形にする
- 計算例: TBF

# 決定木とランダムフォレスト
- 決定木とは特定の特徴がよく現れるようなデータのかたまりを見つけ、その分類ルールを生成する機械学習の手法
    - 目的変数の特徴が固まって存在するようなデータグループを見つけていく
    - 複数の説明変数を使った条件でデータを分割していくことで、そのデータ領域内における目的変数の特徴の濃度を高めていく
    - 得られた説明変数の条件で構成されるデータの分岐ルール（If-Thenの条件ルール）をツリー構造で生成する
    - 決定木には分類木と回帰木という2つのタイプがある(つまり、分類と回帰両方に利用できる)
        - 回帰木の場合、各データ領域内の値の平均値を期待値として評価する
- 分岐は情報利得の最大化(=不純度の減少量の最大化)を実現するように決定する
    - 実際の分岐の指標としては、モデルにより、ジニ係数、カイ2乗統計量、エントロピーなどを利用する
- データのスケールを事前に揃えておく必要がない、分析結果の説明が容易であるなどのメリットがある
- 決定木とバギングを組み合わせたものが、ランダムフォレスト
    - 複数の決定木を作成し、その多数決で最終的な結果を出す

# 主成分分析(Principal Component Analysis)
- 教師なし学習
- 主成分(複数の変量を、相関のない少数で全体のばらつきを最も表すもの)を組み合わせて次元削減を行う
    - 類似する(=相関性の高い)複数の説明変数を合成し、主成分とすることで次元削減を行う
- 分散が最大になる(データの散らばりが残っている)ような次元圧縮を行う
- 主成分はノルム(長さ)が1になるように正規化する
- 主成分は互いに直交する
- 計算例: TBF
- ちなみに、因子分析も次元削減に利用される
    - 因子分析とは、変数の背後にある潜在的な要因を発見する分析手法
    - 変量間に存在する潜在要因を探し出して次元削減する

# k近傍法(kNN)
- 教師あり学習
- 分類
- 最近傍のデータをk個取ってきて、それらがもっとも多く所属するクラスに識別
    - k=1だと最近傍法
- kの値を変えると分類結果も変わる
- kを大きくすると決定境界は滑らかになる
- 一個抜き交差検証法(leave-one-out cross-validation)
    - 1個のデータのみをテスト用に利用し、残りを全て学習データとして利用する交差検証
        - データの数だけ学習を繰り返し、モデルごとにテストして得られた結果を平均し算出

# k平均法(k-means)
- 教師なし学習
- クラスタリングの手法
    - 与えられたデータをk個のクラスタに分類する
- 手順
    1. 各クラスタの中心の初期値を設定
    1. 各データ点に対し、各クラスタ中心との距離を計算し、最も距離が近いクラスタを割り当てる
    1. 各クラスタの平均ベクトル(中心)を計算する
    1. クラスタの最割り当てと中心の更新を繰り返す
- kの値を変えるとクラスタリング結果も変わる
- 初期値が近いとうまくクラスタリングできない
    - 改良版であるk-means++は最初の中心点を距離が遠いほど確率的に選ばれやすくするアルゴリズムを採用する

# その他の教師なし学習
## ウォード法
- k-meansと異なるクラスタリング手法としてウォード法がある
    - k-meansと異なり、クラスタの階層構造を求めるまで行う
    - 結果は樹形図(デンドログラム)として表される

## 協調フィルタリング
- リコメンデーションに用いられる手法
- ユーザー間の類似度を定義することで、類似度が高いユーザーが購入済みの商品を推薦する
    - ただし、事前にある程度データがないと機能しないというコールドスタート問題がある
- 逆に商品側に特徴量を付与し、特徴が似ている商品を推薦するのはコンテンツベースフィルタリング

## トピックモデル
- クラスタリングを行うが、トピックモデルでは複数のクラスタにデータを分類する
    - 代表的なのが、潜在的ディリクレ配分法(LDA, Latent Dirichlet Allocation)

# 参考文献
- [ディープラーニング入門 Chainer チュートリアル](https://tutorials.chainer.org/ja/tutorial.html)
- ディープラーニングG検定公式テキスト(第2版)
- ディープラーニングE資格エンジニア問題集
- 機械学習のエッセンス -実装しながら学ぶPython,数学,アルゴリズム- (Machine Learning)