DBSCAN 的数学定义:这些概念到底在说什么?
好,咱们开始啃 DBSCAN 的核心定义。说实话,很多教材一上来就扔给你一堆术语——ε邻域、MinPts、密度直达、密度可达、密度相连……新手看了直接懵圈。
别怕。我们先搞清楚一件事:到底怎么判断两个点“挨得够近”?
ε 邻域:半径画个圈
想象你在二维平面上有一个点 p。以 p 为圆心,画一个半径为 ε 的圆。这个圆里所有其他点的集合,就叫 p 的 ε-邻域。数学定义很简单:
N_ε(p) = { q ∈ D | dist(p, q) ≤ ε }
这里的 dist(p, q) 可以是欧氏距离,也可以是其他距离度量。我在处理分子动力学轨迹时,经常用 RMSD(均方根偏差)作为距离函数——因为构象之间的“远近”不适合直接用空间坐标算。
你可能会问:ε 设多大?
这个真没标准答案。ε 太小,点都被判为噪声;ε 太大,所有点都成一坨。我个人习惯用 K-距离图来选 ε——把每个点到其第 k 近邻的距离排序,找拐点。嗯,后面会细讲。
MinPts:多少个邻居才算“密集”?
光有 ε 还不够。假设圈里只包含 1 个点,能说它密集吗?显然不能。所以 DBSCAN 引入第二个参数:MinPts——一个点至少要有多少个邻居(包括自己),才配被称为“核心点”。
核心点定义:如果 |N_ε(p)| ≥ MinPts,那么 p 是核心点。
边界点:在 ε 邻域内,但邻居数少于 MinPts。
噪声点:不是核心点,也不是任何核心点的边界点。
我曾经在一个蛋白质构象数据集上取 MinPts=2,结果聚类完全发散——因为 2 太低了,任何两个靠得近的点都能互相支撑,簇就一路连下去。后来调成 5 才正常。经验公式:MinPts ≥ 数据维度 + 1,一般取 3~5。
| 点类型 | 条件 | 说明 |
|---|---|---|
| 核心点 | |N_ε(p)| ≥ MinPts | 密度足够,能扩张簇 |
| 边界点 | |N_ε(p)| < MinPts,但属于某个核心点的 ε-邻域 | 在簇的边缘,不能继续扩张 |
| 噪声点 | 其余点 | 不属于任何簇 |
密度直达:直接撞上才算
如果点 q 在核心点 p 的 ε-邻域内,那么 q 由 p 密度直达。注意:反过来不一定成立——如果 q 不是核心点,则 p 未必能由 q 直达。
说白了就是:
p 是核心点,且 q ∈ N_ε(p) ⇒ q 由 p 密度直达
这个关系不对称。就像大领导认识你,但你不一定认识大领导。听着有点绕,但实际编码时很简单。
密度可达:传递一下
刚才的“直达”只能跳一步。如果存在一条点链:p₁→p₂→…→pₙ,每一步都是密度直达(且中间点 p₁ 到 pₙ₋₁ 都是核心点),那么从 p₁ 到 pₙ 就是密度可达的。
你会发现:密度可达是密度直达的传递闭包。也就是说,能通过一串核心点“传”过去。
密度相连:你俩有共同的朋友就行
如果存在一个点 o,使得 p 和 q 都由 o 密度可达,那么 p 和 q 密度相连。
这个关系就有意思了——它是对称的。只要你们两个有共同的“核心朋友”,就算你们隔得很远,也属于同一个簇。举个生活中的例子:
- 你和你的同事 A 由你们共同的大佬 B 密度直达(B 是核心点)
- A 和 C 又由 B 密度直达
- 你和 C 可能不认识,但你们密度相连——属于同一个社交圈
把它们串起来:DBSCAN 如何聚类?
理解完这些定义,DBSCAN 的聚类逻辑其实就一句话:把所有密度相连的点归为一类。具体流程如下:
- 遍历数据集,标记每个点的类型(核心/边界/噪声)
- 从一个未访问的核心点开始,通过密度可达关系扩张簇
- 把所有能找到的密度相连的点塞进同一个簇
- 重复,直到所有核心点都被处理
- 剩下的边界点归到最近的簇,噪声点丢弃
看到这里你可能已经发现了:ε 和 MinPts 是所有定义真正的起点。其他四个概念本质上是由这两个参数和数据集的距离结构推理出来的。在我做过的构象分析项目里,几乎每次调参都是先固定 MinPts(通常 3~5),再用 K-距离图确定 ε。