KMeans和DBSCAN对非凸簇失效因前者假设球形簇、后者依赖全局eps;HDBSCAN通过可变密度尺度与EOM方法能自然分割月牙、螺旋等结构。

为什么KMeans和DBSCAN对非凸簇失效,而HDBSCAN能行
因为KMeans假设簇是球形且大小相近的,它用质心距离划分样本,遇到香蕉形、环形或嵌套结构就直接崩;DBSCAN虽基于密度,但全局eps参数强迫所有区域用同一邻域半径——稠密区会过分割,稀疏区则全连不起来。HDBSCAN把“密度”本身当作可变尺度:它先建一棵最小生成树(通过单链聚类),再在不同密度层级上提取稳定簇,并用cluster_selection_method="eom"(Excess of Mass)自动挑出那些在高密度谷底“停留时间长”的簇。这使得月牙、螺旋、同心圆等非凸结构能被自然切开。
安装与基础调用必须避开的三个默认陷阱
HDBSCAN的默认参数在多数真实数据上效果很差,尤其容易返回大量noise点或过度碎片化。关键要改:
-
min_cluster_size别用默认值5——它太小,导致把随机波动当簇;建议从20起步,按样本量1%~5%试(比如1万点设100) -
min_samples控制核心点密度敏感度,默认5太弱;设为min_cluster_size // 3左右更稳,避免边缘点被误剔 - 务必显式指定
cluster_selection_method="eom";若用"leaf"会返回细碎子簇,基本不可用
处理高维数据时降维不是可选项,而是前置条件
HDBSCAN在原始高维空间里计算距离会失效(“维度灾难”:所有点对距离趋近相等)。不能跳过降维直接跑:
- 先用
UMAP(n_components=2)或TSNE(n_components=2)降到2D/3D——UMAP更快更保局域结构,适合探索;TSNE对局部簇形还原更准但不可复现 - 如果必须保留原始维度语义(如基因表达),先做
StandardScaler,再用TruncatedSVD(n_components=50)降维,别用PCA——它倾向保留大方差方向,可能抹掉密度差异 - 降维后务必检查
hdbscan.HDBSCAN(...).fit(X_reduced).labels_中-1占比;若超30%,说明降维失真或min_cluster_size设太小
可视化簇结果时,噪声点和离群点得分开对待
直接画labels_ == -1为灰色会掩盖真正异常的样本。更合理的做法是:
立即学习“Python免费学习笔记(深入)”;
- 用
probabilities_数组过滤:概率低于0.05的才是可信噪声;高于该值但标签为-1的,其实是“边界模糊点”,应单独标出 - 画图时用
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap="tab20", s=1),再叠加一层plt.scatter(X[probs 强调强噪声 - 注意:若数据已归一化,还原坐标画图前别忘反向缩放,否则簇形状严重畸变
非凸簇发现真正的难点不在算法调用,而在理解密度如何随尺度坍缩——HDBSCAN输出的condensed_tree_结构里藏着每一层密度切割的痕迹,但大多数人直接扔掉它。想验证某个簇是否合理,得手动查它的get_clusters()生存区间,而不是只看最终标签。


















