機械学習の覚書 最小二乗法


---- e資格を目指すも数学が分からなすぎる自分のための覚書----

最小二乗法を使った線形回帰

■ 基本用語解説
回帰とは・・・連続した測定値間の関係の予測を行うこと。
線形とは・・・一次関数グラフのような直線で表される形。
線形回帰(linear regression)・・・連続した測定値の関係を予測し直線で表すこと。
Numpy・・・数学の計算に強いPythonのライブラリ。
最小二乗法・・・線形回帰を行うための計算方法の1つ。測定値と予測値の平均二乗誤差(MSE:Mean Square Error)が最小になるパラメータを導出する方法。

ここでは、以下を試す。

  • Numpyのnumpy.linalg.lstsq で回帰直線を描く
  • 数学的解法

Numpyで回帰直線

numpy.linalg.lstsq―NumPy v1.19.dev0 Manual

>>> import numpy as np
>>>
>>> import matplotlib.pyplot as plt
>>>
>>> x = np.array([0, 1, 2, 3])
>>> y = np.array([-1, 0.7, 0.9, 2.1])
>>> A = np.vstack([np.ones(len(x)),x]).T
>>> b,a = np.linalg.lstsq(A, y, rcond=None)[0]
>>> _ = plt.plot(x, y, 'o', label='Original data', markersize=10)
>>> _ = plt.plot(x, a*x + b, 'r', label='Fitted line')
>>> _ = plt.legend()
>>>
array([[1., 0.],
       [1., 1.],
       [1., 2.],
       [1., 3.]])
>>>
>>> a
0.95
>>>
>>> b
-0.7500000000000004
>>>
>>> plt.show()

直線が一発で表示された。
行列Aはnumpy.onesnumpy.vstackでは要素がすべて1の行をスタックし、$A$ = [$1$ [$x$]]の形になるように転置している。Aを計画行列というらしい

numpy.linalg.lstsq部分で最小二乗法で測定値と予測値の平均二乗誤差が最小になるパラメータを算出。解となるパラメータは回帰直線の傾き$a$と切片の$p$ です。

$p = [[m], [c]]$とすると$y = Ap$の行列の式で表せる。

既知の測定値$y$を使ってnumpy.linalg.lstsq最小二乗法で算出される。
結果、傾き$a=0.95$と切片$b=-0.75$の直線になった。


手計算で回帰直線

Numpyで作成した回帰直線ができるまでの最小二乗法のを数学式で導出する。
微分、行列演算公式や微分方程式の知識が必要なので公式・定理を補足で記載する。

最小二乗法では測定値$y$と予測値$\widehat {y}$の差分を誤差としてどのくらい離れているか計算する。各点での二乗差分を平均した値平均二乗誤差(MSE)で、MSEが最小になるような回帰直線を予測する。
二乗することで+-の符号がそろうことが利点。

線形回帰することは直線を求めたいので解は$p$ = [[$b$], [$a$]] 傾き$a$と切片$b$となる。

最小二乗誤差の公式

MSE=\dfrac {1}{n}\sum ^{n}_{i=1}\left( y_{i}-\widehat  {y_{i}}\right) ^{2}

MSEが最小になる、すなわちMSEを$p$で微分した時の解が0になるときのパラメータを求めればいい。

\dfrac {\partial }{\partial p} \left\{ \dfrac {1}{n}\sum ^{n}_{i=1}\left( y_{i}-\widehat  {y_{i}}\right) ^{2}\right\} =0\tag{1}
\dfrac {\partial }{\partial p} \left\{ \dfrac {1}{n}\sum ^{n}_{i=1}\left( y_{i}-x^{T}_{i}p\right) ^{2}\right\} =0\tag{2}
\dfrac {\partial }{\partial p}\ \left\{ \dfrac {1}{n}\ \left( y-Ap\right) ^{T}\ \left( y-Ap\right) \right\} =0 \tag{3} 

\dfrac {\partial }{\partial p}\ \left( y^{T}-A^{T}p^{T}\right)  \left( y-Ap\right)=0 \tag{4}
\dfrac {\partial }{\partial p}\left( y^{T}y-A^{T}p^{T}y-y^{T}Ap+A^{T}p^{T}Ap\right)=0 \tag{5}
\left( -A^{T}y+A^{T}Ap\right)=0 \tag{6}
A^{T}y=A^{T}Ap \tag{7}
\left( A^{T}A\right) ^{-1}A^{T}y=\left( A^{T}A\right) ^{-1}A^{T}Ap \tag{8}
p=\left( A^{T}A\right) ^{-1}A^{T}y \tag{9}

公式・定理

1)スカラーは転置しても変わらない。
$y$と$b$がベクトルで$A$が行列

yA^{T}b^{T}=\left( yA^{T}b^{T}\right) ^{-1}=bAy^{T}

2)スカラーをベクトルで微分。$a$はスカラーで$x$はベクトル。

\begin{aligned}\dfrac {\partial }{\partial x}a^{T}x=a\\ \dfrac {\partial }{\partial x}x^{T}a=a\\ \dfrac {\partial }{\partial x}x^{T}x=2x\end{aligned}


3)ベクトル$\mathbf{x}=(x_1,x_2, \ldots ,x_n)^T$と$\mathbf{y}=(y_1,y_2, \ldots ,y_n)^T$について、内積$\left| x\cdot y\right|$は以下となる。

\left| x\cdot y\right| = \displaystyle \sum_{i=1}^n x_i y_i \
\left| x\cdot y\right| = \mathbf{x}^T \mathbf{y} \

4)ベクトル$\mathbf{x}=(x_1,x_2, \ldots ,x_n)^T$と$\mathbf{y}=(y_1,y_2, \ldots ,y_n)^T$のスカラになる。L2ノルムは以下で表現できる。

\| \mathbf{x} \|^2 = \mathbf{x}^T \mathbf{x}  \
\mathbf x^{T}\mathbf y = \mathbf y^{T}\mathbf x\

追加用語集

回帰・・・連続した数値に対して予測を行うこと。
分類・・・どのグループに所属するか予測を行うこと。
線形回帰(linear regression)・・・1次関数のような比例の関数。y=ax+bを例にするとxを説明変数、yを目的変数といい関連が線形で表される。
回帰係数・・・回帰直線の傾き
非線形・・・高次元関数での説明変数と目的変数の関連。線形ではなく曲線となる。
単回帰・・・説明変数が1つ存在する。
重回帰・・・説明変数が高次元で複数存在する。
特徴量・・・説明関数と同意。
相関係数・・・線形回帰でxとyの関連の強さを表す。rで表すと(-1≧r1)。
最尤法・・・確率から線形回帰のパラメータを推定する方法の1つ。線形回帰では解は最小二乗法と一致する。


参考リンク

機械学習に詳しくなりたいブログ