DBSCAN 模拟器 返回
机器学习模拟器

DBSCAN 模拟器 — 密度聚类

对 2D 散点数据实时应用 DBSCAN。改变 ε 和 MinPts 参数,学习核心点、边界点、噪声判定和任意形状聚类检测。

参数设置
ε(邻域半径)
MinPts
强调聚类 ID
数据种子

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,几乎所有点都变成噪声了。
🎓
就是这个意思。ε 控制"多近距离的点算是邻居",MinPts 控制"邻居要有多少个才能算是密集中心(核心点)"。ε 越小,能被认可为"密集"的点就越少,孤立的点全部沦为噪声。反过来,如果你把 ε 调到 2.0,三个聚类会黏在一起变成一个巨大聚类。试试看。
🙋
真的!全部都变成 C1 了。那实际工作中怎么选 ε 呢?
🎓
标准方法叫"k 距离图"。对每个点,找到离它第 MinPts 近的邻居,记录距离。把所有点的这个距离从小到大排列,画成折线。折线突然上升的"肘部"位置对应的距离通常就是合适的 ε。另一个办法是从业务角度定义,比如"某商业圈半径 500 米内有 10 个以上消费者就认为是商业密集区",这样 ε 就直接对应现实意义了。
🙋
那填充圆点和只有轮廓的圆点有什么区别?
🎓
填充的是核心点,只有轮廓的是边界点。核心点的周围"人烟稠密",邻近地区有很多伙伴。边界点自己周围很空旷,邻居不足,但恰好站在某个核心点的邻域里,所以被"拉入"那个聚类。灰色的 × 是噪声,谁都不要的点。这样就能清晰地看出数据的"骨骼"、"边界"和"异常",这是 DBSCAN 的独特优势。

常见问题

如果聚类数已知且数据呈球形分布,k-means 速度快且容易使用。如果聚类数未知、形状复杂、需要自动排除异常点,用 DBSCAN 更好。但 DBSCAN 对密度差异大的数据表现较差,这时可考虑切换到 HDBSCAN 或 OPTICS。
MinPts 一般按经验法则设为约 2d(二维数据通常为 4~10)。ε 的标准做法是通过"k 距离图"(第 MinPts 个最近邻距离排序)找肘点。业务角度也可行,比如"传感器误差范围"或"地理距离上的物理意义"来直接定义 ε。
原理上可以,但会遇到"维度诅咒"——高维空间里距离变得均匀无差别,ε 的有效范围极其狭窄。实际做法是先用 PCA、UMAP 或 t-SNE 压缩到 2~10 维,再跑 DBSCAN。计算复杂度上,朴素实现是 O(n²),即使用 kd-tree 加速也在高维时效果有限。
OPTICS 不固定 ε,用"可达距离"对全数据画分层,后来可灵活切割层级。HDBSCAN 进一步去掉 ε,从密度分层中自动提取稳定聚类。当聚类密度差异大、或 ε 难以确定时,HDBSCAN 已成为业界标准方案。

现实应用案例

地理空间分析:从 GPS 轨迹提取"常驻地",从店铺位置发现商业圈,从犯罪点位检测热点区域——DBSCAN 在这些领域被广泛使用。因为距离有明确的地理物理意义,ε 很容易设定,而且能自动排除低密度区域。

异常检测:将传感器数据或日志压缩到低维,跑 DBSCAN,把"不属于任何聚类"的点(噪声)作为异常候选。这个方法简单有力,标注数据少的初期监控中特别有用。

图像分割和点云处理:LiDAR 或深度摄像头得到的三维点云,用 DBSCAN 按密度分离地面、墙壁、物体。点数和形状都不确定的场景很适合密度聚类。

客户分群和异常分析:营销分析中,从购买行为用密度自动发现相似顾客群,外值客户单独审视。不用猜聚类数,能自发现未知的客户层,特别适合探索性分析。

常见误区和注意事项

最常见的误解是"ε 越大聚类越好"。实际上 ε 加大会让本来不相关的聚类通过密度桥连通,融合成一个巨聚类。在模拟器上试试把 ε 改到 1.5 或 2.0,会看到聚类 A、B、C 黏在一起,检测聚类数从 3 降到 1 或 2。反之 ε 太小全是噪声。真正的"合适 ε"卡在"聚类内距离 < ε < 聚类间距离"的甜蜜点,必须看 k 距离图的肘点。

另一个常见误会是"DBSCAN 能完美清除异常值"。DBSCAN 判噪声只看密度,对于密集的虚假数据或系统性传感器偏差,它会照样当成正常的核心点吞进去。噪声判定完全基于密度,不能替代数据质量检查或预处理。

最后要特别注意"特征尺度问题"。DBSCAN 在所有轴用同一个 ε,如果特征量纲不同(如年龄[岁]和年收[元]),大尺度的轴会主导距离计算,小尺度的轴信息被淹没。实务中必须先做标准化(StandardScaler、MinMaxScaler 等),再送进 DBSCAN。这是最常见的"结果莫名奇妙但找不到原因"的坑。

使用指南

  1. 用滑块设置 ε 参数(邻域半径)。例如 ε=0.5 时,系统搜索每个点周围距离不超过 0.5 单位的邻近点
  2. 用滑块设置 MinPts 参数。当 MinPts=5 时,某点的邻域内必须包含至少 5 个点才会被判定为核心点
  3. 模拟器自动对每个点分类为核心点、边界点或噪声,并实时显示检测聚类数、噪声点数、核心点数、边界点数

具体计算例子

在一个包含 200 个点的二维顾客数据集上,设置 ε=0.8、MinPts=4。这意味着当某个点的半径 0.8 范围内聚集了 4 个或以上的点时,该点被认定为核心点。比如坐标 (2.1, 3.5) 处的点,如果其邻域内有 5 个点,就成为核心点并被归入该密度区域的聚类。如果我们把 ε 缩小到 0.3,同一数据集的检测聚类数会从 3 增加到 8,噪声点数也从 12 增加到 24

实际应用注意事项