2.6.4
Kernel-PCA
まとめ
- Kernel PCA はカーネル写像により非線形構造を高次元特徴空間で線形に捉える。
- RBF などのカーネル選択とパラメータが、分離できる構造を決める。
- 線形 PCA では表現しにくい曲線的な構造の圧縮・可視化に向く。
直感 #
線形PCAで分離できない形状でも、Kernel PCAは『見え方の座標系』を変えてから主成分を取ります。元空間では曲がって見える構造を、カーネル空間で直線的に扱えるのが本質です。
詳細な解説 #
1. 直感:非線形構造を扱うPCA #
- PCAは「分散が最大の方向」を探すが、線形構造しか表現できない。
- データが「円」や「渦巻き」のように非線形構造を持つと、PCAではうまく分けられない。
- Kernel PCAでは、データを高次元空間に写像してからPCAを適用する。
2. 数式でみる Kernel PCA #
データ点 \(x_i \in \mathbb{R}^d\) を非線形写像 \(\phi(x)\) によって高次元空間へ移す。
カーネル行列
$$ K_{ij} = \langle \phi(x_i), \phi(x_j) \rangle $$ カーネル関数 \(k(x_i, x_j)\) を直接計算することで、高次元空間に行かずに内積を得る。固有値問題
$$ K v = \lambda v $$ を解くことで、非線形構造に対応した主成分を得る。
代表的なカーネル関数:
- RBFカーネル(ガウシアン): $$ k(x, x’) = \exp(-\gamma |x - x’|^2) $$
- 多項式カーネル: $$ k(x, x’) = (\langle x, x’ \rangle + c)^d $$
3. 実験用データ(円環構造) #
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.datasets import make_circles
X, y = make_circles(n_samples=400, factor=0.3, noise=0.15)
plt.figure(figsize=(8, 8))
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.title("円環状データ")
plt.show()
4. Kernel PCAで次元削減 #
from sklearn.decomposition import KernelPCA
kpca = KernelPCA(kernel="rbf", gamma=3)
X_kpca = kpca.fit_transform(X)
plt.figure(figsize=(8, 8))
plt.scatter(X_kpca[:, 0], X_kpca[:, 1], c=y)
plt.title("Kernel PCAによる2次元化")
plt.show()
通常のPCAでは分離できなかった「同心円のクラス」が、Kernel PCAではきれいに分離できる。
5. 実務での応用 #
- 非線形構造の可視化(例:円形・渦巻きデータ)
- パターン認識:手書き文字や顔画像の特徴抽出
- 非線形分類の前処理:SVMなどと組み合わせ
発展:Kernel PCAの注意点 #
- カーネル選択が重要:データに合うカーネルを選ぶ必要がある。
- 計算コスト:カーネル行列は \(O(n^2)\) の計算量で大規模データでは重い。
- 固有値の解釈が難しい:通常のPCAのように「寄与率」を直接解釈しにくい。