主成分分析応用
この記事では主成分分析の応用として、
①カーネル主成分分析(Kernel PCA)の導出過程
②特異値分解(SVD)と PCA の比較
について説明します。
1. カーネル行列の固有値問題の導出
1.1 特徴空間での共分散行列の固有値問題
まず、入力データ $ x_1, x_2, \dots, x_N $ に対して、非線形写像 $\phi$ を適用し、特徴空間上のデータ点 $\phi(x_i)$ を得ます。
この特徴空間における共分散行列は、中心化済みのデータの場合(ここでは中心化済みであると仮定)に、
C = \frac{1}{N} \sum_{i=1}^{N} \phi(x_i) \phi(x_i)^T
と定義されます。これに対して、固有値問題は
C \, v = \lambda \, v
となります。ここで、$v$ は特徴空間内の固有ベクトル、$\lambda$ は対応する固有値です。
1.2 固有ベクトルを訓練データの線形結合で表現する仮定
高次元(あるいは無限次元)の特徴空間では、直接 $v$ を求めるのは困難です。そこで、再現核ヒルベルト空間 (RKHS) の性質 や 表現定理 により、固有ベクトル $v$ は訓練データ ${\phi(x_i)}$ の線形結合で表現できると仮定します:
v = \sum_{i=1}^{N} \alpha_i \, \phi(x_i)
ここで、$\alpha_i$ は未知のスカラー係数であり、これらをまとめた係数ベクトルを $\boldsymbol{\alpha} = (\alpha_1, \alpha_2, \dots, \alpha_N)^T$ とします。
1.3 上記表現を固有値問題に代入する
固有値問題
C \, v = \lambda \, v
に、$v = \sum_{i=1}^{N} \alpha_i , \phi(x_i)$ を代入します。
1.3.1 左辺の展開
\begin{aligned}
C\, v &= \frac{1}{N} \sum_{j=1}^{N} \phi(x_j) \phi(x_j)^T \left( \sum_{i=1}^{N} \alpha_i \, \phi(x_i) \right) \\
&= \frac{1}{N} \sum_{j=1}^{N} \sum_{i=1}^{N} \alpha_i \, \phi(x_j) \left( \phi(x_j)^T \phi(x_i) \right) \\
&= \frac{1}{N} \sum_{j=1}^{N} \left( \sum_{i=1}^{N} \alpha_i \, k(x_j, x_i) \right) \phi(x_j)
\end{aligned}
ここで、カーネル関数
k(x_j, x_i) = \phi(x_j)^T \phi(x_i)
を利用しています。
1.3.2 右辺の展開
右辺は単に
\lambda \, v = \lambda \sum_{i=1}^{N} \alpha_i \, \phi(x_i)
となります。
1.4 基底の係数の比較
両辺は 一次独立の基底$\phi(x_j)$ の線形結合として表されているため、各 $j = 1, 2, \dots, N$ に対して、対応する係数が一致する必要があります。
すなわち、
\frac{1}{N} \sum_{i=1}^{N} \alpha_i \, k(x_j, x_i) = \lambda \, \alpha_j \quad \text{for } j=1,\dots,N.
これを行列形式で書くと、カーネル行列 $K \in \mathbb{R}^{N \times N}$(各成分 $K_{ji} = k(x_j, x_i)$)を用いて、
\frac{1}{N} K \, \boldsymbol{\alpha} = \lambda \, \boldsymbol{\alpha}
となります。両辺に $N$ を掛けると、
K \, \boldsymbol{\alpha} = N \lambda \, \boldsymbol{\alpha}
となります。
1.5 結果としての固有値問題
この変形により、元々特徴空間での固有値問題
C \, v = \lambda \, v
は、カーネル行列 $K$ の固有値問題
K \, \boldsymbol{\alpha} = N \lambda \, \boldsymbol{\alpha}
に帰着されます。これにより、明示的に高次元空間 $\phi(x)$ を計算せずとも、データ間の内積(カーネル関数)のみを用いて固有値分解が可能になります。
2. 特異値分解(SVD)を用いた PCA の解説
2.1 SVD を用いる理由
通常の主成分分析では、中心化したデータ行列 $X \in \mathbb{R}^{n \times d}$ に対して共分散行列
C = \frac{1}{n} X^T X
の固有値分解を行います。しかし、特徴量の次元 $d$ がサンプル数 $n$ より大きい場合、$d \times d$ の共分散行列の固有値分解は計算負荷が非常に高くなります。
そのため、特異値分解(SVD) を利用すると、共分散行列を明示的に計算することなく、直接データ行列 $X$ から主成分を抽出できます。
2.2 SVD の基本的な考え方
中心化したデータ行列 $X$ に対して SVD を実行すると、
X = U\, \Sigma\, V^T
と分解されます。ここで、
-
$U \in \mathbb{R}^{n \times r}$
左特異ベクトル行列(サンプル空間の直交基底) -
$\Sigma \in \mathbb{R}^{r \times r}$
対角成分に非負の特異値 $\sigma_i$ ($ i = 1, 2, \dots, r $)を持つ行列 -
$V \in \mathbb{R}^{d \times r}$
右特異ベクトル行列(特徴空間の直交基底)
2.3 特徴量次元が大きい場合の効率性
-
大きな $d$ の場合
$X^T X$ のサイズは $d \times d$ となるため、直接固有値分解を行うと計算負荷が高くなります。 -
効率的な手法
その代わり、$X X^T$(サイズ $n \times n$)の固有値分解を先に計算し、得られた左特異ベクトル $U$ から、以下の関係で右特異ベクトル $V$ を求める方法が有効です。
v_i = \frac{1}{\sigma_i} X^T u_i
この手法により、計算量やメモリ使用量を大幅に削減できます。