Zenn
🤖

最小二乗法の幾何学的な意味

に公開

はじめに

NN個のデータ点をMM個のパラメーを用いて最小二乗法でフィッティングしようとする時、これはNN次元空間のデータ点から、MM次元部分空間への正射影を求める問題と等価になります。ですが、NN次元空間とかMM次元部分空間とか言われても普通は想像できません。また、元々フィッティングしようとしていたデータの住む空間とは異なる空間での話になるのも混乱を助長します。

以下では簡単な系で「なるほど、たしかに最小二乗法は射影だな」と思えるような説明を試みます。

最小二乗法

まずは最小二乗法を定式化しておきましょう。簡単のため、データはスカラーであるとします。何か入力値xxがあるとき、その出力yyを予想する関数y=f(x)y = f(x)を推定するのが目的です。

NN個入力点x1,x2,,xNx_1, x_2, \cdots, x_Nに対して、観測値y1,y2,,yNy_1, y_2, \cdots, y_Nが与えられているとします。これをMM個のパラメータθ1,θ2,,θM\theta_1, \theta_2, \cdots, \theta_Mを持つ関数f(x;θ)f(x; \vec{\theta})で近似することにします。ただしθ\vec{\theta}はパラメータをまとめて書いたものです。

例えば、入力値がxix_iだったとして、推定値はy~i=f(xi;θ)\tilde{y}_i = f(x_i; \vec{\theta})となります。正解データはyiy_iですから、誤差はyiy~i|y_i - \tilde{y}_i|です。これがNN点あるのですから、これらの二乗和EEを近似の誤差としましょう。

E=i(yiy~i)2 E = \sum_i (y_i - \tilde{y}_i)^2

このEEを最小化するようにパラメータを決めましょう、というのが最小二乗法です。

例を挙げましょう。パラメータを一つだけとし、θ1=a\theta_1 = aとします。推定関数をy=axy = axとしましょう。入力xix_iに対する推定値はy~i=axi\tilde{y}_i = a x_iなので、誤差は

E=i(yiaxi)2=a2ixi22aixiyi+iyi2 \begin{aligned} E &= \sum_i (y_i - a x_i)^2\\ &= a^2 \sum_i x_i^2 - 2 a \sum_i x_i y_i + \sum_i y_i^2 \end{aligned}

となります。あとの計算のために二乗を展開しておきました。これを最小にするaaを求めるため、aaで微分します。

Ea=2aixi22ixiyi=0 \begin{aligned} \frac{\partial E}{\partial a} &= 2a \sum_i x_i^2 - 2 \sum_i x_i y_i\\ &= 0 \end{aligned}

ここから、

a=ixiyiixi2 a = \frac{ \sum_i x_i y_i}{\sum_i x_i^2}

と求められます。ここまでは「誤差を微分してゼロとなるようなパラメータが最小値を与えるよね」という解析学的な扱いでしたが、この幾何学的な意味を考えよう、というのが本稿の目的です。

幾何学的な解釈

もう一度誤差を見てみましょう。

E=i(yiy~i)2 E = \sum_i (y_i - \tilde{y}_i)^2

ここで、y=(y1,y2,,yN)\vec{y} = (y_1, y_2, \cdots, y_N)y~=(y~1,y~2,,y~N)\vec{\tilde{y}} = (\tilde{y}_1, \tilde{y}_2, \cdots, \tilde{y}_N)というベクトルを定義すると

E=yy~2 E = |\vec{y} - \vec{\tilde{y}}|^2

と書き直せます。これは2つのNN次元ベクトルの距離です。これを最小化しようと言うのですから、最小二乗法は「与えられたベクトルy\vec{y}に対して、なるべくy~\vec{\tilde{y}}を近づけるようにパラメータを選ぶ作業」となります。いま、パラメータがMM個であるとするなら、パラメータをいろいろ変えてみると、y~\vec{\tilde{y}}は(NN次元ベクトルだけれど)MM次元空間を動くことになります。この辺がわかりにくいので、具体例を見てみましょう。

パラメータ1つの場合

データ点N=2N=2、パラメータ数M=1M=1の場合を考えます。いま、データ点として

(xiyi)=(11.1),(21.8) \begin{pmatrix} x_i \\ y_i \end{pmatrix} = \begin{pmatrix} 1 \\ 1.1 \end{pmatrix}, \begin{pmatrix} 2 \\ 1.8 \end{pmatrix}

