まとめ
- HDBSCAN (Hierarchical DBSCAN) สร้างโครงสร้างแบบลำดับชั้นของ DBSCAN เพื่อรองรับความหนาแน่นที่ต่างกันในข้อมูลเดียวกัน
- ใช้พารามิเตอร์สองตัว
min_cluster_sizeและmin_samplesคุมเกณฑ์ความหนาแน่น และให้ป้าย -1 กับจุดที่เป็น noise - คำนวณ “ความเสถียร” (persistence) ของคลัสเตอร์ ทำให้เลือกใช้เฉพาะกลุ่มที่น่าเชื่อถือได้
- ทำงานร่วมกับการลดมิติเช่น UMAP ได้ดี ทำให้ประยุกต์กับข้อมูลมิติสูงได้ยืดหยุ่น
ภาพรวมเชิงสัญชาติญาณ #
DBSCAN ต้องกำหนด eps เพียงค่าเดียว ซึ่งอาจไม่เหมาะกับทุกคลัสเตอร์ HDBSCAN ปรับ eps ไปเรื่อยๆ เพื่อดูว่าพื้นที่ไหนยังคงหนาแน่น และสร้างต้นไม้ของคลัสเตอร์ก่อนเลือกสาขาที่เสถียรที่สุดเป็นผลลัพธ์สุดท้าย
สูตรสำคัญ #
เริ่มจากคำนวณ core distance ของจุด \(x\):
$$ d_\mathrm{core}(x) = \text{ระยะไปยังเพื่อนบ้านลำดับที่ } \texttt{min_samples}. $$
จากนั้นนิยาม mutual reachability distance:
$$ d_\mathrm{mreach}(x, y) = \max{d_\mathrm{core}(x), d_\mathrm{core}(y), \lVert x - y \rVert}. $$
สร้าง minimum spanning tree บนกราฟระยะนี้ เมื่อเพิ่ม threshold จะเกิดการแตกกิ่งของคลัสเตอร์ แต่ละคลัสเตอร์มี “เวลาที่อยู่” ในลำดับชั้น ซึ่งใช้เป็นคะแนนเสถียรภาพ
ทดลองด้วย Python #
ตัวอย่างใช้ไลบรารี hdbscan บนข้อมูลรูปร่างพระจันทร์
import numpy as np
import matplotlib.pyplot as plt
import hdbscan
from sklearn.datasets import make_moons
X, _ = make_moons(n_samples=400, noise=0.08, random_state=42)
clusterer = hdbscan.HDBSCAN(
min_cluster_size=20,
min_samples=10,
cluster_selection_method="eom",
)
labels = clusterer.fit_predict(X)
plt.figure(figsize=(6, 5))
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap="tab10", s=20)
plt.title("การจัดกลุ่มด้วย HDBSCAN")
plt.show()
print("ความเสถียรของคลัสเตอร์:", clusterer.cluster_persistence_)
print("จำนวนจุด noise:", np.sum(labels == -1))
เอกสารอ้างอิง #
- Campello, R. J. G. B., Moulavi, D., Zimek, A., & Sander, J. (2013). Density-Based Clustering Based on Hierarchical Density Estimates. PAKDD.
- McInnes, L., Healy, J., & Astels, S. (2017). hdbscan: Hierarchical Density Based Clustering. Journal of Open Source Software.
- scikit-learn developers. (2024). Clustering. https://scikit-learn.org/stable/modules/clustering.html