HDBSCAN

Basic

HDBSCAN | เพิ่มโครงสร้างเชิงลำดับชั้นให้ความหนาแน่น

Created: Last updated: Read time: 1 min
まとめ
  • 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