まとめ
- การจัดกลุ่มแบบลำดับชั้นค่อยๆ รวม (หรือแยก) กลุ่ม แล้วใช้เดนโดรแกรมช่วยเลือกจำนวนคลัสเตอร์ได้ยืดหยุ่น
- เวอร์ชัน agglomerative เริ่มจากหนึ่งคลัสเตอร์ต่อจุด แล้วรวมคู่ที่ใกล้ที่สุดตามเกณฑ์ลิงเกจ
- เลือกลิงเกจ (ward, complete, average, single ฯลฯ) และระยะ (Euclidean, cosine ฯลฯ) เพื่อปรับนิยามความใกล้
- ใช้
AgglomerativeClusteringหรือscipy.cluster.hierarchyเพื่อสร้างทั้งโครงสร้างต้นไม้และป้ายคลัสเตอร์ได้อย่างง่ายดาย
ภาพรวมเชิงสัญชาติญาณ #
วิธีนี้สรุป คลาสเตอร์เป็น “ต้นไม้” ของความคล้าย: เริ่มจากจุดเดี่ยวแล้วจับคู่ที่ใกล้ที่สุด การดูเดนโดรแกรมและตัดที่ระยะที่เหมาะช่วยให้เลือกจำนวนคลัสเตอร์ด้วยสายตาได้โดยไม่กำหนดล่วงหน้า
สูตรสำคัญ #
ระยะระหว่างคลัสเตอร์ขึ้นกับลิงเกจ:
- Ward: เพิ่มขึ้นของผลรวมกำลังสองภายในคลัสเตอร์
- Complete: ระยะที่ไกลที่สุดระหว่างสองคลัสเตอร์
- Average: ระยะเฉลี่ยของทุกคู่จุด
- Single: ระยะที่ใกล้ที่สุดระหว่างคลัสเตอร์
ตัวอย่าง Ward:
$$ \Delta = \frac{|C_i||C_j|}{|C_i| + |C_j|} \lVert \boldsymbol{\mu}_i - \boldsymbol{\mu}_j \rVert^2 $$
ใช้ \(\Delta\) เป็นเกณฑ์เลือกรวมคลัสเตอร์
ทดลองด้วย Python #
รัน linkage เพื่อวาดเดนโดรแกรม แล้วใช้ AgglomerativeClustering เพื่อรับผลแบ่งกลุ่ม
import numpy as np
from sklearn.datasets import make_blobs
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
X, _ = make_blobs(n_samples=50, centers=3, cluster_std=0.7, random_state=42)
Z = linkage(X, method="ward")
plt.figure(figsize=(8, 4))
dendrogram(Z, truncate_mode="level", p=5)
plt.title("Hierarchical clustering (Ward)")
plt.xlabel("sample index")
plt.ylabel("distance")
plt.show()
from sklearn.cluster import AgglomerativeClustering
clustering = AgglomerativeClustering(
n_clusters=3,
linkage="average",
affinity="euclidean",
)
labels = clustering.fit_predict(X)
ถ้าใช้ distance_threshold ต้องไม่กำหนด n_clusters พร้อมกัน
เอกสารอ้างอิง #
- Ward, J. H. (1963). Hierarchical Grouping to Optimize an Objective Function. Journal of the American Statistical Association.
- Müllner, D. (2011). Modern Hierarchical, Agglomerative Clustering Algorithms. arXiv:1109.2378.
- scikit-learn developers. (2024). Hierarchical clustering. https://scikit-learn.org/stable/modules/clustering.html#hierarchical-clustering