もっと数理を!主成分分析 Python機械学習プログラミング第5章

この本では、あまり主成分分析について数理的な物が書いていなかったので調べた。下に参考にしてわかりやすかった本を紹介した。

まず2次元の時がわかりやすいので、その時について考えて、一般的な物について考える。

主成分分析

互いに相関のある変数について観測された多次元データの持つ情報をできるだけ失うことなく、元の変数の線形結合で表される新たな変数へ要約するための手法である。

また、

多次元データに内在する情報という概念を分散でとらえて、情報をできるだけ失うことなく新たな変数で定義していく方法である。

と下に載せた多変量解析入門に書いてあった。

つまり、あるデータの分布がある時に、分散の大きい方向を軸にとってパラメータとした方が、全体として分類しやすくなるのではないかということである。分散が大きいというのは、それほど、個々のデータに差がある分布になるからだ。

二次元の場合

パーセプトロンなどでの全結合層を線形変換ととらえると、

 y = \vec{w}^T\vec{x}

となる。

このyへの射影の線形変換を考えて、この時のyの分散が最大化する時の\vec{w}を求めたい。 iはデータの番号

 \bar{y} = \frac{1}{n}sum_i (w_1 x_{i1} + w_2 x_{i2})= w_1\frac{1}{n}\sum_i  x_{i2} + w_2\frac{1}{n}\sum_i x_{i2}= w_1\bar{x_1} + w_2\bar{x_2}  = \vec{w}^Tar{\vec{x}}

次に分散を求める。

 s^2_y = \frac{1}{n}\sum_i (y_i - ar{y})^2 = \frac{1}{n}sum_i (w_1(x_{i1} - \bar{x_1}) + w_2(x_{i2} - \bar{x_2}))^2

= w_1^2\frac{1}{n}\sum_{i}(x_{i1} - \bar{x_1})^2 + 2w_1w_2\frac{1}{n}\sum_i(x_{i1} - \bar{x_{1}})(x_{i2} - \bar{x_{2}}) + w_2^2\frac{1}{n}\sum_{i}(x_{i2} - \bar{x_2})^2

 = w_1s_{11} + 2w_1w_2s_{12}  + w_2s_{22}

 = \vec{w}^T S\vec{w}

ここで最後の行少し飛んだと思うが、行列の計算するだけ。

 S = \begin{pmatrix}s_{11}  s_{12} \\s_{21}  s_{22}\end{pmatrix}

そうすると最後の

 = \vec{w}^TS\vec{w}

の最大化に帰着する。

まず、||\vec{w}|| \leqq 1 の条件を付ける。なぜなら、制限しない場合||\vec{w}|| ightarrowinfty となるからである。そして、ラグランジュの未定乗数法をつかうため、ラグランジュ関数を作る。

 L(\vec{w}) = \vec{w}^TS\vec{w} + \lambda_n(1 - \vec{w}^T\vec{w})

とする。

ラグランジュの未定乗数法についての説明はこちら↓

yosuke-programing.hatenadiary.com

 

 \frac{\partial L(\vec{w})}{\partial \vec{w} } = 2S\vec{w} - 2\lambda \vec{w} = 0

ここで、ベクトルによる微分を行った。

 \frac{\partial \vec{w}^TS\vec{w} }{\partial\vec{w}} = 2S\vec{w}

 \frac{\partial \vec{w}^T\vec{w}}{\partial \vec{w}} = 2\vec{w}

を用いた。

これらのベクトルの微分の公式の証明、全般的なベクトル、行列の微分はこちら↓。

yosuke-programing.hatenadiary.com

話を元に戻すと、

 S\vec{w} = \lambda \vec{w} 

この時、この \lambda は、固有値 \vec{w}固有ベクトルとなる。

また、

 s^2_y =  \vec{w}^TS\vec{w} が最大となるための \vec{w}は、固有ベクトル  \vec{w_{\lambda 1}}である。また、 S\vec{w}に左から \vec{w}^Tをかけると、\vec{w_{\lambda 1}}^T(S\vec{w_{\lambda 1}}) = \vec{w_{\lambda 1}}^T\lambda_1\vec{w_{\lambda 1}} =  \lambda_1\vec{w_{\lambda 1}}^T\vec{w_{\lambda 1}} = \lambda_1

最後は、条件である |\vec{w}|^2 = \vec{w}^T\vec{w} = 1を用いた。 

 s^2_y =  \vec{w_{\lambda 1}}^TS\vec{w_{\lambda 1}} = \lambda_1

