最小二乗法による1次, 2次, n次関数の係数の決定(行列計算)

様々な次数の関数を最小二乗法でデータにフィッティングする際の計算について考えていきます.

スポンサーリンク

1次関数の場合

\[f(x_i)=ax_i+b\]をデータ\((x_i, y_i), (i=1,2,…,N)\)にフィットすることを考えます.
データ\((x_i, y_i)\)をうまく表現する直線は評価の仕方によって様々ですが,
最小二乗法ではその名の通り\(y_i-f(x_i)\)の二乗をすべてのデータ\(i\)について足した時に最小になるような直線を求めます.
そのような値を\(E\)(\(E\)はエラーのEです)とおくと
\begin{align}
E &= \sum_{i=1}^N (y_i-f(x_i))^2 \\
&= \sum_{i=1}^N (y_i-(ax_i+b))^2
\end{align}

最小二乗法では\(E\)を\(a\)や\(b\)で偏微分することで\(E\)が最小になる\(a\)と\(b\)を求めていきます.
これができるのは\(E\)が\(a\)と\(b\)について下に凸な関数になっているからです.
下に凸な関数の場合最小値は微分が0になる点と一致します.

実際に\(a\)についての偏微分が0になる条件を計算すると
\begin{align}
\frac{\partial E}{\partial a} &= 0\\
\sum_{i=1}^N -2x_i(y_i-(ax_i+b)) &= 0\\
\sum_{i=1}^N (x_i y_i-ax_i^2-bx_i) &= 0\\
\sum_{i=1}^N x_i^2 a+ \sum_{i=1}^N x_i b &= \sum_{i=1}^N x_i y_i
\end{align}
最後の式をこの形にしたのは後で行列表記するためです.
次に\(b\)についての偏微分を計算すると
\begin{align}
\frac{\partial E}{\partial b} &= 0\\
\sum_{i=1}^N -2(y_i-(ax_i+b)) &= 0\\
\sum_{i=1}^N (y_i-ax_i-b) &= 0\\
\sum_{i=1}^N x_i a+ \sum_{i=1}^N b &= \sum_{i=1}^N y_i
\end{align}

つまり以下の二つの式が得られます.

\begin{align}
\sum_{i=1}^N x_i^2 a+ \sum_{i=1}^N x_i b &= \sum_{i=1}^N x_i y_i\\
\sum_{i=1}^N x_i a+ \sum_{i=1}^N b &= \sum_{i=1}^N y_i
\end{align}

これを行列表現すると以下のようになります.
\begin{align}
\left(
\begin{array}{cc}
\sum_{i=1}^N x_i^2 & \sum_{i=1}^N x_i \\
\sum_{i=1}^N x_i & \sum_{i=1}^N 1
\end{array}
\right)
\left(
\begin{array}{c}
a \\
b
\end{array}
\right)
&=
\left(
\begin{array}{c}
\sum_{i=1}^N x_i y_i \\
\sum_{i=1}^N y_i
\end{array}
\right)
\end{align}
\(\boldsymbol{S}_x\),\(\vec{c}\),\(\vec{s}_{xy}\)で行列と各ベクトルを表すと,
\[\boldsymbol{S}_x\vec{c} = \vec{s}_{xy}\]
とかける.
そして係数の入ったベクトル\(\vec{c}=(a,b)^T\)は
\[\vec{c} = \boldsymbol{S}_x^{-1}\vec{s}_{xy}\]
で求めることができる.

この行列表現なんだか法則がありそうですね.
ということで2次関数の場合やn次関数の場合を考えていきます.

スポンサーリンク

2次関数の場合

\[f(x_i)=c_0 x_i^2 + c_1 x_i + c_2\]をデータ\((x_i, y_i), (i=1,2,…,N)\)にフィットすることを考えます.
\(c_{添え字}\)にしたのはn次関数への拡張する際にイメージしやすくするためです.
このとき二乗誤差の和を\(E\)とおくと
\begin{align}
E &= \sum_{i=1}^N (y_i-f(x_i))^2 \\
&= \sum_{i=1}^N (y_i-(c_0 x_i^2 + c_1 x_i + c_2))^2
\end{align}

\(E\)を\(c_k, (k=0,1,2)\)で偏微分することで\(E\)が最小になる\(c_k\)を求めていきます.

