Spectral Clustering

Basic

Spectral Clustering | จำแนกผ่านเวกเตอร์ลาปลาซเชียน

まとめ
  • สร้างกราฟความคล้ายของข้อมูล แล้วใช้เวกเตอร์ลักษณะเฉพาะของ Laplacian ฝังข้อมูลลงในมิติที่ต่ำกว่าก่อนค่อยทำ k-means
  • เหมาะกับข้อมูลโครงสร้างไม่เชิงรัศมี เช่น วงแหวนหรือรูปร่างที่คดเคี้ยว ซึ่ง k-means จัดกลุ่มได้ยาก
  • พารามิเตอร์สำคัญ ได้แก่ วิธีคำนวณ affinity (rbf, nearest neighbors), ค่าพารามิเตอร์ของเคอร์เนล และวิธีจัดกลุ่มหลังฝัง (assign_labels)
  • ต้องคำนวณค่าเฉพาะตามจำนวนคลัสเตอร์ จึงใช้หน่วยความจำและเวลามากขึ้นเมื่อจำนวนจุดเยอะ

ภาพรวมเชิงสัญชาติญาณ #

สร้างกราฟที่โหนดคือจุดข้อมูล ส่วนคือน้ำหนักความคล้าย พื้นที่ที่เชื่อมแน่นมีแนวโน้มเป็นคลัสเตอร์ เวกเตอร์ลักษณะเฉพาะลำดับต่ำของ Laplacian จะเน้นทิศทางที่ตัดกราฟได้ “คุ้มค่า” เมื่อนำมาเป็นฟีเจอร์แล้วใช้ k-means จะได้ผลดีแม้รูปทรงซับซ้อน

สูตรสำคัญ #

ให้เมทริกซ์ความคล้าย \(W\), เมทริกซ์ดีกรี \(D\) และ Laplacian \(L = D - W\) แบบปกติย่อส่วน

$$ L_\mathrm{sym} = D^{-1/2} L D^{-1/2} = I - D^{-1/2} W D^{-1/2}. $$

เลือก \(k\) (จำนวนคลัสเตอร์) แล้วนำเวกเตอร์ลักษณะเฉพาะลำดับต่ำสุด \(k\) ตัวมาสร้างเมทริกซ์ \(U\) จากนั้น normalize แถวและใช้ k-means เพื่อให้ผลลัพธ์ใกล้กับการแก้ปัญหา normalized cut

ทดลองด้วย Python #

ตัวอย่างกับข้อมูลรูปลูกศรสองวง (make_circles)

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.datasets import make_circles
from sklearn.cluster import SpectralClustering

X, _ = make_circles(n_samples=500, factor=0.4, noise=0.05, random_state=0)

model = SpectralClustering(
    n_clusters=2,
    affinity="rbf",
    gamma=50,
    assign_labels="kmeans",
    random_state=0,
)
labels = model.fit_predict(X)

plt.figure(figsize=(6, 5))
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap="coolwarm", s=20)
plt.title("Spectral clustering บนข้อมูลวงกลมซ้อน")
plt.tight_layout()
plt.show()

Spectral clustering แยกข้อมูลวงกลมซ้อนได้

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

  • Shi, J., & Malik, J. (2000). Normalized Cuts and Image Segmentation. IEEE TPAMI.
  • Ng, A. Y., Jordan, M. I., & Weiss, Y. (2002). On Spectral Clustering. NeurIPS.
  • scikit-learn developers. (2024). Spectral clustering. https://scikit-learn.org/stable/modules/clustering.html#spectral-clustering