第8章 文本聚类:K-Means、层次聚类与模糊 C 均值
读完你能: 手算一轮 K-Means 的指派、中心更新与目标函数变化;区分单连接、全连接、平均连接、中心连接与 Ward 方法;计算模糊 C 均值(FCM)的隶属度与加权中心;结合轮廓系数与文本特征检查聚类结果。
1. 没有类别标签时,聚类在找什么
分类任务依赖事先标注好的类别标签,而聚类是在没有标签的情况下,按特征空间中的距离或相似度把文档分成若干簇(cluster)。需要清醒认识的是:算法把语料分成了三个簇,并不意味着自动发现了三个业务主题——如果特征里混入了篇幅长短、网页模板或语种差异,聚类完全可能按这些表面因素分组。
因此,动手聚类前要先定下三件事:
- 文本表示:用词频、TF-IDF、SVD/NMF 低维向量,还是句向量?
- 距离或相似度:用欧氏距离还是余弦相似度?
- 簇的形态:要求每个文档只属于唯一一个簇(硬聚类),还是允许同时对多个簇有不同归属度(软聚类/模糊聚类)?
当所有文档向量都先做过 L2 归一化(即 )时,平方欧氏距离与余弦相似度满足确定关系:
也就是说,在单位球面上“欧氏距离最小”等价于“余弦相似度最大”。不过需要注意,标准 K-Means 在更新簇中心时取的是算术平均,均值向量本身不再保持单位长度;若要求中心也始终落在单位球面上,需要额外对中心做归一化(即球面 K-Means)。
2. K-Means 的目标函数与两步交替
给定样本 和预设簇数 ,K-Means 寻找各样本的簇指派 及簇中心 ,最小化簇内平方误差和(WCSS):
标准算法从随机初始化的 个中心出发,交替执行两步:
- 指派(Assignment):固定簇中心 ,将每个样本 分配给距离它最近的中心,即 。
- 更新(Refitting):固定指派结果,将每个簇的中心移动到该簇全体样本的算术平均,即 。
- 重复以上两步,直到所有样本的指派不再变化,或目标函数下降小于阈值。
指派步对每个样本挑最近中心,不会让 变大;更新步用均值最小化二次平方和,也不会让 变大。因此 单调不增,算法一定在有限步内收敛。但由于目标函数非凸,收敛结果依赖初始中心位置,通常需要用不同随机种子(或 K-Means++ 初始化)多跑几次。若迭代中某个簇变成空集,实现中需约定将该中心重新指向最远样本或随机样本,避免除以 0。
3. 手算一轮 K-Means
设一维数据点为 ,取 ,初始中心设为 、。
第一步:指派。 计算每个点到两个初始中心的距离:
| 数据点 | 到 的距离 | 到 的距离 | 所属簇 |
|---|---|---|---|
| 0 | 0 | 8 | A |
| 2 | 2 | 6 | A |
| 8 | 8 | 0 | B |
| 10 | 10 | 2 | B |
此时簇 ,簇 ,初始平方误差为 。
第二步:更新中心。
用新中心重新计算距离: 到 的距离都是 (到 分别为 ), 到 的距离都是 ,指派保持不变,算法收敛。更新后的目标函数降为
points = [0.0, 2.0, 8.0, 10.0]
centers = [0.0, 8.0]
labels = [min(range(2), key=lambda j: abs(x - centers[j])) for x in points]
updated = [sum(x for x, z in zip(points, labels) if z == j) /
sum(z == j for z in labels) for j in range(2)]
assert updated == [1.0, 9.0]
在高维稀疏文本上运行 K-Means 后,可以查看每个簇中心向量里权重最高的十几个词以及离中心最近的代表文档,用来判断该簇是否有清晰的语义主题。
4. 层次聚类:自底向上合并与自顶向下拆分
层次聚类不需要预先固定唯一的簇数 ,而是构造一棵树状图(dendrogram)记录全部分合过程;需要几个簇,就在对应高度横切一刀。常见路线有两种:
- 凝聚式(Agglomerative,自底向上):初始时每个样本自成一簇,每一步把当前最相近的两个簇合并,直到所有样本合为一个大簇;
- 分裂式(Divisive,自顶向下):初始时全部样本在一个簇内,逐步把簇一分为二,直到拆到单个样本。
凝聚式聚类每一步“合并哪两个簇”,取决于如何定义两个簇 与 之间的距离(连接方式 linkage):
| 连接方式 | 簇间距离或合并代价 | 结构特点 |
|---|---|---|
| 单连接(single / min linkage) | 只看最近点对,容易拉出细长“链状”簇 | |
| 全连接(complete / max linkage) | 受最远点对制约,倾向形成直径紧凑的簇 | |
| 平均连接(average linkage) | 折中单连接与全连接,兼顾所有点对 | |
| 中心连接(centroid linkage) | 直接量两簇均值中心的距离 | |
| Ward 方法 | 合并后簇内平方误差和的增量 | 倾向产生大小较均衡、方差紧凑的球状簇 |
其中 Ward 方法的平方误差增量可化简为两簇中心的加权平方距离:
可以看出,当两簇中心距离相同时,样本数更大的簇合并带来的方差增量也更大;此外,Ward 公式建立在欧氏平方误差之上,使用时特征空间应与欧氏几何相容。
5. 同一批数据,不同连接方式如何走出不同合并树
设一维四个点为 。 初始两两距离中, 最小(,),因此所有标准距离连接第一步都会先把 合并为簇 ,其均值中心为 。
第二步需要在三个簇 中挑一对合并,其中 与 的距离固定为 。对比不同连接方式下 与 的距离或代价:
- 单连接(single):,因此第二步合并 与 ,得到 。
- 全连接(complete):,因此第二步转而合并 与 ,得到 和 。
- 平均连接(average):,此时合并 与 、或者合并 与 距离相同,需要按预设平局规则决定。
- 中心连接(centroid):,同样出现并列。
- Ward 方法:合并 与 的方差增量为 ;而合并单点 与 的增量为 ,因此第二步先合并 与 。
这个例子直观展示了:同样四个点,仅把单连接换成全连接或 Ward,两簇切分就会从 变成 。
6. 模糊 C 均值(FCM):允许一篇文档横跨多个簇
一篇新闻既谈科技又谈金融时,硬塞进唯一一个簇会丢失跨主题信息。模糊 C 均值(Fuzzy C-Means, FCM)为每个样本 对每个簇 赋予非负隶属度 ,满足 ,并最小化带模糊指数 的加权目标:
当样本到各簇中心的距离均不为 0 时,用拉格朗日乘子法求得交替更新公式:
每个簇中心 就是全体样本以 为权重的加权平均。若某个样本恰好与某个中心重合(距离为 0),则将该样本对该重合中心的隶属度直接设为 1,其余簇设为 0。
例: 设两个簇中心为 ,取常用模糊指数 (此时指数 )。对数据点 ,它到两中心的距离分别为 和 ,于是:
两项之和恰好为 1,且因为 离 近得多,隶属度主要集中在第一簇。注意 是距离比决定的几何隶属度,虽然满足非负且和为 1,但并不是概率生成模型算出的后验概率。
7. 怎样评估聚类结果
没有外部人工标签时,常用轮廓系数(Silhouette Coefficient)衡量簇的内部紧凑度与簇间分离度。对样本 :
- 令 为样本 到同一簇内其他样本的平均距离(簇内越紧凑, 越小);
- 令 为样本 到其他某一个簇全体样本的平均距离对所有其他簇取最小值(即离最近邻簇的平均距离, 越大说明分离越清楚);
- 定义样本 的轮廓系数为:
(若某簇只有 1 个样本,通常约定 。)例如某样本 ,则 。 越接近 ,说明簇内紧、簇间远;接近 说明处在两簇边界;若为负数(),说明它离别的簇反而比离自己簇更近,很可能分错了簇。
在文本聚类实践中,几何指标只能作为第一步参考。确认聚类是否真正可用,还要抽查每簇的高权重关键词和中心附近的代表文档,检查换随机种子后簇结构是否稳定,并验证它能否切实帮助下游检索、归档或人工审阅。
自测
1. 把所有样本坐标和簇中心同时乘以 10,K-Means 的簇内平方误差和 J 会变成原来的多少倍?
距离变为原来的 10 倍,平方距离变为原来的 倍,因此 乘以 100。如果不同特征维度的量纲相差悬殊,数值范围大的维度会主导欧氏距离,聚类前需要先做归一化或标准化。
2. 在第 6 节的 FCM 例子中,如果数据点在正中间 x=5(中心仍为 0 和 10,m=2),它的两个隶属度分别是多少?
点 到两中心的距离相等(),距离比为 ,因此 。
- 感谢你赐予我前进的力量

