3.3 聚类任务


文档摘要

3.3 聚类任务 本节摘要:聚类是无监督学习的代表——数据没有标签,只能靠样本之间的相似度把"长得像"的归到一簇,用在客户细分、图像分割、异常检测这些场景。本节先跑一段 KMeans 的最小例子,再对比 KMeans、层次聚类、DBSCAN 三种算法对簇形状的不同假设,最后回答一个棘手的问题:没有真实标签,怎么判断聚类做得好不好。答案是借助轮廓系数和肘部法这类内部指标。 你能学到什么 阅读完本节,你应当能够: 用 KMeans 跑通一次无监督聚类,理解 fit 与 fitpredict 的差别 说清 KMeans、层次聚类、DBSCAN 各自假设的簇形状和优缺点 解释 eps 和 minsamples 两个参数如何决定 DBSCAN 的密度定义 用轮廓系数和肘部法在没有标签时评估并选择簇数

3.3 聚类任务

本节摘要:聚类是无监督学习的代表——数据没有标签,只能靠样本之间的相似度把"长得像"的归到一簇,用在客户细分、图像分割、异常检测这些场景。本节先跑一段 KMeans 的最小例子,再对比 KMeans、层次聚类、DBSCAN 三种算法对簇形状的不同假设,最后回答一个棘手的问题:没有真实标签,怎么判断聚类做得好不好。答案是借助轮廓系数和肘部法这类内部指标。

你能学到什么

阅读完本节,你应当能够:

  1. 用 KMeans 跑通一次无监督聚类,理解 fit 与 fit_predict 的差别
  2. 说清 KMeans、层次聚类、DBSCAN 各自假设的簇形状和优缺点
  3. 解释 eps 和 min_samples 两个参数如何决定 DBSCAN 的密度定义
  4. 用轮廓系数和肘部法在没有标签时评估并选择簇数
  5. 说明为什么聚类之前要先做标准化

一、先跑起来:KMeans 的三十秒例子

前面两节的数据都有标准答案,聚类没有。我们只知道样本像不像,不知道它们"本该"属于哪一类。下面用 make_blobs 生成三堆球形数据,再交给 KMeans。

from sklearn.datasets import make_blobs from sklearn.cluster import KMeans X, _ = make_blobs(n_samples=300, centers=3, random_state=42) model = KMeans(n_clusters=3, random_state=42) labels = model.fit_predict(X) print(model.cluster_centers_)

注意这里没有 y——聚类只喂 X。fit_predict 一步完成训练和标注,返回每个样本属于哪一簇,cluster_centers_ 给出每个簇的中心坐标。这是无监督和监督学习最根本的分界:前者没有目标变量。

二、三种算法,三种簇的形状假设

KMeans 假设簇是"大小相近的球"。它随机初始化 k 个中心,反复做两步:把每个点分给最近的中心,再重新算中心位置,直到稳定。优点是快、直观,缺点是必须事先定 k,而且对非球形簇、大小悬殊的簇、异常值都容易翻车。

层次聚类不假设球形。它自底向上,把最近的点或簇一步步合并,形成一棵树。好处是可以画树状图看簇的层次关系,也不必死板地预设球形;代价是计算复杂度高,样本一多就跑不动,对噪声也敏感。

DBSCAN 换了个思路,不看"离中心多远",看"密度"。它定义两个参数:eps 是邻域半径,min_samples 是成为核心点所需的最少邻居数。一个点如果周围 eps 范围内有至少 min_samples 个点,就是核心点;核心点密度相连的归成一簇;既不是核心点、又不在任何核心点邻域内的,标记为噪声。它能发现任意形状的簇、能揪出离群点,但对参数敏感,遇到密度差异大的数据会失灵。

聚类算法对比

聚类算法对比

算法 簇形状假设 需预设簇数 抗噪 大数据
KMeans 球形、大小相近
层次聚类 不限制 可用树状图定
DBSCAN 任意形状

三、没有标签,怎么评估

这是聚类最反直觉的地方。监督学习有标准答案可比,聚类没有。我们退而求其次,用"内部指标"衡量簇内是否紧凑、簇间是否分离。

