こんにちは、本日はとりあえず実装をする前に、パパッとデータの確認です。
![](https://research.miidas.jp/wp-content/uploads/2018/11/Screen-Shot-2018-11-08-at-19.39.11.png)
![Rendered by QuickLaTeX.com \[y = 3x - 4 + noise \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-fc1e38319edca88e658b2097a1afbdb3_l3.png)
で二つ作りました。見ての通り上の方がノイズが大きいです。今回の予測モデルは直線
![Rendered by QuickLaTeX.com \[y=mx+b\]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-b2cf14624e392933909f61673351ab22_l3.png)
とします。サクッとPYTHONで書くと下のような結果がとれます。まずノイズが小さい方のデータに対して
![](https://research.miidas.jp/wp-content/uploads/2018/11/Screen-Shot-2018-11-08-at-19.36.52.png)
コストが減っており、それに合わせてパラメータ
![Rendered by QuickLaTeX.com (m,b)](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-512e11d8df0ab348a5ffbd56f517b9a1_l3.png)
も本来の
![Rendered by QuickLaTeX.com (3,-4)](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-9d45d2b1d7bfc66106a32f56c1e61fa4_l3.png)
に収束しようとしています。上のプロットが見にくいのですが、学習の際のパラメータ履歴で直線をプロットしたものです。次にノイズが大きい方の結果を見てみましょう。
![](https://research.miidas.jp/wp-content/uploads/2018/11/Screen-Shot-2018-11-08-at-19.37.09.png)
同様にコストも減り、パラメータも本来の値に近ずいてはいますがどおも届きそうにないです。iteration=150あたり
で学習が止まっているのでこれ以上は赤点に近づかないでしょう。これはノイズが大きいことが原因です。
とりあえず線形回帰を二変数で行いましたが多変数になってもやり方は全く変わりません。コードを書くのが面倒になりますが sklearnにはすでにlinear regression含め他にも多くの手法があるので簡単に回帰ができます。詳しくは「python 線形回帰 sklearn」などでググればいっぱい出てくるので見てください。
ところで
線形回帰をいい例題にして行列の勉強を簡単にしましょう。というのは何かというと、実は、勾配法使わなくても
一発で解が出るんです。
![Rendered by QuickLaTeX.com \[ y_i = 1 * \beta_0 + x_{i1} * \beta_1 + x_{i2} * \beta_2 + \cdots + x_{ik} * \beta_k + \epsilon_i \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-ec022e6a43d93d090f1ebee3b7efecc3_l3.png)
というモデルを考えます。これを行列表記すると
![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)
![Rendered by QuickLaTeX.com \[y = X \beta + \epsilon \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-8c876d8170eb55dc937c1b228d9f6b34_l3.png)
ただし、
![Rendered by QuickLaTeX.com n](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-b170995d512c659d8668b4e42e1fef6b_l3.png)
はデータ数、
![Rendered by QuickLaTeX.com k](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-3422b6bb5c160593658b7c39425d9880_l3.png)
は次元(変数の数)とした。ここで前回の理論編を思い出すと今回の最適化は
誤差二乗和の最小化であった。よってノルムの定義を思い出せば
![Rendered by QuickLaTeX.com \[\frac{1}{2} | \epsilon |^2 = \frac{1}{2} | y - X \beta |^2 \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-1b86215c22ad1ef26987ae60cf9dd09b_l3.png)
を最小化すればいい(1/2は計算上の都合、別になくても良い)、これを計算する。ベクトルの微分については
ここあたりがいい教材だと思う。もちろん「ベクトル 微分」で検索しても多く出てくる。
今回使うのは次の3つ。
![Rendered by QuickLaTeX.com \[ \frac{\partial }{\partial x} a^Tx = a\]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-2f0e686f8e781644ac4d6f90fc2fe6a3_l3.png)
![Rendered by QuickLaTeX.com \[ \frac{\partial }{\partial x} x^Ta = a\]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-deeb23b4481cec07483864cd19fc9b9e_l3.png)
![Rendered by QuickLaTeX.com \[ \frac{\partial }{\partial x} x^TAx = (A + A^T)x\]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-393a226a88ad9d293d05d117b20e700f_l3.png)
では計算すると
![Rendered by QuickLaTeX.com \[\frac{1}{2} | y - X \beta |^2 = \frac{1}{2} (y - X \beta)^T (y - X \beta) \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-72e6d76793407f6dba2c421643891333_l3.png)
![Rendered by QuickLaTeX.com \[\frac{1}{2} | y - X \beta |^2 = \frac{1}{2} ( \beta^TX^TX \beta - 2y^TX\beta +y^Ty ) \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-dbc6b4048bccccfb84b813e1b4e7236c_l3.png)
![Rendered by QuickLaTeX.com \[\nabla_\beta \frac{1}{2} | y - X \beta |^2 = (X^T X + (X^T X)^T)\beta - 2X^Ty \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-8b08d9613ef0a7cb6f1279e248e981eb_l3.png)
これを0と置くと
![Rendered by QuickLaTeX.com \[ X^T X \beta = X^Ty \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-172442a01580f2acc926c05bff24b5d5_l3.png)
ここで
が正則行列を仮定すると
(機械学習の観点から「正則行列」を説明すると「どの列もほとんど似通ってない」になる)
![Rendered by QuickLaTeX.com \[\beta = (X^T X)^{-1} X^Ty \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-76dff7a304f279643293330173587e65_l3.png)
と求まる。これが最も誤差が最小であるときのパラメータである。
なんの射影?どこへの射影?
そう、この疑問は大切だ。今私たちが扱っているのは
![Rendered by QuickLaTeX.com \frac{1}{2} | y - X \beta |^2](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-723e4dcb59c731abe32dcd8c9bda4eb2_l3.png)
である。
![Rendered by QuickLaTeX.com X \beta](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-574ed230394078083a661c4c15e87856_l3.png)
についてじーっと見るとこれは
の各列ベクトルの線型結合(四則演算)となることがわかる。たとえば
![Rendered by QuickLaTeX.com X = [X_1 X_2 \cdots X_n]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-f9713d1ace5029e154efde5027a369ec_l3.png)
と表し、
![Rendered by QuickLaTeX.com \beta=[ \beta_1 \beta_2 \cdots \beta_n ]^T](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-5e4cab456f57cfc0b00fca059cb34bc5_l3.png)
とすると
![Rendered by QuickLaTeX.com \[X \beta = X_1 \beta_1 + X_2 \beta_2 + \cdots X_n \beta_n + \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-0686e9860b1245ebf783525bc34f41be_l3.png)
となることがわかる。ここで各
![Rendered by QuickLaTeX.com X_i](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-998dba373bb08119e12a646c873be88c_l3.png)
はベクトルであり
![Rendered by QuickLaTeX.com \beta_i](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-d9f196703cd90dc77bb023d4d0dc36f1_l3.png)
はスカラーであることに注意する。したがって
![Rendered by QuickLaTeX.com X](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-d4ee28752517d6062a3ca0314890342d_l3.png)
の各列ベクトルの線型結合で出来上がったベクトルの中で
もっとも
に近いやつ(似ているやつ)が
![Rendered by QuickLaTeX.com \[X\beta = X(X^T X)^{-1} X^Ty \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-9add6f71881b72d471eb73bf924a62bd_l3.png)
となるのだ。ここで
![Rendered by QuickLaTeX.com \[X(X^T X)^{-1} X^T \]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-77819da1ae91ffae48a96a11df999240_l3.png)
を
の列ベクトルが張る空間への射影行列
と呼ぶ。「射影」という考え方は機械学習において非常に重要なので、ぜひ覚えておきましょう。