K-Means 假设每个簇大致是围绕质心的球,并且必须提前指定 K。当数据呈现月牙形、环形、长条形,或包含少量离群点时,质心会把一个连续的弯曲区域硬切开,也可能被离群点拉向错误方向。
密度聚类换一个问题:哪些点处在足够密集、彼此可达的区域? DBSCAN 不需要预先指定簇数,还能把低密度区域标记为噪声。
点击放大查看图:dbscan-density-intuition
eps、min_samples 与特征缩放的关系;设定两个参数:邻域半径 ε(eps)与最小样本数 min_samples。
点 p 的 ε 邻域是所有满足 的点集合。scikit-learn 会把点 p 自己也算进邻域数量,因此 min_samples=4 表示半径 ε 内包含自己在内至少 4 个样本。
若 ,p 是核心点,可以主动扩展簇。边界点本身邻域不够密,但落在某个核心点的 ε 邻域中,因此加入该簇。既不是核心点、也不在任何核心点邻域中的点就是噪声;在 scikit-learn 中标签为 -1。
点击样本查看 ε 邻域,调节参数观察核心点、边界点和噪声变化。
点击不同样本,先观察邻域数量,再调节 ε 和 min_samples。动画中的颜色只是当前参数下的判定,不是人工标签。
考虑 8 个一维点,令 ε=1.5,min_samples=3(包含点自己)。一维距离只需做绝对值计算:。例如 A 到 C 的距离是 ,刚好等于 ε,所以 C 仍属于 A 的邻域。
| 点 | 坐标 | ε 邻域内的点 | 数量 | 自身是否核心 |
|---|---|---|---|---|
| A | 1.0 | A、B、C | 3 | 是 |
| B | 1.8 | A、B、C、D | 4 | 是 |
| C | 2.5 | A、B、C、D | 4 | 是 |
| D | 3.2 | B、C、D | 3 | 是 |
| E | 5.0 | E、F | 2 | 否 |
| F | 5.8 | E、F、G | 3 | 是 |
| G | 6.6 | F、G | 2 | 否 |
| H | 10.0 | H | 1 | 否 |
先不要把“不是核心点”等同于“噪声”。非核心点只有在所有点检查完后,才可能确定为边界点或噪声。下面按 DBSCAN 的实际扫描顺序手算。
min_samples=3,所以 A 是核心点,创建簇 1。因此第一个簇完成:簇 1 包含 A、B、C、D。注意 A 不直接靠近 D(距离 2.2),但 A→B→D 是一条由核心点连接的路径,所以它们仍在同一簇。
最终得到:簇 2 包含 E、F、G,其中 F 是核心点,E、G 是边界点。
H 与最近的 G 的距离为 。它既不是核心点,也不落在任何核心点的邻域内,因此最终是噪声点。
最终标签可以写成:簇 1:A、B、C、D;簇 2:E、F、G;噪声:H。
这里的关键是“密度可达”:不要求簇内任意两点都直接相邻,只要求存在一条由核心点连接的路径。因此 DBSCAN 可以沿着弯曲的高密度带扩展,而 K-Means 做不到。
把点放回二维平面后,判断方法完全相同:以某点为圆心画半径 ε 的圆,圆内(包括圆周)样本数达到 min_samples,它就是核心点。
取 ε=1.1、min_samples=3,检查点 C=(2.6,2.0):
这个计算说明:DBSCAN 的结果不是由“肉眼看起来接近”决定,而是由距离度量、ε 和计数规则共同决定。调大 ε 可能让 C 变成核心点,也可能让原本分离的两个簇连接起来。
min_samples,先标记为噪声候选。-1。噪声候选并不一定最终是噪声:如果后来发现它在另一个核心点邻域内,它会被改为边界点。这是手算时容易漏掉的细节。
K-Means 会用一条近似直线切割月牙,而 DBSCAN 会沿两条月牙的密度结构找簇。make_moons 的真实标签只用于事后演示比较,DBSCAN 训练时没有使用它。
eps、min_samples 和距离min_samples 定义“足够密”值越小,稀疏区域越容易被认成簇,也更容易受噪声影响;值越大,需要更稳定、更密集的区域。可从特征维数 d 的 2–4 倍开始试验,但这只是起点。
eps固定 ,对每个样本计算到第 k 个近邻的距离并排序。曲线突然变陡的位置,通常是密集点与稀疏噪声的分界,可作为 eps 候选:
| 现象 | 可能原因 | 调整方向 |
|---|---|---|
| 几乎所有点都是噪声 | eps 太小或 min_samples 太大 | 增大 eps 或降低 min_samples |
| 几乎所有点合并为一簇 | eps 太大或 min_samples 太小 | 减小 eps 或提高 min_samples |
| 簇被切成很多碎片 | 局部密度不足 | 增大 eps,检查缩放 |
| 不同密度簇互相吞并 | 单一半径不适合 | 评估 HDBSCAN |
DBSCAN 的半径直接依赖距离单位。年龄(0–100)与年收入(0–1,000,000)若不缩放,同一个 ε 在两个方向代表完全不同的含义。应先使用 StandardScaler 或业务合理的归一化,再拟合 DBSCAN。
消费金额等长尾特征可先使用 log1p;缺失值必须先处理;异常值要先核验,不能无条件删除真实的高价值用户。地理坐标还要特别小心:经纬度不是平面米制坐标,小范围可投影到米制坐标,大范围应考虑 haversine 距离并把角度转为弧度。
层次聚类不先把数据压成一个固定 K,而是构造一棵从“每个样本一个簇”到“所有样本一个簇”的树。
| 现象 | 可能原因 | 改进方式 |
|---|---|---|
| 几乎所有点都是噪声 | eps 太小、min_samples 太大或特征未缩放 | 检查尺度,用 k-distance 图重新估计 eps |
| 几乎所有点合并为一簇 | eps 太大或 min_samples 太小 | 减小 eps,提高 min_samples,检查簇间距离 |
| 簇被切成很多碎片 | 局部密度不足或距离单位不合理 | 增大 eps,统一尺度,检查异常值 |
| 不同密度簇互相吞并 | DBSCAN 使用一个全局半径 | 评估 HDBSCAN 或分层建模 |
| 地理热点位置偏移 | 直接把经纬度当平面坐标 | 投影到米制坐标,或使用 haversine 距离 |
| 层次聚类结果对 linkage 很敏感 | linkage 改变了簇间距离定义 | 对比多种 linkage,并检查树状图与业务画像 |
eps。继续学习主成分分析与降维,把高维特征压缩为更易计算、可视化和解释的表示。