ホーム » 機械学習 » ねぇPython、PCAって何?(理論編)

ねぇPython、PCAって何?(理論編)

こんにちは。いまだにたまに暑いと感じるkzです。今回はなにをやりましょうかねえ。

このデータは見ての通り2次元(平面)データです。これを1次元(直線)に置き換えたいです。

各点の配置は?

置き換える時に重要なのは距離感です。離れていた点通しが置き換えた先でご近所さんになると元のデータをうまく表現できてるとは言えませんよね。それが次の図です。

離れていたはずがご近所さんになってしまっています。一方で次の図はどうでしょう、

さっきよりはうまく元のデータを表せていますよね。ではこれを先ほどの青いデータで考えると

この赤矢印上に先ほどと同様にして点を置き換えれば\mathbb{R}^2 \Rightarrow \mathbb{R}^1つまり2次元のデータを1次元で説明できることになります。

では本日の本題に入りましょう。

上の赤矢印(軸)

どうやっていい軸を選びましょうか。じーっと見てみましょう。広がっている方向に矢印が伸びていますね。つまりいい軸とはデータを矢印だけで表現したものと捉えることができそうです。では具体的にいい軸(ベクトル)をどう求めるかを考えましょう。

とりえあず求めるベクトルをvとします。今長さは別に興味ないので| v |=1とします。

正射影ベクトルを考えます。下の緑(a_1)はaのbへの射影です。

  1. https://www.geogebra.org/m/mkV7F8Jf

上の図はaをデータ点bを求めたいベクトルとした時にa_2の最小化もしくわa_1の最大化がしたいことになります。この事実は次のgifより明らかです。

なので今回はデータをx_i、ベクトルをbとするとその正射影ベクトルは

    \[ \frac{x_i \cdot v}{|v|}  v\]

です。これを全データで最大化したいので次のようになります。\frac{1}{N-1}は都合上のものです!

    \[\frac{1}{N-1} \sum_{i=1}^{N}  (x_i^T v)^2 = \frac{1}{N-1}  \sum_{i=1}^{N}  (x_i^T v)^T(x_i^T v)\]

    \[=   v^T \left(\frac{1}{N-1}\sum_{i=1}^{N} ( x_i x_i^T)\right) v\]

となります。\frac{1}{N-1} \sum_{i=1}^{N} ( x_i x_i^T)これって何でしょう?一応ですがx_i,vは共に縦ベクトルです。

そうです共分散行列です。これを\Sigmaと書くことにします。すると

    \[v^T \Sigma v  \]

が今回の目的関数です。今まで通りならこれを最大化するだけだったんですが今回は制約があります。

    \[| v | = 1  \]

です。この状況を条件付き極値問題と言います。これを解くには技が必要です。

    \[\texttt{Maximize} ~~~ f(x,y)  \]

    \[\texttt{Subject to} ~~~ g(x,y)=0  \]

を考える、f,g\mathbb{C}^1級(微分可能かつ導関数が連続)とする。点Pが極値をとるならば

    \[\mathcal{L} (x,y, \lambda) = f(x,y) - \lambda g(x,y)  \]

    \[\nabla f (P) - \lambda \nabla g(P) = 0\]

を満たす。あくまで候補点です。要点だけいうと勾配が平行になる点です。

証明や詳しい解説はここにあります。

  1. https://en.wikipedia.org/wiki/Lagrange_multiplier
  2. http://www.yunabe.jp/docs/lagrange_multiplier.html
  3. https://ocw.mit.edu/courses/mathematics/18-02sc-multivariable-calculus-fall-2010/2.-partial-derivatives/part-c-lagrange-multipliers-and-constrained-differentials/session-40-proof-of-lagrange-multipliers/MIT18_02SC_notes_22.pdf

これをラグランジュの未定乗数法と言います。これを使って計算しましょう。

    \[  \mathcal{L} (v, \lambda)  =  v^T\Sigma v - \lambda (| v|)\]

    \[\frac{\partial \mathcal{L}}{\partial v}= (\Sigma+\Sigma^T)v - 2 \lambda v = 0  \]

    \[ \Sigma v = \lambda v\]

おっと、これわ。。。。

固有ベクトルと固有値そのもの

要点をいうとx\neq 0のベクトルが行列Aの固有値であり\lambdaがその固有ベクトルとは

    \[Ax = \lambda x\]

となることをいい、行列Aによる作用が伸縮になるベクトルを固有ベクトルといいその伸縮率を固有値といいます。

もう少し別の言い方をすると。行列をかけた時に向きが変わらないベクトルとその伸縮率です。

詳しくは下のリンクを見てください。

  1. https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors
  2. https://qiita.com/kenmatsu4/items/2a8573e3c878fc2da306

したがって今回私たちが求めていたベクトル、いい軸は

データの共分散行列の固有ベクトル

とわかりました。つまりデータを固有ベクトルという軸へ射影することで得た新たなデータ点は

データの次元を落としつつ最大限に元のデータを表現している新しいデータ

ということになります。これがPCAのやってることです。

「PCAは射影である」

今回は2次元から1次元へのPCAでしたが一般にn次元へのPCAも同じです。固有ベクトルを軸としてとってきて射影により座標がデータのPCA後の座標です。2次元へのPCAなら2本の固有ベクトルにデータを射影して新たな座標を定義します。

最後に用語の説明をしておきます。

  • 第n主成分: 固有値が大きい方から数えてn番目のものに対応する固有ベクトルのことをいう。
  • 寄与率: (第n番目固有値/固有値の総和)
  • 累積寄与率: 寄与率の累積

寄与率?固有値?

はい、説明します。固有値は伸縮率といいました。つまり対応する固有ベクトル方向へのデータの散らばり具合です。よって固有値とはデータの広がり具合(分散)を説明します。なので「元データを説明している具合」を分散という観点から考えて寄与としています。

本日はここまで。でわ

参考;

  1. http://cs229.stanford.edu/notes/cs229-notes10.pdf

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です