最小二乗法で引く近似直線の係数を微分を使って求めてみた

はじめに

実験や調査で取ったデータを散布図にすると、それを直線近似したくなるものです。
例えば図1のようなデータ。(話を簡単にするため、3点しかプロットしていません)

図1

現在は、Excelで「近似直線の追加」を選ぶことで、苦もなく近似直線を引くことができます。

でも、「アルゴリズムを調べて来なさい」という宿題が出たり、自分で近似曲線を求めるプログラムを書かざるを得なくなってしまったりすることがあるかもしれません。
そんな場合に備えて、以下に導いておきました。
(本当は自分の備忘録です)

最少二乗法とは

データに対する近似直線は、通常、図2に示すように、最少二乗法で引きます。

図2

最少二乗法とは、図2に赤線で示したY軸方向の誤差をそれぞれ二乗し、その和が最小になるように直線の傾きと切片を決める方法です。

ちょっと考えると、Y軸方向の誤差ではなくて、点から直線に垂線を下ろしたときの交点と点との距離、即ち点と直線との距離の二乗を求めてその和を最小にした方が近似の精度が高いように思えます。

XとYの次元が同じなら、それでも良いかも知れませんが、Xが時間で、Yが温度のような場合、そもそも距離という概念にならないのでダメだということに、つい今しがた気付きました。

傾きaと切片bを求める

では早速、傾きaと切片bを求めてみましょう。

まず、二乗誤差の値Eを作ってみます。
ここで、実験などで得られたデータを\left( x_i, y_i \right)\, \left( i=1, 2, \cdots , n \right)とすると、

    \begin{eqnarray*} E &=& \sum_{i=1}^{n}\left\{ y_i - (a x_i + b) \right\}^2 \\ &=& \sum_{i=1}^{n}\left( y_i^2 + a^2 x_i^2 + b^2 - 2 a x_i y_i - 2 b y_i + 2 a b x_i \right) \end{eqnarray*}

となります。極小値を求めるために、aとbで偏微分して、それを0と置きます。

    \begin{equation*} \frac{\partial E}{\partial a} = \sum_{i=1}^{n} \left( 2 a x_i^2 - 2 x_i y_i + 2 b x_i \right) = 0 \eqno(1) \end{equation*} \begin{equation*} \frac{\partial E}{\partial b} = 2 n b + \sum_{i=1}^{n}  \left( -2 y_i + 2 a x_i \right) = 0 \eqno(2) \end{equation*}

(2)より、

    $$ b=\frac{\sum_{i=1}^{n} y_i - a \sum_{i=1}^{n} x_i } {n} \eqno(3)$$

となるので、(3)を(1)に代入して、

    $$ 2 a \sum_{i=1}^{n} x_i^2 - 2 \sum_{i=1}^{n} x_i y_i + 2 \frac{\sum_{i=1}^{n} y_i - a \sum_{i=1}^{n} x_i} {n} \sum_{i=1}^{n} x_i = 0$$

となるので、aについて解くと、

    $$ a=\frac{n \sum_{i=1}^{n} x_i y_i - \sum_{i=1}^{n} x_i \sum_{i=1}^{n} y_i } {n \sum_{i=1}^{n} x_i^2 - \left( \sum_{i=1}^{n} x_i \right)^2} $$

となり、これを(3)に代入して、

    \begin{eqnarray*} b &=& \frac{\sum_{i=1}^{n} y_i - \frac{n \sum_{i=1}^{n} x_i y_i - \sum_{i=1}^{n} x_i \sum_{i=1}^{n} y_i } {n \sum_{i=1}^{n} x_i^2 - \left( \sum_{i=1}^{n} x_i \right)^2} \sum_{i=1}^{n} x_i } {n} \\ &=& \frac{\sum_{i=1}^{n} x_i^2 \sum_{i=1}^{n} y_i - \sum_{i=1}^{n} x_i\sum_{i=1}^{n} x_i y_i} {n \sum_{i=1}^{n} x_i^2 - \left(\sum_{i=1}^{n} x_i \right)^2} \end{eqnarray*}

となります。

念のため、検算

データを\left(-2,-6\right), \left(1,3\right), \left(4,0\right)として検算してみます。

先ず、aは、

    $$a=\frac{3\left(-2 \cdot \left(-6 \right) +1 \cdot 3 + 4 \cdot 0 \right) - \left(-2+1+4 \right)\cdot \left(-6+3+0\right)}{3 \cdot \left(4+1+16\right)-\left(-2+1+4 \right)^2}=\frac{54}{54}=1$$

であり、bは、

    $$b=\frac{\left(4+1+16 \right)\cdot \left(-6+3+0 \right)- \left(-2+1+4\right)\left(-2 \cdot \left(-6\right)+1 \cdot 3 + 4 \cdot 0 \right)}{3 \cdot \left(4+1+16\right)-\left(-2+1+4 \right)^2}=\frac{-108}{54}=-2$$

となります。

Excelで近似曲線を引くと

    $$y=x-2$$

でしたので、合っているようです。

まとめ

とりあえず係数を算出しました。
ただ、結構複雑なので、点の数が多くなると正確に計算できる気がしません。

ところで、最少二乗法は行列でも計算することができます。
多次元の場合も含め、そちらの方が考え方が簡単です。
行列による計算方法については、こちらをご覧ください。

コメント

タイトルとURLをコピーしました