【図解】主成分分析でなぜ共分散行列の固有ベクトルが主成分になるのか

#1. はじめに

主成分分析(PCA)の勉強中になぜ共分散行列の固有ベクトルが主成分となるのか疑問に思いました。
数学的な意味は説明をできないのですが、アニメーション等を使ってイメージをつかみたいと思います。
*数学的な説明と厳密性はありませんので、参考程度にご覧ください。

#2. 固有値とは

こちらの投稿がとても参考になります。

https://qiita.com/kenmatsu4/items/2a8573e3c878fc2da306

(抜粋)
まず、固有値・固有ベクトルとは以下の数式に示されます。

```math

A{\bf x} = \lambda {\bf x}

```

${\bf x}\neq {\bf 0}$の${\bf x}$で、行列Aをかけると、長さが$\lambda$倍になるような${\bf x}$の事を**固有ベクトル**, $\lambda$を**固有値**と言います。
下記のグラフのように、行列Aで変換しても、回転せず、単に長さだけが変わるような引き伸ばしのみを行う、Aとxの組み合わせの事になるのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2048607/1a087a1b-e705-9dc7-ec2d-053b8bb87e67.png)



#3. 共分散行列とは

こちらの投稿がとても参考になります。

https://qiita.com/Seiji_Tanaka/items/5c8041dbd7da1510fbe9


(抜粋)
共分散行列は以下のような形の行列となります。


```math 
{\rm V[{\boldsymbol{X}}]}=\left(
\begin{array}{ccc}
 {\rm V}[X_1] & {\rm Cov}[X_1,X_2] \\
{\rm Cov}[X_2,X_1] & {\rm V}[X_2]
\end{array}
\right)
```


${V[X]}$：$X$の分布の広がり
${{\rm Cov}[X,Y]}$：$X,Y$の一致度</font>
というイメージになります。

#4. 共分散行列の固有値・固有ベクトル

と、ここまでは他の方の投稿を引用をさせていただきましたが、
タイトルにあるとおり、なぜ共分散行列の固有ベクトルが主成分になるかという話に入ります。

まず以下のような分布を考えます。
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2048607/300cb81d-1951-d6b8-b843-561d08d22207.png)

```python
import numpy as np

#データ数　上げると精度が上がる
N = 10 ** 5

#乱数の生成
x1 = np.random.normal(0, 1, N)
x2 = np.random.normal(0, 2, N)

#二つの乱数列の結合　それぞれ異なるパラメータを設定したいため後から結合する
x = np.vstack([x1, x2])

theta = np.pi / 6
rot = np.array([[np.cos(theta), np.sin(theta)], [-np.sin(theta), np.cos(theta)]], np.float32)
x = np.dot(rot, x)
```


この分布の共分散行列は以下の通りです。

```math 
{\rm V[{\boldsymbol{X}}]}=\left(
\begin{array}{ccc}
 1.74 & 1.30 \\
 1.30 & 3.27
\end{array}
\right)
```

```python
cov_mat = np.cov(x)
```

```
cov_mat = [[1.74282907 1.30146763]
           [1.30146763 3.27194112]]
```



この行列の固有ベクトルについて、No.2で紹介したリンク先にあるようなアニメーションで説明すると
以下の通りになります。
青線が長さ1のベクトル(x)、赤線がそのベクトルを共分散行列(A)で変換したベクトルになります。

![image-min.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2048607/40733954-1f4d-8e0b-4704-93e2acfb07d7.gif)

青線と赤線の向きが一致する部分が固有ベクトルになります。
1つ目の固有ベクトルは v1 = (0.50, 0.87)となります。
長さ1のベクトルが固有値4.0によって引き延ばされています。
![0082.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2048607/b2bb1611-c32d-956b-55a7-0a534019c8dc.png)

2つ目の固有ベクトルは v2 = (-0.87, 0.50)となります。
長さ1のベクトルが固有値1.0によって等倍となっています。
![0208.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2048607/70ff65b8-76da-f5e0-ccd2-3e3126087daa.png)

```python
eigen_vals, eigen_vecs = np.linalg.eig(cov_mat)
```

```
eigen_vals = [0.99796007 4.01681012]
eigen_vecs = [[-0.86790592 -0.49672862]
              [ 0.49672862 -0.86790592]]
```


また、上記のGIFの赤線と青線の軌跡をとると、以下のような画像が得られます。
青い線によって描かれる単位円が共分散行列によって赤い線の楕円に変換されていることが分かります。


![last.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2048607/0a9536de-d8b5-ede2-6d7f-96b918723d7d.png)

この画像を元の分布と比較すると、ちょうど元の分布の形に沿っていることが分かります。
この時、1つ目の固有値(大きいほう)に対応する固有ベクトルv1が長辺、2つ目の固有値(小さいほう)に対応する固有ベクトルv2が短辺となっています。

![last1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2048607/4d8319b7-ea51-9ae0-1193-1e1dbf9f4995.png)


これらのことから、
・共分散行列は単位円を分布に沿った楕円に変換する行列である。
・共分散行列の固有値ベクトルは、楕円の長辺と短辺になる。
・この長辺と短辺が分布の分散を最大とする軸(主成分)となる。
ことが分かりました。

#5. まとめ
今回はイメージ図として、自分がしっくりくるような理解の仕方でまとめました。
そのため正確な説明ではないことに加えて、数学的な厳密性がまったくないため、そのあたりきちんと勉強することが必要だと感じました。