私が書いた昔のプライベート Wiki を見ていたら PCA の記事を発掘したので供養します。
何分昔の記事なので最近のものと比べると文体やスタイルが異なりますが、いまでもこの説明より分かり易いと感じる記事を見かけないので、もしかしたら誰かの役に立つかもしれません。
数式のナンバリングと相互参照と TeX マクロの定義ができないので、 Zenn で多くの数式を含む記事を書くのはやはりつらいですね。
主成分分析 (PCA; Principal Component Analysis)
高次元のデータセットに内在する自由度を見積もり、データを最もよく分離する成分を見つけ出す手法。データの可視化に最もよく使われるが、学習の際に高すぎる次元を削減する目的でも使われる。
たとえば下図の青い丸で示す散布図のように高い相関のある2変数のデータセットがあった場合、PCAによって黒線で示す2つの軸を求めることができる。長いほうの黒線が第1主成分といわれ、データを最もよく分離するベクトルになる。短いほうの第2主成分は、2次元の場合は、データを最も分離できないベクトルを示す。
次元削減 (Dimensionality reduction)
強い主成分だけをピックアップすることで次元削減することができる。
この例では、データを第1主成分だけで表現し(内積をとる)、第2主成分を無視すると、データの特徴の大部分は第1主成分だけで表現できるので、情報を(それほど)失わずに次元を削減できる。
この操作はデータを第1主成分の軸上に投影することと等価である。
特異値・特異ベクトル
PCA の中身は SVD (特異値分解; Singular Vector Decomposition) といわれる行列操作である。この結果として特異値と特異ベクトルが得られる。
特異ベクトルとは、 PCA でいう主成分のことであるが、これに対応する特異値(スカラー)は、その主成分がどれだけデータを分離できているかを示すパラメータとなる。
たとえば、とある 2048 次元のデータセットに関する特異値を、下図のようにプロットすることができる。左端が第1主成分になる。
第2、第3主成分になっていくにしたがって、急速に特異値が小さくなっていくことがわかる(対数スケールに注目)。ここから言えることは、1%程度の誤差を許容するなら、4次元か5次元まで次元削減しても問題ないということであり、データセットに内在する自由度はその程度だということである。
直観的な説明
特異値分解は共分散行列の対角化と等価である。
共分散行列は下記のような値を要素を i 行 j 列に持つ行列である。ここで x_{ik} は k 番目の標本の i 番目の変数の値(e.g. x_{i=1} = x, x_{i=2} = y)を示し、 \bar{x_i} は変数の平均値である。
\Sigma_{ij} = \frac{1}{N-1} \sum_{k=1}^N (x_{ik} - \bar{x_i}) (x_{jk} - \bar{x_j})
これは多変数ガウス分布にフィットさせたときの母集団の共分散行列の期待値である。
下図のように相関のあるデータの共分散行列を計算すると、対角要素以外が大きな値を持つようになる。これは共分散の定義が相関係数(correlation coefficient)の分子であることからも理解されよう。下図にはフィットしたガウス分布の等高線も表示してあり、赤い線が第1主成分、青い線が第2主成分である。
さて、この共分散行列を対角化するということは、固有ベクトルを基底とする座標系への変換をかけることで対角要素以外をゼロにするということである。新しい座標系で見ると下図のように変数間の相関がなくなる。
このことを数式の上で理解するためには、まず多変数ガウス分布の指数部分だけ抜き出す。(正規化係数は煩わしいので省略)
\def\bx{\mathbf{x}}
\def\bmu{\boldsymbol{\mu}}
\def\bSigma{\boldsymbol{\Sigma}}
\def\T{\mathbf{T}}
\exp\left\{-\frac{1}{2} (\bx - \bmu)^\T\bSigma^{-1} (\bx - \bmu) \right\}
固有ベクトル \mathbf{u}_i 及び固有値 \lambda_i を使って、 \boldsymbol{\Sigma}^{-1} = \sum_{i=1}^M \frac{1}{\lambda_i} \mathbf{u}_i \mathbf{u}_i^\mathrm{T} と表すことができる(後述)。これを使って次のように計算していく。
\def\bx{\mathbf{x}}
\def\bmu{\boldsymbol{\mu}}
\def\bSigma{\boldsymbol{\Sigma}}
\def\T{\mathbf{T}}
\def\bui{\mathbf{u}_i}
\exp\left\{-\frac{1}{2} (\bx - \bmu)^\T \sum_{i=1}^M \frac{1}{\lambda_i} \bui \bui^\T (\bx - \bmu) \right\} \\
= \exp\left\{-\frac{1}{2} \sum_{i=1}^M \frac{1}{\lambda_i} \left[ \bui^\T (\bx - \bmu) \right]^\T \bui^\T (\bx - \bmu) \right\} \\
= \exp\left\{-\frac{1}{2} \sum_{i=1}^M \frac{1}{\lambda_i} || \bui^\T (\bx - \bmu) ||^2 \right\} \\
= \prod_{i=1}^M \exp\left\{-\frac{1}{2\lambda_i} || \bui^\T (\bx - \bmu) ||^2 \right\}
最終的には1変数ガウス分布の積で表すことができる。これは各変数が独立であるということである。ここで各々のガウス分布の引数となっている \mathbf{u}_i^\mathrm{T} (\mathbf{x} - \boldsymbol{\mu}) は、固有ベクトルと元の座標系との内積なので、固有ベクトル空間への変換を表す。また、固有値 \lambda_i は、各々のガウス分布の分散を示している。このことから、固有値が大きいものから順番に選んでゆけば、データが最もばらついている成分(=主成分)を抽出できる。
固有値・固有ベクトルでの行列表現
\boldsymbol{\Sigma}^{-1} = \sum_{i=1}^M \frac{1}{\lambda_i} \mathbf{u}_i \mathbf{u}_i^\mathrm{T} という定理が気になる人(いないだろうが)のために説明すると、そもそも固有値問題とは、固有ベクトル \mathbf{u}_i 及び固有値 \lambda_i を使って、
\def\bSigma{\boldsymbol{\Sigma}}
\def\bui{\mathbf{u}_i}
\bSigma \bui = \lambda_i \bui
と表せるかどうかという問題である。この解法は千冊ぐらいの本に載っていると思われるので省略するが、固有値を対角要素に持つ行列を次のように定義して、
\Lambda = \begin{pmatrix}
\lambda_1 & 0 & \cdots & 0 \\
0 & \lambda_2 & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \cdots & \lambda_M
\end{pmatrix}
固有ベクトルを並べて作った行列 \mathbf{U} を使うと、
\boldsymbol{\Sigma} \mathbf{U} = \mathbf{U}\Lambda
と表せる。これに右側から \mathbf{U}^{-1} を掛けると、
\boldsymbol{\Sigma} = \mathbf{U} \Lambda \mathbf{U}^{-1}
となり、この逆行列をとり、固有ベクトルは正規直交するように選ぶことから \mathbf{U}^{-1} = \mathbf{U}^\mathrm{T} であることと
(BA)^{-1} = A^{-1}B^{-1} を使って、さらに
\boldsymbol{\Sigma}^{-1} = \mathbf{U} \Lambda^{-1} \mathbf{U}^\mathrm{T}
と表す。これを別の書き方で表現すれば
\def\bui{\mathbf{u}_i}
\boldsymbol{\Sigma}^{-1} = \sum_{i=1}^M \frac{1}{\lambda_i} \bui \bui^\mathrm{T}
となる。
Discussion