バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia2-backnumber/
はじめに
まずは最もシンプルな回帰分析である、
1次関数の最小二乗法についての説明をする。
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
1次関数の最小二乗法

まずは1次関数の最小二乗法から説明していこう。
これはもっともシンプルな回帰分析と言える。

最小二乗法は、名前は知ってるけど、
具体的に何してるとかはわからないんだよなー。

前回の、複数のプロットを元に最もそれらしい線を引く。
ってのを実現しているものだな。

その「最もそれらしい線」っていうのをどう特定しているのか?
ってところがわからん。
最もそれらしい線の特定方法

「最もそれらしい線」の特定方法は、
各サンプリングとの誤差が最小となる線だな。
以下のイメージだ。


まぁ、言いたいことはわかる。

そして、「誤差が最小」という部分だが、
単純に引き算で求めると、サンプリングと線の位置関係が上か下かで符号が逆転してしまう。
それを抑制するために「誤差の二乗の和が最小になる線」を特定することになる。

そっか。
二乗にすれば、符号の問題は無くなるもんね。
それに、こういうことをするから最小二乗法って名前なのか。

そうそう。
誤差関数

そして、「誤差の二乗の和が最小になる線」を求める際に最小を目指すための関数を誤差関数と呼ぶのだけど、
1次関数の最小二乗法にとっての誤差関数を特定する必要がある。

どう特定するの?

まず、以下が誤差が最小の関数であると仮定する。
\(ax+b=y\)

普通の一次関数だね。

サンプリングした\((x,y)\)を元に\((a,b)\)を求めたいので、
最小化したい誤差関数\(L\)を求める。
\(
\begin{eqnarray}
L(a,b)&=&\displaystyle\sum_{i=0}^n\{y_i -(ax_i +b)\}^2 \\
&=&\displaystyle a^2\sum x_i^2+nb^2+\sum y_i^2-2a\sum x_i y_i -2b\sum y_i +2ab\sum x_i
\end{eqnarray}
\)

なんかややこしいことになっているような・・・。

一見するとややこしいかもしれないが、
これが最終的にはシンプルになる。

そうなの?

あと、このシリーズってベクトルとか、行列をいい感じに使って
計算を楽にしようとしてると思ったのだけど、
今のところ、ベクトルも行列も出てきてないね。

それもすぐ出てくる。
まぁ行列で表現するが故にシンプルになるんだけど。

まぁ、そこは期待して聞いておこう。
nb^2について

さっきの誤差関数の中に\(nb^2\)ってのがいたけど、
そんなのが出るような式だったっけ?

あー、あれは以下の変形をした結果だな。
\(
b^2\sum 1=nb^2
\)

なぜ、これがイコールで結ばれるのかがわからん・・・。

\(\sum 1\)って丁寧に書くと以下になる。
\(\displaystyle\sum_{i=1}^5=1+1+1+1+1=5\)

あ、そっか。
n個の1の和だから、nになるのか。

そうそう。
まとめ

まとめだよ。
- 最もシンプルな回帰分析である1次関数の最小二乗法の解説開始。
- 最小二乗法の理屈は「誤差の二乗の和が最小になる線」を求める。
- 誤差が最小になる関数を誤差関数Lとして定義。
- 1次関数に於いて最小になる誤差関数を求めた。
- 後々、シンプルな式になる予定。
バックナンバーはこちら。
コメント