よって、最大の分散を求めるのは、最大の固有値を求めることに帰着した。またこの時の第一主成分は、

 y_1 = x_1( \vec{w_{\lambda 1}})_1 + x_2( \vec{w_{\lambda 1}})_2

 となる。

次に、第二主成分を求める。第二主成分は、 \vec{w_{\lambda 1}}以外で、 yの分散s_y^2を最大化してなおかつ\vec{w_{\lambda 1}}と直交し( \vec{w_{\lambda 1}}^T\vec{w} = 0)、 |\vec{w}| = 1となるベクトルである。二次元だと正直直交するベクトルは、一個しかないように感じるが、三次元などを想像すると、第一主成分が決まったからといって、その成分に直交するベクトルは、その成分に対して回転するように無限にある。

f:id:ty070809390:20190517153714j:plain

なので今回は、一般てきに求める準備として行う。上と同様に、ラグランジュの未定乗数法より、

 

  L(\vec{w}) = \vec{w}^TS\vec{w} - \lambda_2(1 - \vec{w}^T\vec{w}) - \gamma (\vec{w_{\lambda 1}}^T\vec{w})

 \vec{w}偏微分すると、

 2S\vec{w} - 2\lambda_2\vec{w} - \gamma\vec{w_{\lambda 1}} = 0

 \gammaを求めたいので左から \vec{w_{\lambda 1}}をかけて |\vec{w_{\lambda 1}} |^2 = \vec{w_{\lambda 1}}^T\vec{w_{\lambda 1}} = 1より\gammaをとりだすと、

 2\vec{w_{\lambda 1}}^TS\vec{w} - \gamma = 0

 \vec{w_{\lambda 1}}^T\vec{w} = 0も用いた。

 (S\vec{w_{\lambda 1}})^T = (\lambda_1 \vec{w_{\lambda 1}})^T

\therefore\vec{w_{\lambda 1}}^TS = \lambda_1 \vec{w_{\lambda 1}}^T

より、

 2\vec{w_{\lambda 1}}^TS\vec{w} - \gamma = 2\lambda_1 \vec{w_{\lambda 1}}^T\vec{w} - \gamma = 0\\ \therefore \gamma = 0

よって、

 

 2S\vec{w} - 2\lambda_2\vec{w} - \gamma\vec{w_{\lambda 1}} = 2S\vec{w} - 2\lambda_2\vec{w}

となり、第一主成分と同じ形になった。

つまり第2主成分は、

 y_2  = x_1( \vec{w_{\lambda 2}})_1 + x_2( \vec{w_{\lambda 2}})_2

となる。

まとめると、

 y_1  = x_1( \vec{w_{\lambda 1}})_1 + x_2( \vec{w_{\lambda 1}})_2

 y_2  = x_1( \vec{w_{\lambda 2}})_1 + x_2( \vec{w_{\lambda 2}})_2

 V(y_1) = \lambda_1

 V(y_2) = \lambda_2

 

2次元以上の一般的な時

2次元とほとんど変わらず、おこなう。n次元のある第k番主成分は、

 y_k = \sum_i x_i( \vec{w_{\lambda k}})_i

 

 L(\vec{w}) = \vec{w}^TS\vec{w} - \lambda(1 - \vec{w}^T\vec{w}) - (\sum_i \gamma_i\vec{w_i}\vec{w})

となる。\vec{w}微分して、=0にすると

 2S\vec{w} - 2\lambda\vec{w}^T - (\sum_i \gamma_i\vec{w_i}

となる。求めたいのはすべての i について\gamma_i = 0である。

nを考えると \vec{w_l}^Tを左からかけると、

 2\vec{w_1}S\vec{w} - 2\lambda\vec{w_1}\vec{w}^T - \vec{w_1} (\sum_i \gamma_i\vec{w_i}) = 0

最後のシグマ内の gamma_l以外の成分は、ベクトルはすべて直交し0になる。すべての l \vec{w_l}^Tをかけるのを繰り返せば、すべての gamma_l =0になることがわかり、二次元と同じになり、

 y_k = \sum_i x_i( \vec{w_{\lambda k}})_i

 V(y_k) = \lambda_k

となる。

  \lambda_1 \geqq \lambda_2 \geqq \lambda_3 \cdots \qeqq \lambda_n

 

 

参考図書・資料

多変量解析入門――線形から非線形へ

多変量解析入門――線形から非線形へ

 

 

参考図書一覧↓

yosuke-programing.hatenadiary.com

 

Python機械学習プログラミングの他の記事はこちら↓

yosuke-programing.hatenadiary.com

 Amazonはこちら↓

[第2版]Python 機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

[第2版]Python 機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)