跳到主要内容

聚类 — k-means 的拉锯战与混合高斯的软分配

这一章讲三件事: 没有答案的数据怎么自动分成几堆; 分完之后怎么判断「分得好不好」;以及「硬说你是这堆的」和「说你有几成是这堆的」差在哪。 聚类(把相似数据汇总为簇的方法)是无监督学习的两大任务之一,和第 08~09 章的降维并列1

1. 顶层全景

一堆没有标签的点
↓ k-means:立 k 根旗(重心)→ 点归最近的旗 → 旗挪到队伍正中间 → 循环
↓ 评估:簇内平方和越小,分得越紧
↓ 簇数 k 怎么定:画 WCSS 曲线,找「肘部」
── k-means 的两个不满 ──
↓ 只认「最近的旗」,没有中间派 → 混合高斯:按权重软分配
↓ 只会切圆团,不会切椭圆 → 混合高斯:每个簇自带形状参数

图说:上半场是 k-means,下半场的两个「不满」由混合高斯接手。

k-means 是最有代表性的聚类算法,简单易懂,又能处理比较大的数据集,在市场分析、图像理解等领域应用广泛2。它的一切围绕一个东西:重心(centroid)——每个簇的代表点;每个数据点算出离哪根旗最近,就归哪个簇3

2. 主走查:k-means 的两轮拉锯

算法四步4,我们拿 6 个二维点、分 2 簇走两轮(点的坐标与初始旗位是为演示编的;每一步的结果按公式实算):

数据:A(1,2) B(1.5,1.8) C(2,2.2) D(5,6) E(6,5.5) F(5.5,6.2)
第 0 步:随机立旗 → 旗1=P(5.5,2),旗2=Q(1.5,2)

第 1 轮·归队(直线距离=√(横向差²+纵向差²),逐点实算):
A: 距旗1=4.50, 距旗2=0.50 → 旗2
B: 距旗1=4.00, 距旗2=0.20 → 旗2
C: 距旗1=3.51, 距旗2=0.54 → 旗2
D: 距旗1=4.03, 距旗2=5.32 → 旗1
E: 距旗1=3.54, 距旗2=5.70 → 旗1
F: 距旗1=4.20, 距旗2=5.80 → 旗1
→ 旗2 收了左边三人,旗1 收了右边三人

第 1 轮·挪旗(每簇取平均):
旗2 → ((1+1.5+2)/3, (2+1.8+2.2)/3) = (1.5, 2.0)
旗1 → ((5+6+5.5)/3, (6+5.5+6.2)/3) = (5.5, 5.9)

第 2 轮·归队:六个人重新算距离——无人换队
(例:A 距旗2=0.50、距旗1=5.95,仍归旗2;D 距旗1=0.51、距旗2=5.32,仍归旗1;其余同理)。
停。最终:左簇 {A,B,C} 重心(1.5,2.0);右簇 {D,E,F} 重心(5.5,5.9)。

注意最后一步的停止条件:所有数据点不再改变所属的簇(或达到最大步数)5。拉锯结束的标志不是「分对了」——没有答案的世界里没有「对」——而是不再有人换队,格局稳定了

两个工程细节,原书都点了名:

  • 初始旗位是玄学:两面旗随机立得太近,拉锯可能卡在糟糕的分法上。补丁叫 k-means++:专挑彼此离得尽量远的数据点当初始重心6;
  • 簇数 k 是超参数,训练前就得定;难定的时候用肘方法(下一节)7

3. 分得好不好:WCSS 与肘部

聚类的世界里没有正确答案可比,要另找客观标尺。原书给的量尺是簇内平方和(WCSS):把每个点到自己簇重心的距离平方,全簇加总,再把各簇加总8。一句话读它:所有人离自己的旗越近,WCSS 越小,分得越紧

原书演示了它的用法:同一份数据跑两次 k-means,一次 WCSS 50.1,一次 124.5——50.1 的那份分得更紧,更好9。注意口径:WCSS 随簇数增多必然变小,只能用来比较相同簇数的结果10

