HDBSCAN算法简介
HDBSCAN算法简介
HDBSCAN算法简介
HDBSCAN(Hierarchical Density-Based Spatial Clustering of Applications with Noise)是 DBSCAN 的层次化改进,能自动处理不同密度的聚类,无需像 DBSCAN 那样为不同密度区域反复调 eps。本文介绍其原理、与 DBSCAN 的区别、主要超参数及调优经验。
目录
1. HDBSCAN 简介
HDBSCAN = Hierarchical DBSCAN,在 DBSCAN 基础上引入层次结构,从密度层次树中选取「稳定」的聚类,从而:
- 自动处理不同密度:稠密区域和稀疏区域可同时得到合理聚类,无需为不同区域分别设 eps
- 更少参数依赖:不再需要 eps,主要调
min_cluster_size、min_samples - 支持软聚类:可为每个点给出聚类概率(
probabilities_),便于区分核心点与边界点 - 鲁棒性更好:对参数变化相对不敏感
核心思路:先构建基于密度的层次树(单 linkage 树),再通过「Excess of Mass」或「Leaf」策略从树中选出平坦聚类,每个聚类对应一个「稳定」的密度区间。
2. 与 DBSCAN 的区别
| 维度 | DBSCAN | HDBSCAN |
|---|---|---|
| 核心参数 | eps、min_samples | min_cluster_size、min_samples(无 eps) |
| 密度差异 | 单一 eps 难以兼顾不同密度 | 可自动处理多密度,更适合密度差异大的数据 |
| 参数敏感性 | eps 对结果影响大,需 K-距离图等辅助调参 | 对参数相对不敏感,min_cluster_size 更直观 |
| 聚类选择 | 直接按 eps 划分 | 从密度层次树中选稳定聚类(EOM 或 Leaf) |
| 输出 | 硬标签(-1 为噪声) | 硬标签 + 聚类概率 |
| 计算 | O(n²) 或 O(n log n) | 需构建层次树,计算量略大 |
| 典型场景 | 密度较均匀、已知 eps 区间 | 密度差异大、聚类规模不一、希望少调参 |
何时用 HDBSCAN:不同聚类密度差异大、希望减少 eps 调参、或需要聚类概率时,优先考虑 HDBSCAN。
3. 主要超参数
3.1 min_cluster_size(最重要)
- 含义:被视为聚类的最小簇大小;小于该规模的簇会被合并或标为噪声。
- 作用:增大 → 簇数减少,小簇被合并;减小 → 簇数增多,可能出现小簇或微簇。
- 经验(官方口径):没有统一“最佳范围”。应设为「你希望被视作一个簇的最小样本数」。例如若业务认为少于 20 个样本不算稳定簇,则可先从
min_cluster_size=20起试;再结合结果微调。
3.2 min_samples
- 含义:判定「核心点」时,ε 邻域内(或等价意义下)所需的最小点数,与 DBSCAN 的 MinPts(min_samples) 同一类概念;见 scikit-learn DBSCAN 文档 对
min_samples的说明。 - 默认:HDBSCAN 未指定时,
min_samples默认等于min_cluster_size(见 HDBSCAN 参数选择)。 - 作用:增大 → 更保守,更多点被标为噪声,簇更「密」;减小 → 更宽松,更多点被归入簇。
- 与 min_cluster_size 的区别:
min_cluster_size控制「最终保留的簇至少多大」;min_samples控制「多密才算核心区域」。二者可分开调:例如先定较大的min_cluster_size,再把min_samples设为较小值以恢复更多簇(官方文档用 digits 数据演示过这一现象)。
3.3 cluster_selection_epsilon
- 含义:距离阈值,距离小于该值的嵌套簇会被合并。
- 作用:可减少稠密区域的微簇,同时保留稀疏区域的小簇;设为 0 则不做此类合并。
- 经验:需要抑制微簇时,根据数据距离尺度设定(如 0.5、1.0);多数场景可先用 0.0,再按效果微调。
3.4 cluster_selection_method
- ‘eom’(默认):Excess of Mass,倾向选出较稳定的大簇,可能得到少量大簇 + 若干小簇。
- ‘leaf’:选叶节点,倾向更多、更小、更同质的簇;适合需要细粒度聚类的场景。
3.5 allow_single_cluster
- 默认:False,不返回「整个数据集为一个大簇」的结果。
- 设为 True:允许返回单一簇,适用于数据本身较均匀或基本为噪声时的探索。
3.6 metric
- 距离度量,如 ‘euclidean’、’manhattan’;高维或非欧数据可考虑 ‘cosine’ 等,需与数据特性匹配。
4. 调优经验与策略
4.1 调参思路
- 先定 min_cluster_size:按业务需求设定「最小簇规模」,如 5 或 10。
- 再调 min_samples:
- 噪声过多 → 适当增大 min_samples;
- 簇过少、点大量为噪声 → 适当减小 min_samples(可小于 min_cluster_size)。
- 微簇过多:尝试设置 cluster_selection_epsilon(按数据距离尺度)。
- 簇过粗/过细:尝试 cluster_selection_method(’eom’ vs ‘leaf’)。
4.2 经验取值参考
下表为思路参考;min_samples 不宜写死为「3~5」——可先从 ≥ D+1 或 约 2×D(见上文 DBSCAN 参数经验)起试,再按噪声与簇形态微调。
| 场景 | min_cluster_size | min_samples | cluster_selection_epsilon |
|---|---|---|---|
| 希望簇多、粒度细 | 偏小(业务可接受的最小簇) | 可从 max(3, D+1) 或 2×D 起试 | 0.0 |
| 均衡 | 按业务最小簇规模 | 等于 min_cluster_size,或单独设为 2×D 附近 | 0.0 |
| 希望簇少、更粗 | 偏大 | 可略小于 min_cluster_size(见 HDBSCAN 文档示例) | 按距离尺度设定 |
| 抑制微簇 | 按业务 | 与上类似,噪声大则略增大 | 按数据距离尺度 |
4.3 评估方式
- DBCV(Density-Based Clustering Validation):考虑密度和噪声,比轮廓系数(Silhouette)更适合密度聚类。
- 业务校验:结合领域知识检查簇是否合理、噪声是否可接受。
4.4 使用 memory 加速调参
多次调 min_cluster_size 时,可将层次树等中间结果缓存,避免重复计算:
1
2
3
4
5
6
7
8
9
10
11
from hdbscan import HDBSCAN
import joblib
# 使用 memory 缓存,加速多次调参
clusterer = HDBSCAN(
min_cluster_size=10,
min_samples=5,
cluster_selection_epsilon=0.0,
memory=joblib.Memory("cachedir", verbose=0)
)
labels = clusterer.fit_predict(X)
5. 小结
| 主题 | 要点 |
|---|---|
| HDBSCAN 优势 | 无 eps、可处理多密度、参数更直观、支持聚类概率 |
| 与 DBSCAN | 密度差异大时优先 HDBSCAN;密度较均匀且已知 eps 时可用 DBSCAN |
| 核心参数 | min_cluster_size(主)、min_samples、cluster_selection_epsilon、cluster_selection_method |
| 调优顺序 | 先 min_cluster_size → min_samples → cluster_selection_epsilon → cluster_selection_method |
| 评估 | 使用 DBCV 或业务校验,慎用 Silhouette |
本文由作者按照 CC BY 4.0 进行授权
