まとめ
- HDBSCAN(Hierarchical DBSCAN)は DBSCAN を階層化し、密度の異なる領域を自動的にクラスタ化するアルゴリズム。
min_cluster_sizeとmin_samplesの 2 つで密度基準を制御し、ノイズ点(ラベル -1)を自然に切り離す。- クラスタごとの「安定度」(persistence)を計算でき、信頼度の高いクラスタのみ採用する運用が可能。
- UMAP などの次元削減と組み合わせると、高次元データでも柔軟に利用できる。
直感 #
DBSCAN は 1 つの eps(半径)を用いて密度の高い領域を探しますが、データによっては適切な半径がクラスタごとに異なります。
HDBSCAN は eps を徐々に広げながら密度が高い領域を追跡し、クラスタの階層構造を構築します。その後、クラスタの安定度を評価し、もっとも安定した部分クラスタを最終的な出力とします。
具体的な数式 #
HDBSCAN は「距離を密度に変換する」ために、各点のコア距離 \(d_\mathrm{core}(x)\) を計算します。
$$ d_\mathrm{core}(x) = \text{距離}(x, \text{min_samples 番目に近い点}) $$
緩和距離(mutual reachability distance)は
$$ d_\mathrm{mreach}(x, y) = \max{d_\mathrm{core}(x), d_\mathrm{core}(y), \lVert x - y \rVert} $$
で定義され、この距離に基づいて最小全域木を構築します。枝を切る閾値を変化させながら得られるクラスタの「滞在時間」を安定度として評価し、信頼度の高いクラスタを残します。
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("ノイズ点数:", np.sum(labels == -1))
参考文献 #
- Campello, R. J. G. B., Moulavi, D., Zimek, A., & Sander, J. (2013). Density-Based Clustering Based on Hierarchical Density Estimates. Pacific-Asia Conference on Knowledge Discovery and Data Mining.
- 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