跳到主要内容

聚类与降维

聚类回答“按照某种相似性,哪些样本应该放在一起”;降维回答“能否用更少的坐标表示这些样本”。两者可以连用,但画面整齐或分组清楚,不会自动赋予结果正确的语义类别。

例如,把文档向量聚在一起,可以帮助查看反复出现的主题;把向量压成两个坐标,可以帮助画图。图上的分组可能反映语言、长度、来源网站,也可能才是关心的主题。要知道是哪一种,需要回到原文检查。

距离也是模型的一部分

假设样本包含以秒计的时长,以及一到五分的评分。原始欧氏距离中,100 秒的差异可能淹没两分的差异。逐维标准化会改变几何关系,却不会发现唯一正确的距离。应根据任务要比较什么来选择尺度,并用拟合数据估计标准化统计量。

对长度归一化后的向量 u,vu,v

uv22=22uv.\|u-v\|_2^2=2-2u^\top v.

因此,这时欧氏最近邻与余弦相似度的排序一致。未经归一化不能直接使用这个等价关系,聚类算法也不会因此全部等价,因为聚类中心的位置和是否归一化同样重要。Embedding、Reranker 与分类器说明向量模型在聚类之前已经做了什么选择。

K-means 交替分配与求均值

K-means最小化样本到所属中心的平方距离之和。一次常见迭代先把每个样本分给最近中心,再用组内均值更新中心。它可能停在局部解,所以初始化有影响。

构造一维数据 (0,1,9,10)(0,1,9,10),初始中心为 0 和 10。分组为 (0,1)(0,1)(9,10)(9,10),更新后的中心是 0.50.59.59.5。组内平方距离总和为 4×0.52=14\times0.5^2=1。如果只设一个组,中心为 5,平方距离和为 25+16+16+25=8225+16+16+25=82。增加组数能继续降低这个目标,却未必增加有用解释。

points = [0.0, 1.0, 9.0, 10.0]
centers = [0.0, 10.0]
for _ in range(5):
groups = [[] for _ in centers]
for value in points:
nearest = min(range(len(centers)), key=lambda j: (value - centers[j]) ** 2)
groups[nearest].append(value)
centers = [sum(group) / len(group) if group else old
for group, old in zip(groups, centers)]
assert centers == [0.5, 9.5]
print(centers)

示例遇到空组会保留旧中心,实际实现需要明确空簇处理策略。这段代码只用于理解迭代,不是通用聚类库。

K-means 偏好围绕均值的紧凑分组,并要求提前指定 KK。密度不均、细长形状、异常值或不合适的距离都会误导分组。DBSCAN 等密度方法连接稠密邻域,可以把一些点标成噪声,但邻域尺度仍是实质性的选择。层次聚类给出逐层合并关系,使用哪种 linkage 决定了两组之间怎样算近。

四个 K-means 例子展示簇数、拉长的簇、方差不同和簇大小不同带来的问题。查看清晰大图

颜色表示 K-means 给出的分组。对照拉长的簇、不同离散程度和不同簇大小:按到中心的距离划分,可能切开原本期待的群体。四格分别展示不同失效情形,不是同一个数据集的四种视图。

PCA 保留变化,不直接保留标签

主成分分析 PCA从中心化数据中寻找相互正交的变化方向。保留主要方向,可以得到更低维的线性表示,并重建原坐标。它不读取类别标签。

取三个点 (1,1),(2,2),(3,3)(1,1),(2,2),(3,3),均值为 (2,2)(2,2)。中心化后是 (1,1),(0,0),(1,1)(-1,-1),(0,0),(1,1),第一主方向为:

v1=12(1,1).v_1=\frac{1}{\sqrt2}(1,1).

投影得到 (2,0,2)(-\sqrt2,0,\sqrt2)。把每个标量乘回 v1v_1,再加均值,就能完整恢复原始点。垂直方向 (1,1)/2(1,-1)/\sqrt2 没有变化。这组构造数据位于一条直线上,所以一个坐标已经够用。

换一种数据:文档长度造成很大变化,而区分“重复副本”和“原件”的特征变化很小。PCA 可能删掉后者,尽管它对分类非常重要。因此,解释方差高不等于任务信息保留得好,应在相同留出样本上比较降维前后的下游表现。

二维图只是一个视角

t-SNE 等非线性嵌入优先保留某些邻域关系,不会保留所有全局距离。图中很大的空隙或很小的簇,可能受超参数和初始化影响。不能根据一个类别占据的图形面积估算现实中的类别比例。

做探索时,保留原向量和文档标识,生成可视化后,再抽查明显分组及边界附近的样本。检查合理改变预处理、抽样后,分组是否仍然存在。如果用已知标签上色,应明确颜色来自人工标签,不是算法自己发现的语义。

没有标签怎样评价

轮廓系数等内部指标,比较所选距离下组内和组间的分离程度。它可能偏好与实际用途无关的几何结构。若目的是整理文档供人浏览,还要看读者是否更容易找到材料,以及代表文档是否能解释分组。

存在参考标签时,可以用不受簇编号任意置换影响的外部一致性指标比较划分。但不一致也可能意味着另一种有效分组:按主题标注的数据,可能被按语言聚类。先决定需要哪种区分,再谈结果对错。

如果降维服务后续预测,标准化和 PCA 都只能在训练数据上拟合,再变换验证与测试数据。先在全量上做 PCA 再划分,会让表示提前接触评价分布。如果只是描述整个集合,使用全量数据可以是有意选择,但不能把这张图说成独立预测测试。

检查后若形成了可靠标签,可以让监督分类器或树模型直接学习所需区别。聚类适合探索,给一组样本编号则不等于获得了经过验证的决策标签。

How to Use t-SNE Effectively 中,对同一组数据改变 perplexity 和迭代步数,比较簇的大小与间距如何变化。先做这个实验,再解释自己的散点图:图上分开的“小岛”,未必对应原空间里稳定分离的群体。

探索关联打开关联网络