簇数怎么定?肘方法:把不同簇数的 WCSS 画成折线。簇数一路增加,WCSS 一路下降;但降到某个值之后,下降幅度明显放缓——折线弯得像手臂肘部的地方,就是合适的簇数。原书的例子里,簇数从 1 加到 3 时 WCSS 大降,从 3 加到 4、5 时只小降,于是取 311

原书同时给肘方法泼了盆冷水:实际数据常常没有明显的「肘部」,所以这个方法的结果只不过是一种参考12。最后别忘了一个更硬的判据:簇数的背后应有业务含义(客户分 3 类还是 5 类,得看这分类拿去干什么)。

4. 混合高斯:从「你属于谁」到「你有几成是谁」

高斯分布与混合高斯分布

高斯分布就是那条钟形曲线:用均值和方差(数据波动幅度)两个数完全描述——均值管中心位置,方差管摊得多开13混合高斯分布是几个高斯分布的线性叠加(加在一起)的模型14

为什么需要「混合」?原书用鸢尾花说话:整个数据集用一个高斯去拟合,每列只得出一对均值方差;可数据里明明有 3 个品种——一个分布无法体现不同品种之间的差异,3 个高斯叠加就可以15

主走查:一个数据点的「血统比例」

聚类难就难在:必须在不知道每个点属于谁的情况下估计参数16。原书用一维数据演示,两个高斯:红(均值 −2.0,方差 2.2)、蓝(均值 3.0,方差 4.0)17。现在来了一位新数据点 x=1.0,它算谁的?(权重数值按上述参数用正态分布的公式实算;公式本身取自原书的「值除以值之和」)

第 1 步:问两个分布「x=1.0 落在你这里有多大可能」
红分布给出 0.035,蓝分布给出 0.121(曲线高度)

第 2 步:归一化成权重 = 各自的值 ÷ 所有值之和
红:0.035/(0.035+0.121) ≈ 0.22
蓝:0.121/(0.035+0.121) ≈ 0.78

解读:x=1.0 这个点是「二成八红、七成八蓝」——
不用表态,血统比例就是全部信息。

k-means 在同一情况下只能给出硬判决:「你是蓝的」;混合高斯给出 0.78/0.22 的软分配。原书点出这正是此法的特点:不明确数据点属于哪个类别,用权重表示所属类别,一点一点地更新均值和方差18

学习循环(EM 思想的朴素版)

参数怎么学?四步循环19:初始化各分布的均值方差 → 用上面的办法给每个点算权重 → 按权重重算参数:某分布的均值 = 各点按权重的加权平均,方差同理用加权平均20 → 重复,直到前后两轮的均值变化足够小21

对比 k-means 的「归队→挪旗」:一模一样的骨架,唯一的差别是「归队」从非 0 即 1 的硬判决换成了连续的权重。事实上,把 k-means 的权重推到极端(全有或全无),它就是混合高斯的特例——两者是同一思想的两个刻度(补充:不在书里,来自通用知识;这个「一轮猜归属、一轮按归属更新」的交替套路,教科书里称为 EM 算法)。

椭圆对圆:混合高斯的实际优势

k-means 的「距离」天生是各方向等价的,所以它只认圆形团;数据若拉成椭圆,k-means 会把一个椭圆从中间错切两半。混合高斯的每个高斯自带方差结构,能贴着椭圆形分布拟合。原书拿同一数据集对比:椭圆数据上混合高斯聚类效果好,k-means 对部分数据切错了22

原书代码:鸢尾花 4 维数据、3 个高斯,GaussianMixture 学出的三个均值向量,其中一个正是 (5.006, 3.418, 1.464, 0.244)——花瓣宽 0.244,一看就是「矮小花瓣」那个品种23

5. 作者的判断与证据

