01 核心原理(大白话版)

想象你在俯视一张城市夜景照片,城市中心灯火通明,郊区稀稀落落,荒野里只有孤零零几盏灯。

DBSCAN 的逻辑是:灯光密集的地方是一个"区域",从任何一盏密集区的灯出发,沿着连通的密集区域扩张,直到边缘。孤立的灯是噪声,不属于任何簇。

它只需要两个参数:ε(邻域半径)MinPts(最少邻居数),不需要提前指定簇的数量。

三种点

核心点

ε 邻域内有至少 MinPts 个点(包括自身)。这是密集区域的"中心"。

边界点

不是核心点,但落在某个核心点的 ε 邻域内。位于簇的边缘。

噪声点

既不是核心点,也不在任何核心点的邻域内。直接丢弃,不归入任何簇。

步骤1:ε 邻域概念

以某个点为圆心,ε 为半径,范围内的所有点构成该点的"邻域":

步骤2:三种点的分类

根据邻域内点数判断每个点的类型(ε=1.2,MinPts=3):

步骤3:BFS 扩展形成簇

从每个未访问的核心点出发,BFS 扩展所有可达点,直到无法继续扩展为止:

步骤4:DBSCAN vs KMeans — 月牙形数据

KMeans 把月牙形硬切成两半,DBSCAN 沿密度边界自然分开:

ε 怎么选? 常用方法:对每个点求第 k 近邻距离(k = MinPts),画出排序曲线,"肘部"拐点对应合适的 ε。MinPts 通常取维度数的 2 倍,最小为 3。

02 代码

修改代码中的 DATASET(moons/rings/blobs)、EPSMIN_PTS 观察不同效果。

03 学术性讲解

算法复杂度

朴素实现 O(n²)(每对点都要计算距离);使用 KD-Tree 或 Ball-Tree 加速邻域查询后可达 O(n log n)。sklearn 默认使用 Ball-Tree。

密度可达与密度连通

  • 直接密度可达:q 在核心点 p 的 ε 邻域内
  • 密度可达:存在核心点链 p₁→p₂→…→pₙ,每步都是直接密度可达
  • 密度连通:两点都从同一个核心点密度可达——这是同一个簇的定义

DBSCAN vs KMeans

优先 DBSCAN

数据有任意形状的簇、存在噪声/离群点、不知道簇的数量时。典型场景:地理位置聚类、异常检测。

优先 KMeans

数据近似球形分布、已知大致簇数、追求速度时。KMeans 是 O(nkT),比 DBSCAN 快得多。

DBSCAN 的局限

对参数敏感,ε 和 MinPts 选不好结果差;不同密度的簇难以同时处理(可用 HDBSCAN 改进)。

高维时的挑战

维度诅咒导致高维空间中距离趋于相等,ε 邻域难以界定,DBSCAN 效果退化。通常先降维再聚类。