の2点が与えられているとしましょう(N=2N=2)。これを

y=ax y = a x

という一つのパラメータを持つ関数でフィッティングします(M=1M=1)。データ点のベクトルは

y(y1y2)=(1.11.8) \vec{y} \equiv \begin{pmatrix} y_1 \\ y_2 \end{pmatrix} = \begin{pmatrix} 1.1 \\ 1.8 \end{pmatrix}

という二次元ベクトルになります。同様に、データ点の推定ベクトルは

y~(y~1y~2)=(ax1ax2)=(a2a) \vec{\tilde{y}} \equiv \begin{pmatrix} \tilde{y}_1 \\ \tilde{y}_2 \end{pmatrix} = \begin{pmatrix} a x_1 \\ a x_2 \end{pmatrix} = \begin{pmatrix} a \\ 2a \end{pmatrix}

となります。このベクトルy~\vec{\tilde{y}}は2次元ベクトルですが、パラメータaaを色々かえると、直線上を動きます。したがって、パラメータaaをいろいろ変えた時のy~\vec{\tilde{y}}の軌跡の集合は直線になります。

fig

我々の目的はデータ点ベクトルy\vec{y}と、推定ベクトルy~\vec{\tilde{y}}をなるべく近づけることですから、幾何学的にはデータ点ベクトルから、推定ベクトルy~\vec{\tilde{y}}が描く直線に垂線を下ろし、その足が求める最良推定点であり、その点を与えるパラメータがフィッティング結果ということになります。

パラメータ2つの場合

データ点N=3N=3、パラメータ数M=2M=2の場合を考えます。いま、データ点として

(x1y1),(x2y2),(x3y3) \begin{pmatrix} x_1 \\ y_1 \end{pmatrix} , \begin{pmatrix} x_2 \\ y_2 \end{pmatrix} , \begin{pmatrix} x_3 \\ y_3 \end{pmatrix}

の3点が与えられているとしましょう(N=2N=2)。これを

y=ax+b y = a x + b

という2つのパラメータを持つ関数でフィッティングします(M=2M=2)。データ点のベクトルは

y(y1y2y3) \vec{y} \equiv \begin{pmatrix} y_1 \\ y_2 \\ y_3 \end{pmatrix}

という3次元ベクトルになります。同様に、データ点の推定ベクトルは

y~(y~1y~2y~3)=(ax1+bax2+bax3+b) \vec{\tilde{y}} \equiv \begin{pmatrix} \tilde{y}_1 \\ \tilde{y}_2 \\ \tilde{y}_3 \end{pmatrix} = \begin{pmatrix} a x_1 + b \\ a x_2 + b \\ a x_3 + b \end{pmatrix}

となります。このベクトルy~\vec{\tilde{y}}は3次元ベクトルですが、パラメータa,ba,bを色々かえると、平面上を動きます。したがって、パラメータをいろいろ変えた時のy~\vec{\tilde{y}}の軌跡の集合は平面になります。

fig2

この平面上の点で、最もデータ点ベクトルy\vec{y}に近いものを探したいのですから、データ点ベクトルからこの平面に垂線を下ろし、その足が求める最良推定点であり、またその点を与えるパラメータがフィッティング結果となります。

まとめ

最小二乗法はデータ点ベクトルy\vec{y}と、その推定ベクトルy~\vec{\tilde{y}}をなるべく近づけようとする手法であり、データ点が(x,y)(x, y)という二次元の住人であっても、データ数がNN点あったらデータ点ベクトルy\vec{y}NN次元空間の住人になるところがちょっとわかりにくいポイントです。

それさえわかってしまえば、「NN個のデータをMM個のパラメータでフィッティングする」という問題は、「NN次元空間中にあるベクトルから、MM次元部分空間に正射影する」という問題になることはわかりやすいのかな、と思います。例えばN=2,M=1N=2, M=1なら、2次元空間上の点から直線への垂線に、N=3,M=2N=3, M=2なら、3次元空間上の点から平面への垂線となります。

PRMLの3.1.2節に最小二乗法の幾何学的な意味の解説がありましたが、そのままではちょっとわかりにくいかなと思って説明を書いてみました。参考になれば幸いです。

参考

GitHubで編集を提案

Discussion

ログインするとコメントできます