Kernel-PCA

2.6.4

Kernel-PCA

最終更新 2020-03-11 読了時間 1 分
まとめ
  • 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)\) によって高次元空間へ移す。

  1. カーネル行列
    $$ K_{ij} = \langle \phi(x_i), \phi(x_j) \rangle $$ カーネル関数 \(k(x_i, x_j)\) を直接計算することで、高次元空間に行かずに内積を得る。

  2. 固有値問題
    $$ 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()

Kernel PCAで次元削減の図

通常のPCAでは分離できなかった「同心円のクラス」が、Kernel PCAではきれいに分離できる。


5. 実務での応用 #

  • 非線形構造の可視化(例:円形・渦巻きデータ)
  • パターン認識:手書き文字や顔画像の特徴抽出
  • 非線形分類の前処理:SVMなどと組み合わせ

発展:Kernel PCAの注意点 #

  • カーネル選択が重要:データに合うカーネルを選ぶ必要がある。
  • 計算コスト:カーネル行列は \(O(n^2)\) の計算量で大規模データでは重い。
  • 固有値の解釈が難しい:通常のPCAのように「寄与率」を直接解釈しにくい。