【最小二乗法】わかりやすく絵で説明/直線フィッティングの計算


 ここではデータ点を 一次関数 を用いて最小二乗法でフィッティングする。二次関数・三次関数でのフィッティング式は こちら

下の5つのデータを直線でフィッティングする。



1. 最小二乗法とは?

フィッティングの意味

フィッティングする一次関数は、

    \begin{eqnarray*} y=ax+b \end{eqnarray*}

の形である。データ点をフッティングする直線を求めたいということは、知りたいのは傾き \textcolor{red}{a} と切片 \textcolor{red}{b} である!

上の5点のデータに対して、下のようにいろいろ直線を引いてみよう。それぞれの直線に対して 傾きと切片 が違うことが確認できる。

こうやって、自分で傾き切片を変化させていき、最も「うまく」フィッティングできる直線を探すのである。



「うまい」フィッティング

 「うまく」フィッティングするというのは曖昧すぎる。だから、「うまい」フィッティングの基準を決める。

 試しに引いた赤い直線と元のデータとの「差」を調べる。たとえば i 番目のデータ (x_i,y_i) に対して、直線上の点 y=ax_i+b とデータ点 y_i との差を見る。

    \begin{eqnarray*} y_i-(ax_i+b) \end{eqnarray*}

しかしこれは、データ点が直線より下側にあればマイナスになる。単にどれだけズレているかを調べるためには、二乗してやれば良い。

これでズレを表す量がプラスの値になった。他の点にも同じようなズレがあるため、それらを全部足し合わせてやればよい。どれだけズレているかを総和したものを L(a,b) とおいておく。


ポイント

    \begin{eqnarray*} L(a,b)=\sum_{i=1}^{5}\left\{ y_i-(ax_i+b) \right\}^2 \end{eqnarray*}


この関数は a,b2変数とする。これは、傾きと切片を変えることは、直線を変えるということに対応し、直線が変わればデータ点からのズレも変わってくることを意味している。



最小二乗法

 あとはデータ点からのズレの最も小さい「うまい」フィッティングを探す。これは、2乗のズレの総和 L(a,b)最小にしてやればよい。これが最小二乗法だ!

L(a,b) は2変数関数であった。したがって、下図のように L(a,b)最小となる点を探して、a,b(傾き、切片)を求めれば良い^*

 2変数関数の最小値を求めるのは偏微分の問題である。以下では具体的に数式で計算する。



2. 最小値を探す

最小値をとるときの条件

L(a,b) の2変数関数の最小値になる (a,b) は以下の条件を満たす。

    \begin{eqnarray*} \begin{cases} \frac{\partial L(a,b)}{\partial a}=0\\\\ \frac{\partial L(a,b)}{\partial b}=0 \end{cases} \end{eqnarray*}

2変数に慣れていない場合は、y=f(x) を思い出してほしい。下に凸の放物線の場合は、f'(x)=0 のときの x で最小値になるだろう(接線の傾きゼロ)。



計算

    \begin{eqnarray*} L(a,b)=\sum_{i=1}^{5}\left\{ y_i-(\textcolor{red}{a}x_i+\textcolor{blue}{b}) \right\}^2 \end{eqnarray*}

\textcolor{red}{a}偏微分する。中身の微分とかに注意する。

    \begin{eqnarray*} \frac{\partial L(a,b)}{\partial a} &=&2\sum_{i=1}^{5}\left(y_i-(ax_i+b)\right)(-x_i)\\\\ &=&2\textcolor{red}{a}\sum_{i=1}^{5}x_i^2 + 2\textcolor{blue}{b}\sum_{i=1}^{5}x_i-2\sum_{i=1}^{5}x_i y_i = 0 \end{eqnarray*}


    \begin{eqnarray*} \therefore \quad\textcolor{red}{a}\sum_{i=1}^{5}x_i^2 + \textcolor{blue}{b}\sum_{i=1}^{5}x_i-\sum_{i=1}^{5}x_i y_i = 0 \end{eqnarray*}


\textcolor{blue}{b}偏微分

    \begin{eqnarray*} \frac{\partial L(a,b)}{\partial a} &=&2\sum_{i=1}^{5}\left(y_i-(ax_i+b)\right)(-1)\\\\ &=&2\textcolor{red}{a}\sum_{i=1}^{5}x_i + 2\textcolor{blue}{b}\sum_{i=1}^{5}\,1-2\sum_{i=1}^{5}y_i = 0 \end{eqnarray*}


    \begin{eqnarray*} \therefore \quad\textcolor{red}{a}\sum_{i=1}^{5}x_i + \textcolor{blue}{b}\sum_{i=1}^{5}\,1-\sum_{i=1}^{5}y_i = 0 \end{eqnarray*}


上の2つの式は a,b に関する連立方程式である。行列で表示すると、

    \begin{eqnarray*} \left(\begin{array}{ccc} \sum_{i=1}^{5}x_i^2 & \sum_{i=1}^{5}x_i\\\\ \sum_{i=1}^{5}x_i&\sum_{i=1}^{5}\,1 \end{array}\right) \left(\begin{array}{c} \textcolor{red}{a}\\\\ \textcolor{blue}{b} \end{array}\right) = \left(\begin{array}{ccc} \sum_{i=1}^{5}x_i y_i \\\\ \sum_{i=1}^{5}y_i \end{array}\right) \end{eqnarray*}


