こんにちは。
勾配法を終えました。差分法も終えました。目的関数も終えました。いい流れですねえ。余談ですが最近、友人に機械学習の入門書を選んでくれと言われ書店へ行ったのですがブームってすごいですね。今やいい本がたくさんあります。コードも丁寧に説明してあって数式も導出してあって、、、
今回のデータセット

では勾配法を使って回帰します。まずはモデルを定義します。今回はこのデータに
いい感じに刺さる直線が欲しいですよね。よって今回はモデルを次のように定義します。
![Rendered by QuickLaTeX.com \[\hat{y} = m x + b\]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-8d685aa848082568ae6e7ebc310f0a69_l3.png)
はい、次は目的関数を定義します。再度状況確認しましょう。

みての通りどんなにいい線を引いても「誤差(赤い線)」がありますよね。仕方ないです。現実のデータには誤差があります。これをよく
NOISEと言います。とはいえ、各データの誤差の和(赤い線の和)が最小の時が一番いい線です。よって
![Rendered by QuickLaTeX.com \[error = y - \hat{y} = y - ( mx + b ) \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-6a9e0337d875f4cec1dcbb7cfc2f5590_l3.png)
を最小化したいですよね。けどこのままだと扱いずらいので損失関数を

とするとどうでしょうか。
微分できないのであんまり良くないです。なのでこうしましょう。
![Rendered by QuickLaTeX.com \[ error = (y - ( mx + b ))^2 \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-0d6948d217b8fc98ce14039f62f90538_l3.png)
微分可能であり、さらに下に凸の
凸関数ですね。凸関数って何がいいんでしたっけ?そうです、お椀型なので勾配法をかけると大域最適解がゲットできます。よって今回のコスト関数はこれの和になるので
![Rendered by QuickLaTeX.com \[E = \frac{1}{N} \sum_{I=1}^{N} (y_i - ( mx_i + b ))^2 \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-d9c9930a7e7e66228c6b45907ede3607_l3.png)
ではそれぞれ勾配を求めましょう。
![Rendered by QuickLaTeX.com \[\frac{\partial E}{\partial m} = \frac{2}{N} \sum_{I=1}^{N} (-2x_i) (y_i - ( mx_i + b )) \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-6e4caf28214fa56afe62a6d1eeb82f19_l3.png)
![Rendered by QuickLaTeX.com \[\frac{\partial E}{\partial b} = \frac{2}{N} \sum_{I=1}^{N} (-2) (y_i - ( mx_i + b )) \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-8325c8724c3527e33e8b956454ca0008_l3.png)
今回は2次元のデータだったので簡単でした、変数が増えてもやることは同じです。ちなみにこれは線形ですが曲げたければモデルを2次式・3次式、、、にすればいいですし、周期性があれば三角関数にしてもいいですし、そこは自由です。ただ現実のデータは可視化できないのが多いと思うので今回のように予想は立てられないと思います。
データが可視化できない?
いえいえ、機械学習の力を使えばできるんです。その名も
PCA
主成分分析とも言います。高次元空間のデータを低次元空間へピョンと飛ばすテクニックです。例えば500次元のデータを2次元に変換するとx-y平面で可視化できますね。便利便利。
おっと話が逸れてしまいました。ところで今回の実装テーマの「
線形回帰」についてですがそもそも「
回帰」ってなんでしょう?
他にもベイズ線形回帰とかあります。まあそれらはまた今度にしましょう。
参考:
- http://mikakukyokai.net/2015/08/16/sausage/
- http://www.sthda.com/english/articles/40-regression-analysis/165-linear-regression-essentials-in-r/
- https://stats.stackexchange.com/questions/2691/making-sense-of-principal-component-analysis-eigenvectors-eigenvalues