で二つ作りました。見ての通り上の方がノイズが大きいです。今回の予測モデルは直線
とします。サクッとPYTHONで書くと下のような結果がとれます。まずノイズが小さい方のデータに対して コストが減っており、それに合わせてパラメータも本来のに収束しようとしています。上のプロットが見にくいのですが、学習の際のパラメータ履歴で直線をプロットしたものです。次にノイズが大きい方の結果を見てみましょう。 同様にコストも減り、パラメータも本来の値に近ずいてはいますがどおも届きそうにないです。iteration=150あたりで学習が止まっているのでこれ以上は赤点に近づかないでしょう。これはノイズが大きいことが原因です。 とりあえず線形回帰を二変数で行いましたが多変数になってもやり方は全く変わりません。コードを書くのが面倒になりますが sklearnにはすでにlinear regression含め他にも多くの手法があるので簡単に回帰ができます。詳しくは「python 線形回帰 sklearn」などでググればいっぱい出てくるので見てください。
ところで
線形回帰をいい例題にして行列の勉強を簡単にしましょう。というのは何かというと、実は、勾配法使わなくても一発で解が出るんです。というモデルを考えます。これを行列表記すると
ただし、はデータ数、は次元(変数の数)とした。ここで前回の理論編を思い出すと今回の最適化は誤差二乗和の最小化であった。よってノルムの定義を思い出せば
を最小化すればいい(1/2は計算上の都合、別になくても良い)、これを計算する。ベクトルの微分については
- https://www.ics.uci.edu/~welling/teaching/KernelsICS273B/MatrixCookBook.pdf
- https://atmos.washington.edu/~dennis/MatrixCalculus.pdf
では計算すると
これを0と置くと
ここで
が正則行列を仮定すると
(機械学習の観点から「正則行列」を説明すると「どの列もほとんど似通ってない」になる)
と求まる。これが最も誤差が最小であるときのパラメータである。
なんの射影?どこへの射影?
そう、この疑問は大切だ。今私たちが扱っているのはである。についてじーっと見るとこれはの各列ベクトルの線型結合(四則演算)となることがわかる。たとえばと表し、とするととなることがわかる。ここで各はベクトルでありはスカラーであることに注意する。したがっての各列ベクトルの線型結合で出来上がったベクトルの中でもっともに近いやつ(似ているやつ)が
となるのだ。ここで
を
の列ベクトルが張る空間への射影行列
と呼ぶ。「射影」という考え方は機械学習において非常に重要なので、ぜひ覚えておきましょう。