dbscan在scikit-learn中通过sklearn.cluster.dbscan调用,核心参数为eps(邻域半径)和min_samples(核心点最小邻域样本数),需结合k距离图与数据尺度合理选择,-1标签明确标识噪声点,地理坐标须用haversine距离或转投影坐标。

DBSCAN在scikit-learn中怎么调用
直接用 sklearn.cluster.DBSCAN,它专为带噪声的密度聚类设计,不需要预设簇数量,天然能识别离群点。核心参数只有两个必须调:eps(邻域半径)和 min_samples(核心点最小邻域样本数)。其他参数如 metric 默认是欧氏距离,空间坐标数据通常不用改。
eps和min_samples怎么选才不漏噪点也不碎簇
eps 太小会导致本该连通的点被切开,簇被过度分割;太大则把不同簇拉到一起,噪声点被吞进簇里。min_samples 一般取特征维数的2倍(比如二维空间用4),太小会让稀疏区域也成“核心”,把噪声误标为簇成员。
- 快速试
eps:对每个点计算到第min_samples近邻的距离,画这些距离的排序图(k-distance graph),拐点处的值就是合理eps - 用
NearestNeighbors手动算更稳:from sklearn.neighbors import NearestNeighbors nn = NearestNeighbors(n_neighbors=min_samples).fit(X) distances, _ = nn.kneighbors(X) distances = np.sort(distances[:, -1], axis=0) plt.plot(distances)
- 注意:如果数据做了标准化(比如
StandardScaler),eps就得按缩放后的尺度估,不能直接套原始坐标的物理意义
DBSCAN输出的labels里-1到底代表什么
labels_ 数组里的 -1 就是明确标记的噪声点,不是“未分类”,也不是“无法判断”——它是算法根据密度定义严格排除的结果。这些点不隶属任何簇,也不参与后续核心点扩展。
- 别把它当缺失值填均值或插值,那会破坏密度结构
- 做下游任务(比如热力图、轨迹分析)前,建议先分离:
noise_mask = labels == -1,单独看分布 - 如果
-1占比超过30%,优先检查eps是否过小,或数据是否混入了量纲差异极大的特征(比如经纬度混着海拔,没归一化)
地理坐标(经纬度)直接喂DBSCAN会出什么问题
会错得离谱。因为 DBSCAN 默认用欧氏距离,而经纬度是球面坐标,一度经度在赤道和极地代表的实际距离差十几倍。直接算出来的 eps 没有空间一致性。
- 要么转成平面坐标(如UTM),再跑DBSCAN
- 要么换距离度量:
metric='haversine',此时输入必须是弧度制的[lat, lon],且eps单位是弧度——更稳妥的是用sklearn.metrics.pairwise.haversine_distances预计算距离矩阵,再传给DBSCAN(metric='precomputed') - 注意:用
haversine时min_samples不变,但eps得换算,例如想设500米邻域,就用eps = 500 / 6371000(地球平均半径米)
eps 没结合数据尺度和业务意义去试,或者忘了地理坐标不能直用欧氏距离。这两个点踩中一个,结果就看起来“全是一堆噪声”。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











