まとめ
- 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)
ขั้นตอน #
- คำนวณเมทริกซ์เคอร์เนล \(K\)
- ทำให้ศูนย์กลาง: \(K’ = K - \mathbf{1}K/N - K\mathbf{1}/N + \mathbf{1}K\mathbf{1}/N^2\)
- แก้ \(K’ \alpha = \lambda \alpha\) และ normalize
- พิกัดองค์ประกอบหลักได้จาก \(\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: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