DBSCAN需导入sklearn.cluster.DBSCAN类并实例化后调用fit_predict(),不可直接函数式调用;参数eps控制邻域半径,min_samples设定核心点最小邻域数,输入X须为二维数组,且必须标准化以避免量纲干扰距离计算。

DBSCAN在sklearn.cluster中的导入和基本用法
直接用 DBSCAN 类,别去手动实现密度可达逻辑。它封装了核心算法,你只需要调参和喂数据。
常见错误是把 DBSCAN 当成函数调用,比如写成 DBSCAN(X) —— 它是类,必须实例化后调用 fit() 或 fit_predict():
from sklearn.cluster import DBSCAN clustering = DBSCAN(eps=0.5, min_samples=5) labels = clustering.fit_predict(X) # 返回每个样本的簇标签(-1 表示噪声)
-
eps控制邻域半径,太小会导致大量点被标为噪声;太大则所有点挤成一簇 -
min_samples是成为核心点所需的最小邻域点数(含自身),通常设为特征维数的2倍,但二维数据常用3–5 - 输入
X必须是二维数组:shape 为(n_samples, n_features),不能是 pandas Series 或一维 array
为什么标准化对DBSCAN至关重要
DBSCAN 完全依赖欧氏距离,而不同特征量纲差异会严重扭曲距离计算。比如身高(单位:米)和收入(单位:万元)混在一起,收入数值大,会主导整个距离度量。
不标准化的典型表现:聚类结果几乎只反映某个量级最大的特征,其他特征形同虚设。
- 必须用
StandardScaler或MinMaxScaler预处理,且要对训练集拟合、再对训练/测试集统一变换 - 别用
normalize=True(那是 L2 归一化,不是标准化) - 如果用了 PCA,标准化应在 PCA 之前做,否则主成分方向会偏移
如何判断 eps 和 min_samples 是否合理
没有银弹参数,但可以用 k-距离图(k-dist graph)辅助选 eps。k 取 min_samples - 1,画出每个点到其第 k 近邻的距离并排序,拐点处的 y 值就是候选 eps。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
实际中更常用试错法,配合可视化观察:
- 先固定
min_samples=5(二维常用),用NearestNeighbors计算每个点的第4近邻距离,取排序后第90%分位数作为eps初始值 - 若
labels中 -1 占比 >30%,大概率eps太小或min_samples太大 - 若所有点都分到同一簇(全为 0),说明
eps太大,或数据本身无明显簇结构 - 注意:
DBSCAN不保证所有簇大小均衡,小簇可能是真实结构,别强行合并
DBSCAN输出的label数组里-1到底代表什么
-1 表示该样本未被分配到任何簇,即被判定为“噪声点”(noise point),不是离群值检测意义上的异常值,而是局部密度不足以构成核心点、也无法被核心点密度可达的点。
- 它不等于缺失值或无效数据,只是算法认为它不属于任何稠密区域
- 如果业务上需要保留这些点,可单独提取:
noise_mask = labels == -1,然后分析其分布 - 不要直接丢弃再重跑 DBSCAN——这会改变密度估计基础,导致结果不可比
- 当数据存在明显层次结构时,
-1点可能恰好落在两个簇之间的过渡带,此时考虑 HDBSCAN 或调整eps
DBSCAN 的边界模糊性常被低估:它不划分“边界点”,只有核心点、边界点(属于某簇但非核心)、噪声点三类,而边界点和噪声点在 labels 数组中都体现为非负整数(前者有簇 ID,后者是 -1),这点容易混淆。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