说法性质依据
WCSS 50.1 比 124.5 好书内给数量对照数值在正文9
肘部=合适簇数(例中取 3)作者的实操建议,且自我设限「只是参考」书内明说1112
k-means++ 缓解初始旗问题作者陈述缓解机制,未给证明书内陈述6
一个高斯表达不了 3 个品种书内给出推理(一对均值方差对 3 个品种)书内讲解15
椭圆数据混合高斯优于 k-means书内图示对照,没给数字证据图示22
软分配优于硬分配?书内未下这个结论——它只并列介绍;什么场景必须软分配(如客户「骑墙」价值),要读者自己判断我们补充

6. 边界与局限

  • k-means 的「距离」隐含一个假设:所有特征的尺度相当。一个 01 的特征配一个 0100000 的特征,距离被后者垄断,聚类就变成「只按那一列分」——必须先统一尺度。原书未提(补充:不在书里,来自通用知识)。
  • WCSS 只衡量「紧」,不衡量「对」:把连续的连贯结构硬切成 k 块,WCSS 也会变小——它适合比较,不适合当唯一依据。
  • 混合高斯的四步循环是 EM 算法(一轮猜归属、一轮按归属更新的交替法)的朴素版,原书没有给出这个名字和收敛保证(「直到均值变化足够小」是经验停止条件)21
  • 混合高斯的簇数(高斯个数)与 k-means 的 k 一样是超参数,肘方法同样适用;原书未做这个连接。
  • 版本提示:KMeans(n_clusters=3) 输出的三个重心如 (5.006, 3.418, 1.464, 0.244)24;GaussianMixture(n_components=3) 的均值见23

7. 可带走的

  1. 聚类的三件套:重心、归队、挪旗——k-means 全部机制就是这三步循环;
  2. 停止条件是「无人换队」:稳定 ≠ 正确,没有答案的世界里只有「紧」可量;
  3. WCSS=紧度;只能比同簇数的结果;簇数看肘部,但肘部常常不清晰,只是参考;
  4. 初始旗位影响结局,k-means++ 专挑彼此远离的点开局;
  5. 软分配(0.22/0.78 的血统比例)是混合高斯对 k-means 的核心升级,骑墙客户就靠它识别;
  6. 高斯分布两个数定形:均值管中心,方差管摊开;混合高斯=几条钟形曲线叠加;
  7. 权重计算一行公式:某分布给的值 ÷ 所有分布的值之和;
  8. 椭圆团选混合高斯,圆团用 k-means 就够;
  9. 特征尺度不齐时先把刻度拉平(这一步行话叫归一化)再聚类,否则距离被大数值特征绑架(书外补充);
  10. k-means 可视为混合高斯的硬分配特例——学一个,半个免费。

8. 原文地图

