使用scikit-learn-contrib/hdbscan检测聚类中的分支结构
hdbscan 项目地址: https://gitcode.com/gh_mirrors/hd/hdbscan
引言
在数据探索分析中,HDBSCAN*算法因其出色的密度聚类能力而广受欢迎。然而,传统聚类方法只能识别离散的子群体,而无法捕捉到聚类内部的形态特征。本文将深入探讨如何利用scikit-learn-contrib/hdbscan项目中的分支检测功能,揭示数据中隐藏的Y型、L型等复杂分支结构。
分支检测的核心原理
1. 从密度聚类到形态分析
HDBSCAN*通过密度聚类可以识别出数据中的不同子群体(如图1所示)。但当数据呈现连续演化特征时(如生物进化轨迹、客户行为演变等),简单的离散聚类会丢失重要的结构信息。
# 基础聚类示例
clusterer = HDBSCAN(min_cluster_size=15).fit(data)
plot(clusterer.labels_)
2. 离心率与分支检测
分支检测的核心思想是将密度概念替换为离心率(eccentricity)——数据点到聚类中心的距离。通过分析离心率分布,可以识别出聚类中的分支结构:
- 高离心率区域:可能代表分支末端
- 离心率变化点:指示分支分叉位置
# 计算离心率示例
centroid = np.average(data[mask], weights=clusterer.probabilities_[mask], axis=0)
eccentricities[mask] = np.linalg.norm(data[mask] - centroid, axis=1)
实战:分支检测全流程
步骤1:启用分支检测数据收集
clusterer = HDBSCAN(
min_cluster_size=15,
branch_detection_data=True # 关键参数
).fit(data)
步骤2:配置分支检测器
branch_detector = BranchDetector(
min_cluster_size=15,
branch_detection_method="core", # 或"full"
label_sides_as_branches=False
).fit(clusterer)
步骤3:可视化分支结构
plot(branch_detector.labels_)
关键参数解析
| 参数 | 说明 | 推荐值 | |------|------|--------| | min_cluster_size
| 分支最小点数 | 10-25 | | branch_detection_method
| 连接性计算方法 | "core"(默认)或"full" | | cluster_selection_epsilon
| 抑制低离心率分支 | 根据数据调整 | | label_sides_as_branches
| 是否标记无分叉的L型分支 | False(默认) |
高级应用技巧
1. 分支层次分析
通过condensed_trees_
属性可以可视化分支的合并过程:
branch_detector.condensed_trees_[0].plot()
plt.ylabel("Eccentricity")
2. 新数据预测
labels, probs, _, _, branch_labels, _ = approximate_predict_branch(
branch_detector,
new_points
)
3. 自定义聚类分支检测
即使是非HDBSCAN聚类结果,只要满足MST连通性要求,也能进行分支检测:
custom_labels = modify_labels(clusterer.labels_)
branch_detector.fit(clusterer, custom_labels)
常见问题解决方案
- 分支断裂问题:检查
min_cluster_size
是否过小导致噪声干扰 - 过度细分:尝试增大
cluster_selection_persistence
- 计算效率:对于大数据集,优先使用
branch_detection_method="core"
结语
通过scikit-learn-contrib/hdbscan的分支检测功能,我们可以超越传统聚类的局限,发现数据中蕴含的演化轨迹和形态特征。这种分析方法特别适用于:
- 单细胞RNA测序数据
- 客户行为路径分析
- 时间序列模式识别
掌握分支检测技术,将为你的数据探索工作打开新的维度。建议读者在实践中结合领域知识,调整参数以获得最具解释性的结果。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考