【最小二乗法】二次関数/三次関数でフィッティング


 最小二乗法の基本的な説明は以下に記載した。ここでは、2次元データ点に対して二次関数、三次関数のフィッティング式を導く。




二次関数でフィッティング

 二次関数の場合は、与えられたデータ点に対して a,b,c を求めれば良い。下図のように最も「うまい」フィッティングを探す方法の1つが最小二乗法であった。

 もっと数学的な概要を説明する。二次関数を y=ax^2+bx+c とする。このとき、元のデータからの y 方向のズレは y_i -(ax_i^2+bx_i +c) である。これを2乗してデータ数 N 個の総和をとったものを L(a,b,c) として、この L を最小化するのが最小二乗法である。つまり、

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

を最小にする a,b,c の組を探す。



Lを最小にする計算

与えられた L が最小となる a,b,c の条件は、

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

である。具体的に計算していく。以降、総和 \sum_{i=1}^{N}\sum と略記する。


a で偏微分:

    \begin{eqnarray*} &&0=\frac{\partial L(a,b,c)}{\partial a}=2\sum \left( y-(ax_i^2+bx_i+c)\right)(-x_i^2) \\\\ \Leftrightarrow&& \textcolor{red}{a}\sum x_i^4+\textcolor{blue}{b}\sum x_i^3+\textcolor{green}{c}\sum \x_i^2-\sum x_i^2y_i=0 \end{eqnarray*}



b で偏微分:

    \begin{eqnarray*} &&0=\frac{\partial L(a,b,c)}{\partial b}=2\sum \left( y-(ax_i^2+bx_i+c)\right)(-x_i) \\\\ \Leftrightarrow&& \textcolor{red}{a}\sum x_i^3+\textcolor{blue}{b}\sum x_i^2+\textcolor{green}{c}\sum \x_i-\sum x_i y_i=0 \end{eqnarray*}



c で偏微分:

    \begin{eqnarray*} &&0=\frac{\partial L(a,b,c)}{\partial c}=2\sum \left( y-(ax_i^2+bx_i+c)\right)(-x_i) \\\\ \Leftrightarrow&& \textcolor{red}{a}\sum x_i^2+\textcolor{blue}{b}\sum x_i+\textcolor{green}{c}\sum \,1-\sum y_i=0 \end{eqnarray*}



これらは a,b,c に関する連立方程式である。行列で表示すると、


    \begin{eqnarray*} \left(\begin{array}{ccc} \sum x_i^4& \sum x_i^3& \sum x_i^2\\\\ \sum x_i^3& \sum x_i^2& \sum x_i\\\\ \sum x_i^2& \sum x_i& \sum \,1 \end{array}\right) \left(\begin{array}{c} \textcolor{red}{a}\\\\ \textcolor{blue}{b}\\\\ \textcolor{green}{c} \end{array}\right)= \left(\begin{array}{c} \sum x_i^2 y_i\\\\ \sum x_i y_i\\\\ \sum y_i \end{array}\right) \end{eqnarray*}


逆行列を作って、


    \begin{eqnarray*} \left(\begin{array}{c} \textcolor{red}{a}\\\\ \textcolor{blue}{b}\\\\ \textcolor{green}{c} \end{array}\right)= \left(\begin{array}{ccc} \sum x_i^4& \sum x_i^3& \sum x_i^2\\\\ \sum x_i^3& \sum x_i^2& \sum x_i\\\\ \sum x_i^2& \sum x_i& \sum \,1 \end{array}\right)^{-1} \left(\begin{array}{c} \sum x_i^2 y_i\\\\ \sum x_i y_i\\\\ \sum y_i \end{array}\right)\quad \blacksquare \end{eqnarray*}


これで、a,b,c を求めて放物線 y=ax^2+bx+c を作れば良い。


式自体は煩雑であるが、データ x_i を累乗して足し合わせるだけなので単純な計算である。とは言っても手計算や電卓を使って計算するのも大変である。エクセルを使えば逆行列なども簡単に計算できるだろう。

 といっても、エクセルなどの表計算ソフトだったら二次関数のフィッティングぐらい機能として付いているはずである。



三次関数でフィッティング

 y=ax^3+bx^2+cx+d でフィッティングする。二次関数でのフィッティング式の結果から、


    \begin{eqnarray*} \left(\begin{array}{c} a\\\\b\\\\c\\\\d \end{array}\right)= \left(\begin{array}{cccc} \sum x_i^6& \sum x_i^5& \sum x_i^4&\sum x_i^3\\\\ \sum x_i^5& \sum x_i^4& \sum x_i^3&\sum x_i^2\\\\ \sum x_i^4& \sum x_i^3& \sum x_i^2&\sum x_i  \\\\ \sum x_i^3& \sum x_i^2& \sum x_i  &\sum \,1 \end{array}\right)^{-1} \left(\begin{array}{c} \sum x_i^3 y_i\\\\ \sum x_i^2 y_i\\\\ \sum x_i y_i\\\\ \sum y_i \end{array}\right)\quad \blacksquare \end{eqnarray*}


となる。L(a,b,c,d) を作って偏微分するのも大変なので省略します。

以上の結果から n 次多項式でのフィッティングに対しては n+1 次元の行列ができて、その逆行列を求めれば簡単にフィッティングできることがわかる。




まとめ

 二次関数と三次関数について最小二乗法でのフィッティング方法をまとめた。まあ結局フィッティングはコンピュータがやってくれるけれど。





コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です