\(c_0\)についての偏微分を計算すると
\begin{align}
\frac{\partial E}{\partial c_0} &= 0\\
\sum_{i=1}^N -2x_i^2(y_i-(c_0 x_i^2 + c_1 x_i + c_2)) &= 0\\
\sum_{i=1}^N (x_i^2 y_i – c_0 x_i^4 – c_1 x_i^3 – c_2 x_i^2) &= 0\\
\sum_{i=1}^N x_i^4 c_0+ \sum_{i=1}^N x_i^3 c_1 + \sum_{i=1}^N x_i^2 c_2 &= \sum_{i=1}^N x_i^2 y_i
\end{align}
\(c_1\)についての偏微分を計算すると
\begin{align}
\frac{\partial E}{\partial c_1} &= 0\\
\sum_{i=1}^N -2x_i(y_i-(c_0 x_i^2 + c_1 x_i + c_2)) &= 0\\
\sum_{i=1}^N (x_i y_i- c_0 x_i^3 – c_1 x_i^2 – c_2 x_i) &= 0\\
\sum_{i=1}^N x_i^3 c_0+ \sum_{i=1}^N x_i^2 c_1 + \sum_{i=1}^N x_i c_2 &= \sum_{i=1}^N x_i y_i
\end{align}
\(c_2\)についての偏微分を計算すると
\begin{align}
\frac{\partial E}{\partial c_2} &= 0\\
\sum_{i=1}^N -2(y_i-(c_0 x_i^2 + c_1 x_i + c_2)) &= 0\\
\sum_{i=1}^N (y_i- c_0 x_i^2 – c_1 x_i^1 – c_2) &= 0\\
\sum_{i=1}^N x_i^2 c_0+ \sum_{i=1}^N x_i c_1 + \sum_{i=1}^N c_2 &= \sum_{i=1}^N y_i
\end{align}

つまり以下の三つの式が得られます.

\begin{align}
\sum_{i=1}^N x_i^4 c_0+ \sum_{i=1}^N x_i^3 c_1 + \sum_{i=1}^N x_i^2 c_2 &= \sum_{i=1}^N x_i^2 y_i\\
\sum_{i=1}^N x_i^3 c_0+ \sum_{i=1}^N x_i^2 c_1 + \sum_{i=1}^N x_i c_2 &= \sum_{i=1}^N x_i^1 y_i\\
\sum_{i=1}^N x_i^2 c_0+ \sum_{i=1}^N x_i c_1 + \sum_{i=1}^N c_2 &= \sum_{i=1}^N x_i^0 y_i
\end{align}

これを行列表現すると以下のようになります.
\begin{align}
\left(
\begin{array}{ccc}
\sum_{i=1}^N x_i^4 & \sum_{i=1}^N x_i^3 & \sum_{i=1}^N x_i^2 \\
\sum_{i=1}^N x_i^3 & \sum_{i=1}^N x_i^2 & \sum_{i=1}^N x_i^1 \\
\sum_{i=1}^N x_i^2 & \sum_{i=1}^N x_i^1 & \sum_{i=1}^N x_i^0 \\
\end{array}
\right)
\left(
\begin{array}{c}
c_0 \\
c_1 \\
c_2
\end{array}
\right)
&=
\left(
\begin{array}{c}
\sum_{i=1}^N x_i^2 y_i \\
\sum_{i=1}^N x_i^1 y_i \\
\sum_{i=1}^N x_i^0 y_i
\end{array}
\right)
\end{align}
\(\boldsymbol{S}_{x2}\),\(\vec{c}_2\),\(\vec{s}_{xy2}\)で行列と各ベクトルを表すと,
\[\boldsymbol{S}_{x2} \vec{c}_2 = \vec{s}_{xy2}\]
とかける.
そして係数の入ったベクトル\(\vec{c}_2=(c_0,c_1,c_2)^T\)は
\[\vec{c}_2 = \boldsymbol{S}_{x2}^{-1}\vec{s}_{xy2}\]
で求めることができる.

n次関数の場合

\[f(x_i)=c_0 x_i^n + c_1 x_i^{n-1} + c_2 x_i^{n-2} + \cdots + c_n\]をデータ((x_i, y_i), (i=1,2,…,N))にフィットすることを考えます.

1次関数や2次関数と同様に計算すると以下のような行列が得られる.

\begin{align}
\left(
\begin{array}{cccc}
\sum_{i=1}^N x_i^{2n} & \sum_{i=1}^N x_i^{2n-1} & \cdots &\sum_{i=1}^N x_i^n \\
\sum_{i=1}^N x_i^{2n-1} & \sum_{i=1}^N x_i^{2n-2} & \cdots &\sum_{i=1}^N x_i^{n-1} \\
\vdots & & \ddots & \vdots\\
\sum_{i=1}^N x_i^n & \sum_{i=1}^N x_i^{n-1} & \cdots &\sum_{i=1}^N x_i^0 \\
\end{array}
\right)
\left(
\begin{array}{c}
c_0 \\
c_1 \\
\vdots \\
c_n
\end{array}
\right)
&=
\left(
\begin{array}{c}
\sum_{i=1}^N x_i^n y_i \\
\sum_{i=1}^N x_i^{n-1} y_i \\
\vdots\\
\sum_{i=1}^N x_i^0 y_i
\end{array}
\right)
\end{align}

\(\boldsymbol{S}_{xn}\),\(\vec{c}_n\),\(\vec{s}_{xyn}\)で行列と各ベクトルを表すと,
\[\boldsymbol{S}_{xn} \vec{c}_n = \vec{s}_{xyn}\]
とかける.
そして係数の入ったベクトル\(\vec{c}_n=(c_0,c_1,\dots,c_n)^T\)は
\[\vec{c}_n = \boldsymbol{S}_{xn}^{-1}\vec{s}_{xyn}\]
で求めることができる.

コメント

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