matlab
Octave
機械学習
coursera
重回帰分析

Coursera Machine Learning (2): 重回帰分析、スケーリング、正規方程式

More than 1 year has passed since last update.

 機械学習を学ぶのに最も適した教材と言われる、Machine Learning | Coursera を受講しているので、復習も兼ね学んだ内容を簡潔にまとめてみようと思います。

 第二弾は、重回帰分析 (multiple linear regression)、スケーリング (feature scaling)、正規方程式 (normal equation)です。

過去の記事
Coursera Machine Learning (1): 機械学習とは?単回帰分析、最急降下法、目的関数

重回帰分析 (Linear Regression with Multiple Variables)

 単回帰分析は、1つのアウトプット$Y$を1つのインプット$X$から予測する手法でした。重回帰分析は、$X$が1つのベクトル (vector)ではなく、複数のベクトルの集まり、マトリックス (matrix)になっただけです。

(例)志望校の合格可能性を、各教科の得点から予測する

テスト番号 数学の得点 英語の得点 国語の得点 理科の得点 社会の得点 志望校の合格可能性 (%)
1 40 60 20 10 10 10
2 70 70 60 60 40 30
3 70 90 40 40 60 50
4 80 80 50 90 70 80

 このとき、仮定関数 (Hypothesis Function)は、各教科の点数を$X$、志望校の合格可能性を$Y$とすると、重回帰分析では、$Y$は$X$によって以下のような1次関数の式で説明されます。

\hat{Y} = h_\theta (X) = \theta_0 x_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_3 +\theta_4 x_4+ \theta_5 x_5 = \theta^{\mathrm{T}} X^{\mathrm{T}} 

 このとき、$X$は4行(テスト数)6列(要素が全て1のベクトル + 5教科の得点)のマトリックス、$Y$は4行1列(志望校の合格可能性)のベクトル、$\theta$はそれぞれの説明変数(教科の得点)の重みづけをするパラメーターベクトルです。$\theta^{\mathrm{T}}$の$T$は転置行列 (transposed matrix、つまり、行と列を入れ替えた行列のこと)であることを示しています。

  X = \left[
    \begin{array}{rrr}
      1 & 40 & 60 & 20 & 10 & 10 \\
      1 & 70 & 70 & 60 & 60 & 40 \\
      1 & 70 & 90 & 40 & 40 & 60 \\
      1 & 80 & 80 & 50 & 90 & 70
    \end{array}
  \right]

  Y = \left[
    \begin{array}{rrr}
      10 \\
      30 \\
      50 \\
      80
    \end{array}
  \right]

  \theta = \left[
    \begin{array}{rrr}
      \theta_0 \\
      \theta_1 \\
      \theta_2 \\
      \theta_3 \\
      \theta_4 \\
      \theta_5 \\
    \end{array}
  \right]

 データに最もフィットするような$\theta$を探すために、実データとの誤差を定量化する目的関数 (cost function)と、目的関数の最小値を求めるためのアルゴリズムである最急降下法 (Gradient Descent)を導入します。

目的関数 (Cost Function)

   J(\theta) = \frac{1}{2m}\sum_{i=1}^m(h_\theta (x^{(i)}) - y^{(i)})^2

 このとき、$x^{(i)}$は、$i$番目のインプットデータ ($i = 2$なら、$x^{(2)}$はテスト番号2のときの各教科の点数)、$y^{(i)}$は、そのときの志望校の合格可能性 (= 30 [%])を表します。

 例によって、選んだパラメーター$\theta$を用いて計算した予測値$h_\theta (x)$と、実際の値$y$がどれだけずれているのか、二乗差をとって足し合わせ、平均を取っているだけですね。2で割っているのは、最小値を求めるために微分する際、$\sum$の中から来る2と相殺されるようにつけてあります。

最急降下法 (Gradient Descent)

   \theta_j := \theta_j - \alpha\frac{\partial}{\partial \theta_j}J(\theta)
             = \theta_j - \alpha \sum_{i=1}^m (h_\theta (x^{(i)}) - y^{(i)}) x_j ^{(i)}

 これを、$j = 0, 1, ... , n$それぞれについて同時に、$\theta_j$の値が収束するまで (目安としては、1回のアップデートでの値の変化が$10^{-3}$より小さくなるまで)繰り返します。1回のリピートで、パラメーター$\theta_j$は、(そのときの目的関数$J(\theta)$の傾き) x (学習率$\alpha$) だけ値が変化していきます。
 
 $\alpha$の値が大きければ、1回1回の$\theta$の値の変化が大きくなります。$\alpha$が小さければゆっくりでも確実に収束しますが、$\alpha$が大きすぎると値がとびとびになり、最急降下法を繰り返しているのに目的関数$J(\theta)$が小さくならない、ということもあり得ます。

fig3.PNG

スケーリング (feature scaling)


 説明変数のマトリックス$X$は、今回の例では教科の得点なので、どれも同じ範囲 (0 - 100)に収まっています。しかし、もし説明変数の範囲が互いにバラバラだったならば、スケーリング (feature scaling)をして、全ての説明変数の値の範囲を、おおよそ$ -1 \leq x_i \leq 1$にする必要があります。

x_i = \frac{x_i - mean(x)}{SD(x)}

あるいは、

x_i = \frac{x_i - mean(x)}{max(x) - min(x)}

とすれば、値の範囲をおおよそ-1から1にすることができます。$mean(x)$はベクトル$x$の平均値、$SD(x)$は$x$の標準偏差、$max(x)$、$min(x)$は、それぞれ最大値と最小値を表します。

 スケーリングの利点
 $\theta$同士の範囲に差があると、目的関数$J(\theta)$が非対称的な形になり、最急降下法で最小値にたどり着くまでに時間がかかります。スケーリングによって、目的関数$J(\theta)$が対称的な形となり、最急降下法で最小値までたどり着く時間が短くなります。

fig4.PNG

正規方程式 (Normal Equation)

 最急降下法以外に、目的関数$J(\theta)$の最小値を求める方法として、正規方程式 (normal equation)を解く方法があります。

\theta = (X^{\mathrm{T}} X)^{-1} X^{\mathrm{T}} y

 これを解くと、一発で目的関数$J(\theta)$が最小となる$\theta$を求めることができます。

 正規方程式があれば最急降下法なんていらないじゃん?

 と思うのが当然だと思います。

 ただ、最急降下法 (Gradient Descent)にもメリットがあり、正規方程式 (Normal Equation)にもデメリットはあります。

最急降下法
学習率$\alpha$を選ぶ必要がある
 
たくさんの繰り返しによって解にたどり着く
 
説明変数の数が多くても (n = 1,000,000程度)上手く動く
正規方程式
学習率$\alpha$を選ばなくてよい
 
直接解が求められる
 
Xのサイズが大きい場合、計算に時間がかかる

 なので、説明変数の数が100万を超えるような場合でなければ、正規方程式を使えばよいのですね。

pinv(X'*X)*X'*y

 Matlab / Octaveであれば、上記のコマンドで正規方程式を解くことができます。

まとめのまとめ

  • 重回帰分析とは、複数の説明変数で1つの目的変数を予測する方法である。
  • 目的関数 (cost function)の最小値を求めるには、最急降下法 (gradient descent)か正規方程式 (normal equation)を使う。
  • 説明変数同士の値の範囲を合わせるため、スケーリング (feature scaling)を用いる。

終わりに

 次回は主に、ロジスティック回帰 (logistic regression)による分類 (classification)のお話です。