thumbnail

主成分分析(PCA)の数式の導出方法を徹底解説

主成分分析(以下、PCA)の数式を導出・解説します。流れが詳しくわかるよう、丁寧に式変形するよう心がけております。PCAはデータ分布の様子をなるべく保持したままデータを低次元表現する手法です。その際主軸を変換するのですが、この主軸がデータの共分散行列の固有値問題に帰着し、最大固有値に対する固有ベクトルの向きが第一主軸となることを示します。

概略

PCAでは、データ分布の分散、すなわち広がりが大きくなるような方向の主軸を見つけ、相関の少ないデータの表現を得る。この際、分散が大きい軸のみをピックアップすることで、データ分布の情報をなるべく残したまま、データの次元を削減することが可能となる。

数式

①平均ベクトルを求める

まず、mm次元空間中に、NN個のデータxi(i=1,,N)\mathbf{x}_i(i=1,…,N)があるとする。データの平均ベクトルm

m=1Ni=1Nxi\mathbf{m}= \frac{1}{N}\sum^N_{i=1}\mathbf{x}_i

②データをずらす

NN個のデータxi\mathbf{x}_iを、平均ベクトル分m\mathbf{m}ずらしたものをri\mathbf{r}_iとおくと

ri=xim\mathbf{r}_i=\mathbf{x}_i-\mathbf{m}

これにより白色化し、ri\mathbf{r}_iの平均rˉ\bar{\mathbf{r}}rˉ=0\bar{\mathbf{r}}=\mathbf{0}となる。

③単位ベクトルへ射影

白色化したデータri\mathbf{r}_iをある1次元単位ベクトルu\mathbf{u}に射影(riu\mathbf{r}_i^\top\mathbf{u})し、分散SSを計算する。

S=1Ni=1N(riurˉu)2=1Ni=1N(riu)2=1Ni=1N(riu)(riu)=1Ni=1Nuririu=u(1Ni=1Nriri)u=u(1Ni=1N(xim)(xim))u=uΣu \begin{align*} S &=\frac{1}{N}\sum_{i=1}^N(\mathbf{r}_i^\top\mathbf{u}-\bar{\mathbf{r}}^\top\mathbf{u})^2 \\ &= \frac{1}{N}\sum_{i=1}^N(\mathbf{r}_i^\top\mathbf{u})^2 \\ &= \frac{1}{N}\sum_{i=1}^N(\mathbf{r}_i^\top\mathbf{u})^\top(\mathbf{r}_i^\top\mathbf{u}) \\ &= \frac{1}{N}\sum_{i=1}^N \mathbf{u}^\top\mathbf{r}_i\mathbf{r}_i^\top\mathbf{u} \\ &= \mathbf{u}^\top\left(\frac{1}{N}\sum_{i=1}^N \mathbf{r}_i\mathbf{r}_i^\top\right)\mathbf{u} \\ &= \mathbf{u}^\top\left(\frac{1}{N}\sum_{i=1}^N (\mathbf{x}_i-\mathbf{m})(\mathbf{x}_i-\mathbf{m})^\top\right)\mathbf{u} \\ &= \mathbf{u}^\top \boldsymbol{\Sigma} \mathbf{u} \\ \end{align*}

ここで、Σ\boldsymbol{\Sigma}xi\mathbf{x}_{i}の共分散行列であり、uΣu\mathbf{u}^\top \boldsymbol{\Sigma} \mathbf{u}は二次形式である。

④固有値問題に帰着

共分散行列は半正定値対称行列なので、直交対角化が可能である。つまり、共分散行列Σ\boldsymbol{\Sigma}のある固有値λi\lambda_iに対する固有ベクトルをui\mathbf{u}_iとすると、Σui=λiui\boldsymbol{\Sigma}\mathbf{u}_i = \lambda_i \mathbf{u}_iとなるのでU=[u1uN]\mathbf{U}=[\mathbf{u}_1 \cdots \mathbf{u}_N]とおくと、

ΣU=Σ[u1uN]=[Σu1ΣuN]=[λ1u1λNuN]=[u1uN][λ1λN](λ1λN)=UΛUΣU=Λ \begin{align*} \boldsymbol{\Sigma}\mathbf{U} &= \boldsymbol{\Sigma}\begin{bmatrix}\mathbf{u}_1 \cdots \mathbf{u}_N\end{bmatrix} \\ &= \begin{bmatrix}\boldsymbol{\Sigma}\mathbf{u}_1 \cdots \boldsymbol{\Sigma}\mathbf{u}_N\end{bmatrix} \\ &= \begin{bmatrix}\lambda_1\mathbf{u}_1 \cdots \lambda_N\mathbf{u}_N\end{bmatrix} \\ &= \begin{bmatrix}\mathbf{u}_1 \cdots \mathbf{u}_N\end{bmatrix} \begin{bmatrix} \lambda_1 & & \\ & \ddots & \\ & & \lambda_N \end{bmatrix} (\lambda_1 \ge \cdots \ge \lambda_N) \\ &= \mathbf{U}\boldsymbol{\Lambda} \\ \therefore \mathbf{U}^\top \boldsymbol{\Sigma} \mathbf{U} &= \boldsymbol{\Lambda} \end{align*}

となり、共分散行列の対角化の式となる。

ここで、u\mathbf{u}を直交行列U\mathbf{U}^\topにより変換したものをu\mathbf{u}’(直交変換なので単位ベクトル)とおく。
すなわち、u=Uuu=Uu’ \mathbf{u}’=\mathbf{U}^\top\mathbf{u}\Leftrightarrow \mathbf{u}=\mathbf{U}\mathbf{u}’  とすると

uΣu=(Uu)Σ(Uu)S=uUΣUu=uΛu=i=1Nλiui2λ1i=1Nui2=λ1 \begin{align*} \mathbf{u}^\top \boldsymbol{\Sigma}\mathbf{u} &= (\mathbf{U}\mathbf{u}’)^\top \boldsymbol{\Sigma}(\mathbf{U}\mathbf{u}’) \\ S &= \mathbf{u}’^\top\mathbf{U}^\top\boldsymbol{\Sigma}\mathbf{U}\mathbf{u}’ \\ &= \mathbf{u}’^\top\boldsymbol{\Lambda}\mathbf{u}’ \\ &= \sum_{i=1}^N\lambda_i\mathbf{u}_i’^{2} \\ &\le \lambda_1\sum_{i=1}^N\mathbf{u}_i’^{2} \\ &= \lambda_1 \end{align*}

ここで、左辺は③より分散Sを表していることに注意する。

  • 一般に、対称行列A\mathbf{A}の2次形式xAx\mathbf{x}^\top\mathbf{A}\mathbf{x}を最大にする単位ベクトルはA\mathbf{A}の最大固有値λ1\lambda_1に対する固有ベクトルで、その値はλ1\lambda_1となる

すなわち、共分散行列の固有値は、データ分布を一次元に落としたときの分散を表しており、固有ベクトルはその分散が得られる軸方向を表す。そして、固有値の大きい順に対応する軸が決まる。

⑤結論

以上より、PCAの第1主軸は、

u1=arg maxu=1uΣu \begin{equation} \mathbf{u}_1=\argmax_{||\mathbf{u}||=1}\mathbf{u}^\top\boldsymbol{\Sigma}\mathbf{u} \end{equation}

すなわち、データの共分散行列の最大固有値に対応する固有ベクトルの向きが第一主軸となる。

発展

カーネルトリックを用いた、カーネルPCAについて式の導出を解説しております。