主题原书章原文位置
聚类定义3.5 算法14:k-means算法text/19-ch03-05-3-5-14-k-means.txt:4(搜「汇总为簇的方法叫作聚类」)
应用领域、简单3.5 算法14:k-means算法text/19-ch03-05-3-5-14-k-means.txt:10(搜「市场分析和计算机视觉等领域」)
重心=代表点3.5 算法14:k-means算法text/19-ch03-05-3-5-14-k-means.txt:13(搜「算法中簇的代表点」) · text/19-ch03-05-3-5-14-k-means.txt:14(搜「找出离得最近的簇的重心」)
四步算法3.5 算法14:k-means算法text/19-ch03-05-3-5-14-k-means.txt:22(搜「作为这些簇的重心」) · text/19-ch03-05-3-5-14-k-means.txt:24(搜「平均值,并将其作为新的重心」) · text/19-ch03-05-3-5-14-k-means.txt:25(搜「不改变所属的簇」)
簇数超参数、k-means++3.5 算法14:k-means算法text/19-ch03-05-3-5-14-k-means.txt:29(搜「簇的数量是一个超参数」) · text/19-ch03-05-3-5-14-k-means.txt:33(搜「选择位置尽可能远离」)
WCSS 定义与用法3.5 算法14:k-means算法text/19-ch03-05-3-5-14-k-means.txt:78(搜「簇内平方和」) · text/19-ch03-05-3-5-14-k-means.txt:81(搜「这个值越小,说明聚类结果越好」) · text/19-ch03-05-3-5-14-k-means.txt:79(搜「相同数量的簇的情况下的比较」)
50.1 对 124.53.5 算法14:k-means算法text/19-ch03-05-3-5-14-k-means.txt:84(搜「WCSS 为 50.1」)
肘方法、只是参考3.5 算法14:k-means算法text/19-ch03-05-3-5-14-k-means.txt:92(搜「手臂弯曲时的肘部」) · text/19-ch03-05-3-5-14-k-means.txt:99(搜「只不过是一种参考而已」)
iris 重心输出3.5 算法14:k-means算法text/19-ch03-05-3-5-14-k-means.txt:62(搜「5.9016129」)
高斯与混合高斯定义3.6 算法15:混合高斯分布text/20-ch03-06-3-6-15.txt:10(搜「均值描述数据的中心位置」) · text/20-ch03-06-3-6-15.txt:11(搜「多个高斯分布的线性叠加」)
一个高斯不够、3 个叠加3.6 算法15:混合高斯分布text/20-ch03-06-3-6-15.txt:23(搜「无法体现不同品种之间的差异」) · text/20-ch03-06-3-6-15.txt:24(搜「3 个高斯分布叠加而成」)
一维红蓝例3.6 算法15:混合高斯分布text/20-ch03-06-3-6-15.txt:31(搜「方差为 2.2」)
未知类别→权重3.6 算法15:混合高斯分布text/20-ch03-06-3-6-15.txt:39(搜「的权重的基础上」)
四步循环、权重公式3.6 算法15:混合高斯分布text/20-ch03-06-3-6-15.txt:42(搜「初始化参数」) · text/20-ch03-06-3-6-15.txt:58(搜「所有高斯分布的值之和」) · text/20-ch03-06-3-6-15.txt:61(搜「加权平均值」) · text/20-ch03-06-3-6-15.txt:47(搜「更新前后的每个均值的变化足够小」)
一点一点更新3.6 算法15:混合高斯分布text/20-ch03-06-3-6-15.txt:63(搜「一点一点地更新均值和方差」)
椭圆对圆3.6 算法15:混合高斯分布text/20-ch03-06-3-6-15.txt:121(搜「呈椭圆形分布的数据有效」) · text/20-ch03-06-3-6-15.txt:122(搜「从重心开始呈圆形分布的数据有效」)
GaussianMixture 输出3.6 算法15:混合高斯分布text/20-ch03-06-3-6-15.txt:74(搜「GaussianMixture」) · text/20-ch03-06-3-6-15.txt:92(搜「5.91697517」)

