DBSCAN能处理非球形簇因其基于密度连通性而非形状假设;通过eps和min_samples参数识别核心点与密度可达样本,适用于月牙形、环状等结构,但对密度差异大的数据敏感。

DBSCAN为什么能处理非球形簇
因为DBSCAN不假设簇的形状,它靠局部密度连通性定义簇——只要样本在彼此eps距离内能通过“密度可达”链路连起来,就属于同一簇。球形K-Means依赖均值和欧氏距离,天然偏向凸形;DBSCAN只认两个参数:eps(邻域半径)和min_samples(核心点最小邻居数),对月牙形、螺旋、带噪声的环状结构都有效。
但要注意:密度差异大的数据容易出问题——比如一个簇很紧密、另一个很稀疏,单组eps/min_samples很难兼顾。
调参时eps怎么选才不瞎试
盲目网格搜索eps效率低,推荐用“k-距离图”(k-dist graph)。对每个点,算它到第min_samples近邻的距离,把所有距离从小到大排序画图,拐点处的横坐标就是较优eps。
-
min_samples一般设为特征维数的2倍(如2D数据常用4或5),噪声多可适当提高 - 用
sklearn.neighbors.NearestNeighbors获取k距离,别手写循环——高维下暴力计算太慢 - 如果数据量大(>10万),先用
algorithm='kd_tree'或'ball_tree'加速邻域查询,brute会卡死
核心点识别失败?检查这三件事
DBSCAN的core_sample_indices_返回的是训练时输入X的索引,不是原始DataFrame的index。常见错误是直接拿它去切原始数据却忘了对齐。
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
- 确认传给
fit()的X是纯数值数组(np.ndarray或pd.DataFrame.values),含NaN或inf会导致核心点判定异常 - 标准化/归一化必须做:不同量纲会让某维度主导距离计算,导致本该是核心点的样本因某一维偏差大而被忽略
- 若用
sample_weight参数,注意它只影响核心点判定中的计数逻辑(加权邻居数 ≥min_samples),不改变距离本身
DBSCAN输出标签全是-1?不是算法失效,是参数太严了
labels_全为-1意味着没找到任何一个核心点,所有点都被判为噪声。这不是bug,是eps太小或min_samples太大。
快速验证方法:降低min_samples到2,同时把eps放大1.5倍再跑一次,看是否有非-1标签出现。有,则说明原参数组合过于保守;没有,则要检查数据是否真的极度稀疏或存在严重量纲问题。
另外,DBSCAN不支持“预测新样本”,想对测试集打标签得用sklearn.cluster.DBSCAN.fit_predict()重训,或者改用HDBSCAN——它自带approximate_predict方法,更适合增量场景。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