轮廓系数是最常用的一个。它对每个样本算一个分数:该样本到自己簇的平均距离越近、到最近的其他簇越远,分数越高。整体轮廓系数在负一到一之间,越接近一越好。它还能用来选 k——把 k 从 2 试到 10,画轮廓系数曲线,取峰值。

肘部法是另一个选 k 的土办法:随 k 增大,簇内平方和(每个点到簇中心距离的平方和)必然下降,但下降速度会在"合适的 k"附近突然变缓,曲线像手肘。拐点处就是候选 k。

from sklearn.metrics import silhouette_score silhouette_score(X, labels)

这两个指标都只在"相对意义"上成立:它们帮你在一堆候选里挑相对更好的,而不是告诉你一个绝对正确的簇数。聚类本来就没有唯一正确答案。

四、工程实践要点

⚠️ 常见坑:不标准化就直接聚类。KMeans、层次聚类都基于距离,量纲大的特征会主导距离计算,把结果带偏。先 StandardScaler 再聚类是标配。

⚠️ 常见坑:把 KMeans 的 n_clusters 当成"业务上的正确数字"硬凑。聚类没有唯一答案,k 是建模选择,要结合业务含义和内部指标一起判断,而不是追求某个绝对最优。

💡 关键直觉:聚类是"探索"多于"求解"。它的价值常常在于帮你发现数据里原来没注意到的分组,而不是给一个精确预测。所以别在"准确率"上纠结,那本就不存在。

💡 关键直觉:DBSCAN 把离群点标记成负一,这既是特性也是信号——那批负一的点,往往就是异常检测要找的目标。

五、深入补充与常见问题

聚类是四类任务里最"玄"的一个,因为没有一个分数能告诉你做对了没。这一节把几个没展开的细节补齐,尤其是三种算法的机制和内部指标怎么读,读懂了它们,选型才有底气。

KMeans 的具体步骤是:先随机挑 k 个点当初始中心,k-means++ 会让初始中心尽量分散,比纯随机稳;然后反复做两步——把每个样本分给最近的中心,再用每个簇的均值更新中心——直到中心不再移动或达到最大迭代次数。它最小化的量叫簇内平方和,也叫惯性。因为初始中心随机,KMeans 可能陷入局部最优,所以通常多跑几次取惯性最小的。

层次聚类里,怎么定义两个簇之间的距离,决定了树的形态。单连接取两个簇里最近的两点距离,容易拉出链状;全连接取最远的两点距离,倾向紧凑的球;平均连接取所有点对距离的均值,折中;Ward 连接最小化合并后的方差增量,倾向大小相近的簇。没有绝对标准,一般先试 Ward。

DBSCAN 的点分三类更好懂:核心点,eps 邻域里有至少 min_samples 个邻居;边界点,自己不是核心点,但落在某个核心点的邻域里;噪声点,两者都不是。簇就是由密度相连的核心点加边界点组成的。密度直达、密度可达、密度相连这三个递进概念,说的就是怎么从一个核心点一路连到一整个簇。

轮廓系数可以这样理解:对每个样本,先算它到自己簇内其他点的平均距离,记作 a;再算它到最近的其他簇所有点的平均距离,记作 b。该样本的轮廓系数就是 b 减 a,再除以 a 和 b 里较大的那个。簇内紧、簇间远,a 小 b 大,系数就接近一。除了轮廓系数,还有两个内部指标:Calinski-Harabasz 指数看簇间离散度与簇内离散度的比值,越大越好;Davies-Bouldin 指数看簇内紧度和簇间分离度的比值,越小越好。方向类似,可以一起看。

距离度量也影响结果。默认是欧氏距离,但高维或稀疏数据里,余弦相似度有时更合适。Scikit-learn 的聚类器大多能通过 metric 参数换距离度量。换了度量,前面的标准化策略也要跟着想清楚,因为不同度量对量纲的敏感程度不同。