逆行列を作って、

    \begin{eqnarray*} \left(\begin{array}{c} \textcolor{red}{a}\\\\ \textcolor{blue}{b} \end{array}\right) &=& \left(\begin{array}{ccc} \sum_{i=1}^{5}x_i^2 & \sum_{i=1}^{5}x_i\\\\ \sum_{i=1}^{5}x_i&\sum_{i=1}^{5}\,1 \end{array}\right)^{-1} \left(\begin{array}{ccc} \sum_{i=1}^{5}x_i y_i \\\\ \sum_{i=1}^{5}y_i \end{array}\right)\\\\\\ &=& \frac{1}{\Delta}\left(\begin{array}{ccc} \sum_{i=1}^{5}\,1 & -\sum_{i=1}^{5}x_i\\\\ -\sum_{i=1}^{5}x_i&\sum_{i=1}^{5}x_i^2 \end{array}\right) \left(\begin{array}{ccc} \sum_{i=1}^{5}x_i y_i \\\\ \sum_{i=1}^{5}y_i \end{array}\right) \end{eqnarray*}


ここで、

    \begin{eqnarray*} \Delta=\left(\sum_{i=1}^{5}\, 1\right)\left( \sum_{i=1}^{5} x_i^2\right) -\left(\sum_{i=1}^{5} x_i\right)^2 \end{eqnarray*}



である。したがって、最小二乗法で得られる傾き a切片 b がわかる。データ数を N として一般化してまとめておく。


一次関数でフィッティング(最小二乗法)


    \begin{eqnarray*} a&=&\frac{\sum\, 1\sum x_i y_i -\sum x_i \,\sum y_i }{\sum\, 1 \sum x_i^2 -\left(\sum x_i\right)^2}\\\\\\ b&=&\frac{ -\sum x_i \sum x_iy_i +\sum x_i^2 \sum y_i }{\sum \, 1 \sum x_i^2 -\left(\sum  x_i \right)^2} \end{eqnarray*}


ただし、\sumi=1,2,...,N とする N はデータ数。



式が煩雑に見えるが、用意されたデータをかけたり、足したり、2乗したりして足し合わせるだけなので難しくないでしょう。



式変形して平均値・分散で表現

    \begin{eqnarray*} \sum \, 1  = N \end{eqnarray*}

はデータ数 N を表す。


    \begin{eqnarray*} \sum \, x_i  = N\bar{x}\\\\ \sum \, y_i  = N\bar{y} \end{eqnarray*}

はそれぞれ、x_i の総和とy_i の総和なので、平均値とデータ数で表すことができる。


    \begin{eqnarray*} \sum x_i^2=N\bar{x^2} \end{eqnarray*}

は同じく x_i^2 の総和であり、2乗の平均とデータ数で表すことができる。


    \begin{eqnarray*} \sum \, 1 \sum x_i^2 -\left(\sum  x_i \right)^2 &=&N(N\bar{x^2})-(N\bar{x})^2\\\\ &=&N^2(\bar{x^2}-(\bar{x})^2)\\\\ &=&N^2\sigma_x^2 \end{eqnarray*}

a,b の分母の項は x の分散の2乗によって表すことができる。


    \begin{eqnarray*} \sum\, 1\sum x_i y_i -\sum x_i \,\sum y_i &=&N(N\bar{xy}-(N\bar{x})(N\bar{y}))\\\\ &=&N^2(\bar{xy}-\bar{x}\bar{y})\\\\ &=&N^2\sigma_{xy} \end{eqnarray*}

は共分散として表すことができる。


最後に b の分子は、

    \begin{eqnarray*} -\sum x_i \sum x_iy_i +\sum x_i^2 \sum y_i &=&-\sum x_i \sum x_iy_i +\textcolor{red}{\left(\sum x_i\right)^2\sum y_i}\\\\ &&+\sum x_i^2 \sum y_i-\textcolor{red}{\left(\sum x_i\right)^2\sum y_i}\\\\ &=&-\sum x_i\left(\sum x_i y_i-\textcolor{red}{\sum x_i\sum y_i}\right)\\\\ &&+\sum y_i\left( \sum x_i^2- \textcolor{red}{\left(\sum x_i\right)^2}\right)\\\\ &=& N^2 \bar{y}\sigma_x^2-N^2\bar{x}\sigma_{xy}\\\\ &=& N^2\left(\bar{y}\sigma_x^2-\bar{x}\sigma_{xy}\right) \end{eqnarray*}

赤色の項は分散と共分散で表すために挟み込んだ。



以上より一次関数 y=ax+b は、

    \begin{eqnarray*} &&y=\frac{N^2 \sigma_{xy}}{N^2 \sigma^2}+ \frac{N^2\bar{y}\sigma_x^2-N^2\sigma_{xy}\bar{x}}{N^2\sigma_x^2}\\\\\\ \Leftrightarrow&& y-\bar{y}=\frac{\sigma_{xy}}{\sigma_x^2}\left(x-\bar{x}\right)\quad \blacksquare \end{eqnarray*}


よく見かける式と同じになる。



3. まとめ

 最小二乗法が何をやっているかわかれば、二次関数など高次の関数でのフィッティングにも応用できる。




^*:下に凸になるのは L(a,b) の形を見ればわかる。




コメントを残す

メールアドレスが公開されることはありません。