参数设置
70 个点(3 个聚类 + 均匀噪声)由固定种子的 LCG 确定性生成。突出 ID 为 0 时显示全部聚类。
2D 散点图与聚类判定
实心=核心点 / 仅轮廓=边界点 / 灰色×=噪声 / 颜色=聚类 ID(图例右上角)
理论与主要公式
DBSCAN 使用距离 d(这里为欧氏距离)与两个参数 ε、MinPts 定义密度,并将密度的连通分量取为聚类。
点 p 的 ε 邻域:
$$N_\varepsilon(p) = \{\, q \in D \mid d(p,q) \le \varepsilon \,\}$$
核心点判定(ε 内至少有 MinPts 个邻居):
$$|N_\varepsilon(p)| \ge \mathrm{MinPts}$$
从核心点 p 到 q 的直接密度可达:
$$q \in N_\varepsilon(p) \;\wedge\; p \text{ 为核心点}$$
聚类即互相位于 ε 内的核心点所构成图的连通分量;位于某核心点 ε 邻域内的非核心点作为边界点加入同一聚类。不属于任何核心点邻域的点为噪声(聚类 ID = −1)。
什么是 DBSCAN 模拟器
🙋
DBSCAN 跟 k-means 到底有什么不同呀?都说是「做聚类」,可我不太理解差在哪里。
🎓
简单说,k-means 一开始就要你定「分成几类」,再把每个点塞给最近的质心,所以月牙、环形这种形状分不干净。DBSCAN 换了思路:「密集的地方就是聚类,稀疏的地方就是噪声」。聚类数不用定,形状也任意。看上面模拟器里的 C 聚类(弧形)—— 它就是以弯曲的形状被识别为一个聚类。
🙋
原来如此!我移动「ε」和「MinPts」滑块,结果变得天翻地覆。把 ε 调到 0.3,几乎全成噪声了。
🎓
这就是 DBSCAN 的核心。ε 是「多近才算邻居」,MinPts 是「邻居要多少个,才算密集的中心(核心点)」。ε 变小,能被算作密集的点就少,孤立点都变噪声。把 ε 拉到 2.0,三个聚类会通过密度桥连成一个大聚类。试试看。
🙋
真的!全部变成 C1 了。那实际中怎么定 ε 呢?
🎓
经典做法是「k 距离图」:对每个点算到它第 MinPts 个最近邻的距离,把所有距离升序排好画折线。曲线急剧向上拐的「拐点」就给出比较好的 ε。比如顾客位置数据,也可以从业务含义出发——「半径 200 米里有 5 人就是商圈中心」,直接按物理量给 ε。
🎓
实心是核心点,空心是边界点。核心点周围有很多伙伴;边界点自己伙伴不够,但因为旁边有核心点而被吸进聚类。噪声用灰色 × 表示。能在视觉上把数据的「骨架」「边缘」「离群值」分开,正是 DBSCAN 的强项。
常见问题
若事先知道聚类数、数据近似球状,k-means 快而省事。聚类数未知、形状复杂、需要自动剔除离群值时,DBSCAN 更合适。但 DBSCAN 对各聚类密度差异较大的数据较弱,此时可考虑切换到 HDBSCAN 或 OPTICS。
MinPts 可从维数 d 的 2 倍开始(2D 取 4~10),对噪声多的数据再调大一些。ε 通常从第 MinPts−1 个最近邻距离排序后的「k 距离图」拐点读取。也可从业务含义(商圈半径、传感器误差等)以物理量给出,效果同样不错。
原则上可以,但「维数诅咒」会让距离趋于一致,ε 的有效范围急剧缩窄。实际中通常先用 PCA、UMAP 或 t-SNE 压缩到 2~10 维再做 DBSCAN。朴素实现的复杂度是 O(n²),kd-tree 在低维有效,但维数变高效果就差。
OPTICS 不固定 ε,而对全数据绘制可达距离曲线,事后切片得到聚类。HDBSCAN 更进一步去掉 ε,从密度的层次结构中自动抽取稳定聚类。当聚类密度差异较大、或 ε 难以确定时,HDBSCAN 已逐渐成为事实标准。
实际应用
地理空间数据分析:从 GPS 轨迹抽取「停留点」、从店铺位置发现商圈、从案件位置检测犯罪热点等,DBSCAN 应用广泛。ε 可以从物理距离(米)自然确定,低密度区域自动作为噪声剔除,这是它的一大优势。
异常检测:把传感器数据或日志压缩到低维后施加 DBSCAN,将「不属于任何聚类的点(噪声)」标记为异常候选,是简单而强大的管道。在标注数据稀少的初期监控阶段尤为有用。
图像分割与点云处理:DBSCAN 常作为预处理,用于把 LiDAR 或深度相机的点云按密度分离为地面、墙面、物体。聚类数未知、形状多样的条件正好契合。
顾客分群与离群分析:市场分析中,DBSCAN 可从密度自动抽取行为相似的顾客群,把离群顾客单独审视。无需事先假定聚类数,适合用于发现未知细分群体的探索性分析。
常见误解与注意事项
最常见的误解是认为「ε 越大聚类越整齐」。增大 ε 会让原本独立的聚类通过密度桥相连,塌成一个巨大聚类。把模拟器里的 ε 调到 1.5 或 2.0:聚类 A、B、C 会连在一起,聚类数掉到 1~2。太小则全部变噪声。「合适的 ε」位于「聚类内距离 < ε < 聚类间距离」的甜蜜区,请务必通过 k 距离图的拐点确认。
其次常见的错误是认为「DBSCAN 能完美剔除离群值」。DBSCAN 判为噪声的只是「位于低密度区域的点」。密集成团的脏数据或传感器的系统误差会被照单收为核心点。噪声判定本质上基于密度,不能替代数据质量检查或预处理。
最后,千万别忘了距离尺度的预处理。DBSCAN 对所有轴使用同一个 ε(同一单位),若把尺度悬殊的特征(如年龄[岁] 与年收入[元])直接输入,距离会被大尺度轴主导,其他轴的信息被淹没。实际中务必先做标准化(StandardScaler、MinMaxScaler 等)。忽视这一点,就是经典的「结果怪怪的、说不清原因」。