こんにちは、本日はとりあえず実装をする前に、パパッとデータの確認です。


![]()
で二つ作りました。見ての通り上の方がノイズが大きいです。今回の予測モデルは直線
![]()
とします。サクッとPYTHONで書くと下のような結果がとれます。まずノイズが小さい方のデータに対して

コストが減っており、それに合わせてパラメータ
も本来の
に収束しようとしています。上のプロットが見にくいのですが、学習の際のパラメータ履歴で直線をプロットしたものです。次にノイズが大きい方の結果を見てみましょう。

同様にコストも減り、パラメータも本来の値に近ずいてはいますがどおも届きそうにないです。iteration=150あたりで学習が止まっているのでこれ以上は赤点に近づかないでしょう。これはノイズが大きいことが原因です。
とりあえず線形回帰を二変数で行いましたが多変数になってもやり方は全く変わりません。コードを書くのが面倒になりますが sklearnにはすでにlinear regression含め他にも多くの手法があるので簡単に回帰ができます。詳しくは「python 線形回帰 sklearn」などでググればいっぱい出てくるので見てください。
ところで
線形回帰をいい例題にして行列の勉強を簡単にしましょう。というのは何かというと、実は、勾配法使わなくても一発で解が出るんです。
![]()
というモデルを考えます。これを行列表記すると
![Rendered by QuickLaTeX.com \[\begin{bmatrix} y_1 \ y_2 \ \vdots \ y_n \ \end{bmatrix} = \begin{bmatrix} 1 & x_{11} & x_{12} & \cdots & x_{1k} \ 1 & x_{21} & x_{22} & \cdots & x_{2k} \ \vdots & \vdots & \vdots & \vdots & \vdots \ 1 & x_{n1} & x_{n2} & \cdots & x_{nk} \ \end{bmatrix} \begin{bmatrix} \beta_0 \ \beta_2 \ \vdots \ \beta_k \ \end{bmatrix} + \begin{bmatrix} \epsilon_1 \ \epsilon_2 \ \vdots \ \epsilon_n \ \end{bmatrix}\]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-2e1bd8f0c8a67d3a1560eb978fe8ff5b_l3.png)
![]()
ただし、
はデータ数、
は次元(変数の数)とした。ここで前回の理論編を思い出すと今回の最適化は誤差二乗和の最小化であった。よってノルムの定義を思い出せば
![]()
を最小化すればいい(1/2は計算上の都合、別になくても良い)、これを計算する。ベクトルの微分については
- https://www.ics.uci.edu/~welling/teaching/KernelsICS273B/MatrixCookBook.pdf
- https://atmos.washington.edu/~dennis/MatrixCalculus.pdf
ここあたりがいい教材だと思う。もちろん「ベクトル 微分」で検索しても多く出てくる。
今回使うのは次の3つ。
![]()
![]()
![]()
では計算すると
![]()
![]()
![]()
これを0と置くと
![]()
ここで
が正則行列を仮定すると
(機械学習の観点から「正則行列」を説明すると「どの列もほとんど似通ってない」になる)
![]()
と求まる。これが最も誤差が最小であるときのパラメータである。
なんの射影?どこへの射影?
そう、この疑問は大切だ。今私たちが扱っているのは
である。
についてじーっと見るとこれは
の各列ベクトルの線型結合(四則演算)となることがわかる。たとえば
と表し、
とすると
![]()
となることがわかる。ここで各
はベクトルであり
はスカラーであることに注意する。したがって
の各列ベクトルの線型結合で出来上がったベクトルの中でもっとも
に近いやつ(似ているやつ)が
![]()
となるのだ。ここで
![]()
を
の列ベクトルが張る空間への射影行列
と呼ぶ。「射影」という考え方は機械学習において非常に重要なので、ぜひ覚えておきましょう。