Footnotes

  1. 出处:「3.5 算法14:k-means算法」第 4 段(text/19-ch03-05-3-5-14-k-means.txt:4,搜「汇总为簇的方法叫作聚类」)。

  2. 出处:「3.5 算法14:k-means算法」第 9~10 段(text/19-ch03-05-3-5-14-k-means.txt:10,搜「市场分析和计算机视觉等领域」)。

  3. 出处:「3.5 算法14:k-means算法」第 13 段(text/19-ch03-05-3-5-14-k-means.txt:13,搜「算法中簇的代表点」)与第 14 段(text/19-ch03-05-3-5-14-k-means.txt:14,搜「找出离得最近的簇的重心」)。

  4. 出处:「3.5 算法14:k-means算法」第 22~25 段(text/19-ch03-05-3-5-14-k-means.txt:22,搜「作为这些簇的重心」;text/19-ch03-05-3-5-14-k-means.txt:24,搜「平均值,并将其作为新的重心」)。走查中的坐标与逐点距离为演示实算,数据本身是编的。

  5. 出处:「3.5 算法14:k-means算法」第 25 段(text/19-ch03-05-3-5-14-k-means.txt:25,搜「不改变所属的簇」)。

  6. 出处:「3.5 算法14:k-means算法」第 33~34 段(text/19-ch03-05-3-5-14-k-means.txt:33,搜「选择位置尽可能远离」)。 2

  7. 出处:「3.5 算法14:k-means算法」第 29~30 段(text/19-ch03-05-3-5-14-k-means.txt:30,搜「Elbow 方法(肘方法)等」)。

  8. 出处:「3.5 算法14:k-means算法」第 78 段(text/19-ch03-05-3-5-14-k-means.txt:78,搜「簇内平方和」)与第 80 段(搜「距离的平方和,并将它们相加」)。

  9. 出处:「3.5 算法14:k-means算法」第 84 段(text/19-ch03-05-3-5-14-k-means.txt:84,搜「WCSS 为 50.1」)。 2

  10. 出处:「3.5 算法14:k-means算法」第 79 段(text/19-ch03-05-3-5-14-k-means.txt:79,搜「相同数量的簇的情况下的比较」)。

  11. 出处:「3.5 算法14:k-means算法」第 90~93 段(text/19-ch03-05-3-5-14-k-means.txt:90,搜「变小幅度会从簇的数量为某个值时开始放缓」;text/19-ch03-05-3-5-14-k-means.txt:92,搜「手臂弯曲时的肘部」;text/19-ch03-05-3-5-14-k-means.txt:93,搜「设置为 3 似乎很合适」)。 2

  12. 出处:「3.5 算法14:k-means算法」第 99 段(text/19-ch03-05-3-5-14-k-means.txt:99,搜「只不过是一种参考而已」)。 2

  13. 出处:「3.6 算法15:混合高斯分布」第 10 段(text/20-ch03-06-3-6-15.txt:10,搜「均值描述数据的中心位置」)。

  14. 出处:「3.6 算法15:混合高斯分布」第 11 段(text/20-ch03-06-3-6-15.txt:11,搜「多个高斯分布的线性叠加」)。

  15. 出处:「3.6 算法15:混合高斯分布」第 23 段(text/20-ch03-06-3-6-15.txt:23,搜「无法体现不同品种之间的差异」)与第 24 段(text/20-ch03-06-3-6-15.txt:24,搜「3 个高斯分布叠加而成」)。 2

  16. 出处:「3.6 算法15:混合高斯分布」第 39 段(text/20-ch03-06-3-6-15.txt:39,搜「的权重的基础上」)。

  17. 出处:「3.6 算法15:混合高斯分布」第 31~32 段(text/20-ch03-06-3-6-15.txt:31,搜「方差为 2.2」)。两个分布在新数据点处的曲线高度(0.035 与 0.121)为演示实算。

  18. 出处:「3.6 算法15:混合高斯分布」第 62~63 段(text/20-ch03-06-3-6-15.txt:63,搜「一点一点地更新均值和方差」)。

  19. 出处:「3.6 算法15:混合高斯分布」第 42~47 段(text/20-ch03-06-3-6-15.txt:42,搜「初始化参数」;text/20-ch03-06-3-6-15.txt:47,搜「更新前后的每个均值的变化足够小」)。

  20. 出处:「3.6 算法15:混合高斯分布」第 58 段(text/20-ch03-06-3-6-15.txt:58,搜「所有高斯分布的值之和」)与第 61 段(text/20-ch03-06-3-6-15.txt:61,搜「加权平均值」)。

  21. 出处:「3.6 算法15:混合高斯分布」第 47 段(text/20-ch03-06-3-6-15.txt:47,搜「更新前后的每个均值的变化足够小」)。EM(期望最大化)这个名字原书未提,来自通用知识。 2

  22. 出处:「3.6 算法15:混合高斯分布」第 121 段(text/20-ch03-06-3-6-15.txt:121,搜「呈椭圆形分布的数据有效」)与第 122 段(text/20-ch03-06-3-6-15.txt:122,搜「从重心开始呈圆形分布的数据有效」)。 2

  23. 出处:「3.6 算法15:混合高斯分布」第 92 段(text/20-ch03-06-3-6-15.txt:92,搜「5.91697517」)。三个均值向量中的 (5.006, 3.418, 1.464, 0.244) 在第 93 段。 2

  24. 出处:「3.5 算法14:k-means算法」第 62 段(text/19-ch03-05-3-5-14-k-means.txt:62,搜「5.9016129」);其中 (5.006, 3.418, 1.464, 0.244) 在第 63 段。