Kernel PCA

Basic

Kernel PCA | ขยาย PCA ด้วยเคอร์เนล

まとめ
  • Kernel PCA ใช้เคอร์เนลเพื่อฉายข้อมูลไปยัง space ที่มีมิติสูง แล้วหาองค์ประกอบหลักใน space นั้น
  • จัดการรูปแบบไม่เชิงเส้นที่ PCA ธรรมดาทำไม่ได้ เช่น รูปโดนัทหรือวงกลมซ้อน
  • ต้องเลือก kernel และพารามิเตอร์ (เช่น RBF gamma) ให้เหมาะ ขึ้นกับรูปแบบข้อมูล
  • การคำนวณใช้เฉพาะเมทริกซ์เคอร์เนล จึงได้จากการแก้ปัญหา eigen decomposition ขนาด N×N

ภาพรวม #

PCA ทำงานเชิงเส้น Kernel PCA ใช้เคอร์เนล \(K(x_i, x_j) = \phi(x_i)^\top \phi(x_j)\) เพื่อทำให้ dot product อยู่ใน space ที่มีมิติสูง แล้วทำ PCA ใน space นั้น (implicit)

ขั้นตอน #

  1. คำนวณเมทริกซ์เคอร์เนล \(K\)
  2. ทำให้ศูนย์กลาง: \(K’ = K - \mathbf{1}K/N - K\mathbf{1}/N + \mathbf{1}K\mathbf{1}/N^2\)
  3. แก้ \(K’ \alpha = \lambda \alpha\) และ normalize
  4. พิกัดองค์ประกอบหลักได้จาก \(\alpha\)

ตัวอย่าง Python #

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.decomposition import KernelPCA
from sklearn.datasets import make_circles

X, y = make_circles(n_samples=400, factor=0.3, noise=0.05, random_state=0)

kpca = KernelPCA(n_components=2, kernel="rbf", gamma=15)
X_kpca = kpca.fit_transform(X)

fig, axes = plt.subplots(1, 2, figsize=(10, 4))
axes[0].scatter(X[:, 0], X[:, 1], c=y, cmap="coolwarm")
axes[0].set_title("ข้อมูลต้นฉบับ")
axes[1].scatter(X_kpca[:, 0], X_kpca[:, 1], c=y, cmap="coolwarm")
axes[1].set_title("พิกัดหลัง Kernel PCA")
for ax in axes:
    ax.grid(alpha=0.2)
plt.tight_layout()
plt.show()

Kernel PCA กับข้อมูลวงกลมซ้อน

เคล็ดลับ #

  • kernel: rbf, poly, sigmoid
  • ปรับ gamma, degree, coef0 ให้เข้ากับสเกลข้อมูล
  • ใช้ร่วมกับ SVM หรือ k-means หลังลดมิติ

เอกสารอ้างอิง #

  • Schölkopf, B., Smola, A., & Müller, K.-R. (1998). Nonlinear Component Analysis as a Kernel Eigenvalue Problem. Neural Computation.
  • scikit-learn developers. (2024). Kernel PCA. https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.KernelPCA.html