密度聚类(DBSCAN)
这个方法是做什么的
密度聚类不需要你预先指定簇数。它把“eps 邻域内至少有 min_samples 个点”的稠密区域连成一个簇,连不上任何簇的点判为噪声,在报告里单列成“异常样本”。这带来两个 K-Means 没有的能力:簇的个数由数据的密度结构决定,而且允许一部分样本不属于任何簇。代价是有两个参数要你自己拿主意——领域半径 eps(0.01~10)与领域内最小样本数 min_samples(2~100)——结果对它们极其敏感。界面上还有第三个控件“生成类别变量”,它默认是开着的,会往你的数据集里回写一列,下面单说。定量特征的 Z-score 标准化由模块自动完成。
报告的分工是这样的:第一张卡给出 k-距离曲线的自动拐点,作为 eps 的数据驱动参考,并逐条做参数适配诊断;第二张卡给各簇的规模、Wilson 95% 置信区间与簇内平均到质心距离,异常样本单占一行;第三张卡给聚类散点图(变量数大于 2 时经 t-SNE 降维)与 k-距离曲线;第四张卡给剔除噪声点后的轮廓系数、Calinski-Harabasz 与 Davies-Bouldin 指数、噪声点占比,以及把 eps 上下扰动 ±10%/±20% 各真跑一次得到的调整兰德指数(ARI)稳定性表;第五张卡给论文表述与逐行样本的类别标注。
需要准备什么数据
- 放入聚类分析变量(可选):至少 1 个,定量变量(数值)或定类变量(分组/标签)
数据要求
- 数据表至少 20 行。
- 单列缺失率不超过 20%。
- 不接受取值全都一样的列(零方差列没有可分析的变异)。
以上条目由系统从该方法的校验规则直接生成,与上传数据时的实际拦截规则一致。
什么时候用它
- 目标本来就是把离群的少数样本挑出来(异常交易、异常门店、异常设备读数),而不是硬塞进某个群
- 事先不知道该分几类,也不愿意用一个人为定的 k 去框数据
- 簇的形状可能不规则(细长带状、环形),不适合用“到中心的距离”划界
- 空间点位、轨迹点这类密度天然不均匀的数据
数据要求:有效行数不少于 20、缺失比例不超过 20%、不得含常数列;样本量应显著大于 min_samples,建议至少 5 倍,否则密度估计本身不稳定。拖拽区也接受定类变量,但它们只能被整数编码后参与欧氏距离,等于被强加了顺序与等距关系。
什么时候不要用它
- 各簇的密度差别很大:eps 是全局的,一个值要同时判定所有区域是否“稠密”,结果往往是密的那几簇被并成一团、疏的那一簇整体变成噪声。若各簇大致等大、形状接近球形,用「聚类分析(K-Means)」;想让簇数由统计准则自动定,用「二阶聚类」的“自动选择聚类个数”。
- 变量里有本无顺序的定类变量(所在城市、渠道来源):整数编码会凭空造出顺序,划分随编码而变。改用「二阶聚类」,它对定类变量走独热编码。
- 你需要一个固定档数、可交付执行的分层规则:DBSCAN 的簇数由参数决定,示例里 eps 从 1.0 调到 1.1 簇数就从 3 变成 4。要锁定档数用「聚类分析(K-Means)」;按业务规则分层用「RFM客户价值分层」。
- 你只是想处理极端值,不想分群:用「缩尾处理(Winsorize)」把极端值压回指定分位点;只是要先看清极端值在哪,用「描述性统计」看各变量的最值与分布。
- 你要分组的是变量而不是样本:本模块聚的是数据行。变量分组用「分层聚类」,要连续载荷用「因子分析(探索性)」。
- 参与聚类的变量有十几二十个:高维空间里所有点的两两距离趋于接近,“密度”这个概念本身开始失效,eps 找不到有效区间。可行的减法是用「特征筛选」或「Pearson相关性分析」把冗余与低信息量的列指认出来,再只把留下的几个拖进来重跑——「主成分分析(PCA)」在这里帮不上忙,它的成分得分写不回数据集,拿不到成分列当输入。
容易误读的地方
- “发现了 3 个簇”是参数的产物,不是数据的固有属性。 示例中 eps 取 1.0,而第一张卡自动定位的 k-距离曲线拐点是 0.2445,比值 4.09,模块打出“[注意] 偏离经验拐点较多”——然后照跑不误,不会替你改。第四张卡的扰动表说得更直接:eps × 1.1 就变成 4 个簇、噪声点从 12 个降到 8 个。所以报告 DBSCAN 结果必须把 eps 与 min_samples 一并写出,脱离参数谈“簇数等于 3”没有意义。
- 这里的轮廓系数不能拿去和 K-Means 的比。 示例这边是 0.8638,K-Means 那边是 0.4042,看着好一倍——但表注写明轮廓系数、CH 与 DB 全部是在剔除噪声点之后的样本上算的,而被剔掉的恰恰是最难归类的那 12 个点。同一份数据只要噪声点多剔一些,指标就会更好看。跨方法比较必须在同一批样本、同一口径下做,本模块不提供这种比较。
- 噪声点占比不是越低越好。 第四张卡的解读列原话是:“占比过高说明 eps 偏小;占比为 0 也未必更好,可能是 eps 过大把离群点也吸收了。”一路调大 eps 直到异常样本归零,等于把 DBSCAN 最有价值的那部分输出手动关掉。异常样本是正常输出而非错误,很多场景下它正是你要找的对象。
- 散点图上的距离和簇的大小都不能量化解读。 变量数大于 2 时这张图由 t-SNE 降维绘制(K-Means 那边用的是 PCA,两张图不可对照)。t-SNE 只保留局部邻域关系:图上两个簇离得多远、某个簇看起来多大,都不对应原始空间里的真实距离与体积。判断划分好坏请看第四张卡的指标,不要看图形的观感。
- “生成类别变量”这个开关默认开着,它会动你的数据集。 三个控件里第三个是“生成类别变量”,DBSCAN 把默认值设成了开启,而「聚类分析(K-Means)」与「二阶聚类」的同名开关默认都是关闭——同一族里只有它会主动写回。跑一次,数据面板就会多出一列“DBSCAN类别”,各簇记 1、2、3 与报告里的簇号对应,噪声点记 0;注意这与第五张卡样本标注表的写法不同,那里噪声点直接写成“异常样本”。调参阶段反复试跑时留意别把某一轮的中间结果当成最终标签用下去。
- 不要用“簇中心”去概括 DBSCAN 的簇。 第五张卡的解释边界写明:这里的簇是“密度可达”的连通区域,不要求凸形也不要求等大小。第二张卡那列“簇内平均到质心距离”只是紧凑度读数——一个带状或环形的簇,它的质心可能根本不落在簇内。给簇做画像应当回到样本标注表,按类别分别看各变量的分布,而不是报一个中心点了事。
报告里有什么
- 输出结果一:数据概览与前提检验
- 输出结果二:聚类汇总
- 输出结果三:聚类散点图与 k-距离曲线
- 输出结果四:聚类质量指标与稳定性检验
- 输出结果五:结论、学术表述与聚类标注
由于变量数大于2,上图是通过t-SNE降维技术将数据映射到二维空间后绘制的散点图。 第二张图为 k-距离曲线:把每个点到第 min_samples 近邻的距离升序排列,曲线「急剧抬升」处即为 eps 的经验取值。