还有一个值得知道的是高斯混合模型,它和 KMeans 思路不同:不是硬把每个点分到一个簇,而是给每个点一个属于各簇的概率,软聚类。它对簇形状的假设更灵活,能拟合椭圆形的簇,代价是计算更重、也可能陷入局部最优。

把聚类落到业务,最常见的是客户细分:电商把用户按购买频次、客单价、品类偏好分成几组,对每组用不同的话术。其次是异常检测:DBSCAN 标记出的噪声点,往往就是欺诈交易或故障设备。图像分割里,聚类把像素按颜色纹理分成区域。这些场景的共同点是没有人事先给你正确答案,分组本身就是目的。

内部指标够不够,怎么和业务语义一起看

轮廓系数和惯性这两把尺子都有盲区。惯性是簇内平方和,k 越大它必然越小,单独看它永远倾向选更大的 k,所以它只能配肘部法看拐点,不能拿绝对值去比不同 k 的优劣。轮廓系数会惩罚非球形簇,DBSCAN 分出的长条形或环状簇,轮廓系数往往不高,不是它分错了,是这把尺子天生偏好球形。所以内部指标只能做初筛:先用它们圈出几个候选 k,再逐个回到业务上检验。把每个簇的中心和样本抽出来看看,问一句这组人有什么共同特征、这组交易是什么模式,解释得通才留下。一个轮廓系数 0.8 但业务上说不清的结果,比一个 0.5 但一眼能看懂的结果更危险,因为前者只是数字好看。最终裁判是"这个分组能不能指导下一步动作",比如能不能据此设计不同的运营策略,而不是某个指标数值。

KMeans 的 k 怎么定

结合业务和指标。业务上先有个大致预期,比如客户分群想做三档还是五档;指标上画轮廓系数或肘部法曲线看拐点。两者互相印证,别只信一个。

聚类结果怎么解释

看每个簇的质心在哪些特征上突出,给簇起个业务名字,比如"高消费低频次"组。簇中心的特征值能帮你概括这个簇是干什么的。

层次聚类数据量大怎么办

层次聚类时间复杂度高,几万条就吃力。数据量大时先用 KMeans 或 DBSCAN,或者先抽样用层次聚类看清结构,再回全量数据用别的算法。

聚类和分类能混用吗

常见套路是先聚类打标签,再训练分类器,但有风险:聚类是探索性的,没有"正确"标签,用它当监督信号会放大误差。只在标签确实拿不到、且聚类结果业务上说得通时用。

聚类结果怎么检验

聚类结果要可视化检验。二维数据直接画散点,高维数据先降维再画。图上一眼能看出簇是不是被强行切开了,比任何指标都直观。

DBSCAN 的参数怎么调

eps 太小,很多点被标成噪声;太大,多个簇被并成一个。可以画 k 距离图,看距离曲线的拐点来估 eps,min_samples 通常从特征维度加一开始试,再根据噪声点比例微调。

聚类做特征工程有用吗

有用,而且常见。把样本所属的簇编号作为一个新特征,喂给下游的分类或回归模型,有时能带来提升。这也是无监督和有监督配合的典型方式。

肘部法找不到明显拐点怎么办

说明数据可能没有清晰的分组结构,别硬凑 k。这时候换 DBSCAN 看看有没有自然簇,或者回头审视数据本身是不是就没有聚类的意义。

最后强调一句:聚类的"正确性"要回到业务检验。一个轮廓系数很高的结果,业务上解释不通,也没法用;反过来,指标平平但分组恰好贴合业务直觉,可能就是有价值的。指标是辅助,业务判断是最终裁判。

本节速览

  • 聚类本质:无监督,只喂特征,没有标准答案
  • KMeans:假设球形簇,快,要预设 k,怕异常值和异形簇
  • 层次聚类:树状结构,可画树状图,计算昂贵
  • DBSCAN:按密度聚类,任意形状、能找噪声,参数敏感
  • 评估:轮廓系数、肘部法,选 k 看拐点和峰值
  • 预处理:距离类算法必须先标准化

下一节我们换到特征的维度上做文章——特征太多时怎么压缩,这就是降维任务。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U