最小二乗法とか

提供: メモ帳@fmaj7b5.info
移動: 案内検索

目次

目的

座標系

二つの値\{x_i, y_i\}を沢山観測していると、どうやらこの値は直線にのるらしいことが分かった。 でも観測した値には誤差が含まれているので、どう頑張っても全部の点を通る直線を引くのは無理っぽい。 そこで、全ての観測した点に対してなるべく近くを通るような直線を求めるのを目指す。

直線を求めるっていっても、紙に線を書くんじゃなくて、後で計算しやすいように直線の方程式の係数を求めるのがここのテーマ。

最小二乗法

またの名を最小乗法。 読んで字のごとく誤差の2乗を最小にする係数を求める方法。

その1

以下の式を考える。


y = a x + b

すると直線上の点は上式を満たすから、ある観測点の誤差\Delta y_iは次となる。


\Delta y_i = y_i - (a x_i + b)

この値は正負両方の値をとるので2乗し、全ての観測点に対する和が最小になるように係数a, bを定める。


\sum_i \Delta y_i^2 \longrightarrow \min

a, bでそれぞれ偏微分して0とおき、連立させて解くと以下を得る。


\begin{array}{l}
  a = \frac{\sum_i (x_i - \bar{x})(y_i - \bar{y})}{\sum_i (x_i - \bar{x})^2} \\
  b = \bar{y} - \frac{\sum_i (x_y - \bar{x})(y_i - \bar{y})}{\sum_i (x_i - \bar{x})^2} \bar{x}
\end{array}

但し、\bar{x}, \bar{y}はそれぞれxとyの平均とする。 これを変形すると、


y - \bar{y} = \frac{\sum_i (x_i - \bar{x})(y_i - \bar{y})}{\sum_i (x_i - \bar{x})^2} (x - \bar{x})

となるため、平均を通り、傾きが共分散/xの分散になる直線であることが分かる。

ちなみに行列を使って表すと、誤差ベクトル


\Delta \boldsymbol{y} = \boldsymbol{y} - X^\text{T}
  \begin{bmatrix}
    a \\ b
  \end{bmatrix}

X^\text{T} =
  \begin{bmatrix}
    x_1 & 1 \\
    x_2 & 1 \\
    \vdots & \vdots
  \end{bmatrix}
, \quad
\boldsymbol{y} =
  \begin{bmatrix}
    y_1 \\ y_2 \\ \vdots
  \end{bmatrix}

として、2乗誤差\Delta \boldsymbol{y}^\text{T} \Delta \boldsymbol{y}を係数ベクトルで微分すると次式を得る。


X(\boldsymbol{y} - X^\text{T})
\begin{bmatrix}
  a \\ b
\end{bmatrix}
= \boldsymbol{0}

よって、


\begin{bmatrix}
  a \\ b
\end{bmatrix}
=
\left( X X^\text{T} \right)^{-1} X \boldsymbol{y}

である。

その2

さて、勘のいい人は気付いていると思うけど、一つ目の方法はy軸の誤差しかみていないことが分かる。 ご丁寧にも\Delta \boldsymbol{y}とか書いてたしねぇ。

普通に観測したデータはx軸にもy軸にも誤差が含まれるのが当然ってことで、次の式を考える。


c_1 x + c_2 y + c_3 = 0

この式だとx=\text{const}というy軸に平行な直線も表せるのと、両辺に0でない定数を掛けても同じ直線を表す(=定数倍の不定性がある)のに注意。

で、二乗の和を最小にする、と。


\sum_i (c_1 x_i + c_2 y_i + c_3)^2 \longrightarrow \min

定数倍の不定性を除去するためにc_1^2 + c_2^2 = 1とすると、


c_3 = - (c_1 \bar{x} + c_2 \bar{y})

より、


\left(\sum_i
\begin{bmatrix}
  (x_i - \bar{x})^2 & (x_i - \bar{x})(y_i - \bar{y}) \\
  (x_i - \bar{x})(y_i - \bar{y}) & (y_i - \bar{y})^2
\end{bmatrix}
- \lambda I \right)
\begin{bmatrix}
  c_1 \\ c_2
\end{bmatrix}
= \boldsymbol{0}

が得られ、求めるものは分散・共分散行列の最小固有値に対応する固有ベクトルだと分かる。

その1と同様に行列っぽく書くと、


\boldsymbol{c}^\text{T} XX^\text{T} \boldsymbol{c} \longrightarrow \min

X^\text{T} =
  \begin{bmatrix}
    x_1 & y_1 & 1 \\
    x_2 & y_2 & 1 \\
    \vdots & \vdots & \vdots
  \end{bmatrix}
, \quad
\boldsymbol{c} = [c1,\, c2,\, c3]^\text{T}

で、\boldsymbol{c}XX^\text{T}の最小固有値に対応する固有ベクトルになる。 但し、正規化の方法が若干違う(|\boldsymbol{c}| = 1)ので注意。

直線以外への当てはめ

当てはめに使っている方程式をぼーっと眺めてみると、

(係数1)(データ1) + (係数2)(データ2) + ・・・ = 0

という形をしている事が見えてくる。

つまり、(x_i^2,\, x_i,\, y_i, 1)とすればy = ax^2 + bx + cに当てはめたりできる。

一般の2次曲線は


\begin{bmatrix}
  x & y & 1
\end{bmatrix}
\begin{bmatrix}
  c_1 & c_2 & c_4 \\
  c_2 & c_3 & c_5 \\
  c_4 & c_5 & c_6
\end{bmatrix}
\begin{bmatrix}
  x \\ y \\ 1
\end{bmatrix} = 0

\Longleftrightarrow
c_1 x^2 + 2 c_2 xy + c_3 y^2 + 2 c_4 x + 2 c_5 y + c_6 = 0

で表されるので


\begin{bmatrix}
  x^2 & 2xy & y^2 & 2x & 2y & 1
\end{bmatrix}
\boldsymbol{c} = 0

とすれば、楕円とか双曲線とか放物線とかに当てはめられる。 但し縮退する(2次の係数が0になるとか)場合があるので、計算できたからといっても安心できない。 それに誤差ののり方がそれぞれの要素で変わってくるため、当てはめの結果が最適であるという保証が無い点にも注意が必要。