AI 工程基础体系 · 第 6/100 篇。内容覆盖机器学习、深度学习与生成式 AI;模型、数据、评测、权限和成本会作为同一生产系统处理。

无监督学习:聚类、降维、异常检测、表示与评估边界

无监督学习处理的是这样一类问题:训练数据中没有一个明确提供给模型的目标标签 yy,模型需要从输入 xx 本身发现结构、压缩信息、识别稀有模式,或学习可供其他任务使用的表示。

设数据集为

X={x1,x2,,xn},xiRdX=\{x_1,x_2,\ldots,x_n\},\qquad x_i\in\mathbb{R}^d

其中 nn 是样本数,dd 是特征维度。监督学习通常优化

minθiL(fθ(xi),yi)\min_\theta \sum_i \mathcal{L}(f_\theta(x_i),y_i)

而无监督学习没有直接给出的 yiy_i,因此必须先规定“什么结构值得保留”:

  • 聚类把样本划分为若干组;
  • 降维寻找低维坐标,使主要结构或邻域关系得到保留;
  • 异常检测定义“与大多数样本不同”的程度;
  • 表示学习把原始数据映射为更适合检索、预测、生成或分析的向量;
  • 评估则回答:发现的结构是否稳定、是否有用、是否符合业务含义,而不是只看一个自动生成的分数。

“无监督”并不意味着完全没有先验。距离函数、特征缩放、聚类数、异常比例、重构损失、采样方式和数据权限,都会把人的假设写进系统。


一、无监督学习的边界:没有标签不等于没有目标

无监督任务通常没有人工标签,但仍有一个由算法或系统指定的目标函数。例如:

  • K-Means 的目标是最小化簇内平方距离;
  • PCA 的目标是最大化投影方差,或最小化线性重构误差;
  • 自编码器的目标是最小化输入重构误差;
  • 密度模型的目标是最大化观测数据的似然;
  • 对比学习的目标是让正样本对更接近、负样本对更远。

因此,“模型自己发现规律”是一个不完整的说法。更准确的表述是:

模型在给定表示空间、相似度定义、假设和优化目标下,寻找数据中符合这些假设的结构。

同一批数据使用欧氏距离、余弦相似度或马氏距离,可能产生完全不同的聚类和异常结果。改变标准化方式,也可能改变结果,因为很多算法依赖特征尺度。

例如,样本有两个特征:

x=(年收入,登录次数)x=(\text{年收入},\text{登录次数})

如果收入以元表示,登录次数以次表示,欧氏距离中的收入差异可能远大于登录次数差异。模型表面上是在处理两个特征,实际上几乎只在按收入分组。是否应该标准化,取决于业务上“收入差异”和“登录次数差异”是否具有可比性;标准化不是无条件正确,而是一次明确的建模假设。


二、聚类:从相似度到群组边界

2.1 聚类究竟要解决什么问题

聚类试图构造一个划分:

C={C1,C2,,Ck}C=\{C_1,C_2,\ldots,C_k\}

满足:

CiCj=(ij),j=1kCj=XC_i\cap C_j=\varnothing\quad(i\neq j),\qquad \bigcup_{j=1}^{k}C_j=X

这表示每个样本属于一个簇。但这个形式只是“分组”,并没有说明:

  1. 簇内应当相似到什么程度;
  2. 簇间应当如何区分;
  3. 是否必须每个样本都属于某个簇;
  4. kk 应该是多少;
  5. 不同簇是否允许形状和大小不同。

这些问题由具体算法回答。

2.2 K-Means:最小化簇内平方误差

K-Means 给定簇数 kk,为每个簇寻找中心 μj\mu_j,优化:

J=i=1nxiμci22J=\sum_{i=1}^{n}\left\|x_i-\mu_{c_i}\right\|_2^2

其中:

  • ci{1,,k}c_i\in\{1,\ldots,k\} 是样本 xix_i 的簇编号;
  • μj\mu_j 是第 jj 个簇的中心;
  • 2\|\cdot\|_2 是欧氏距离;
  • JJ 是簇内平方误差之和。

这个目标可以通过交替优化理解。

第一步:固定中心,分配样本。

对每个 xix_i,选择最近中心:

ci=argminjxiμj22c_i=\arg\min_j\|x_i-\mu_j\|_2^2

第二步:固定分配,更新中心。

对簇 CjC_j,令目标关于 μj\mu_j 的导数为零:

μjxiCjxiμj22=0\frac{\partial}{\partial \mu_j} \sum_{x_i\in C_j}\|x_i-\mu_j\|_2^2=0

展开后得到:

2xiCj(xiμj)=0-2\sum_{x_i\in C_j}(x_i-\mu_j)=0

因此:

μj=1CjxiCjxi\mu_j=\frac{1}{|C_j|}\sum_{x_i\in C_j}x_i

也就是说,平方欧氏距离下,使簇内误差最小的中心就是算术平均值。

重复这两个步骤,目标函数不会增加,通常会收敛到一个局部最优解,而不是保证全局最优。因此初始化会影响结果。K-Means++ 通过更分散地选择初始中心降低坏初始化概率,但仍不改变算法可能陷入局部最优的性质。

一个完整的一维算例

考虑数据:

X={1,2,3,10,11,12}X=\{1,2,3,10,11,12\}

k=2k=2,初始中心为 μ1=2,μ2=10\mu_1=2,\mu_2=10

第一次分配:

样本 μ1=2\mu_1=2 的距离 μ2=10\mu_2=10 的距离
1 1 9 1
2 0 8 1
3 1 7 1
10 8 0 2
11 9 1 2
12 10 2 2

于是:

C1={1,2,3},C2={10,11,12}C_1=\{1,2,3\},\qquad C_2=\{10,11,12\}

更新中心:

μ1=1+2+33=2,μ2=10+11+123=11\mu_1=\frac{1+2+3}{3}=2,\qquad \mu_2=\frac{10+11+12}{3}=11

再次分配后簇不变,算法收敛。最终目标值为:

J=(12)2+(22)2+(32)2+(1011)2+(1111)2+(1211)2=4J=(1-2)^2+(2-2)^2+(3-2)^2+ (10-11)^2+(11-11)^2+(12-11)^2=4

但若要求 k=3k=3,可能得到 {1,2,3}\{1,2,3\}{10,11}\{10,11\}{12}\{12\}。这并不自动意味着“更真实”:孤立的小簇可能是业务群体,也可能只是把一个正常群体错误切开。

2.3 K-Means 的假设与反例

K-Means 隐含了几个重要假设:

  • 使用欧氏距离衡量相似度;
  • 簇中心可以用均值代表;
  • 簇大致是凸的、近似球形;
  • 不同簇的尺度和密度不能差异过大;
  • 每个样本必须被分到某个簇。

下面的数据是典型反例:两个同心圆。外圆和内圆在几何上是两个自然群体,但一个直线分界无法把它们分开。K-Means 会倾向于按左右或上下切分,而不是按圆环切分。

对于非球形簇,DBSCAN 的思路不同:如果一个点周围在半径 ε\varepsilon 内至少有 min_samples 个点,就把它视为核心点;核心点的密度可达区域形成簇,稀疏点可以标记为噪声。它不要求预先指定簇数,能够发现非凸形状,但对 ε\varepsilonmin_samples、特征尺度和不同密度簇非常敏感。

层次聚类则通过逐步合并或拆分构造树状结构。不同 linkage 定义了簇间距离:

  • single linkage:两簇最近点距离,容易出现“链式效应”;
  • complete linkage:两簇最远点距离,倾向紧凑簇;
  • average linkage:平均点对距离;
  • Ward linkage:合并后簇内平方误差增加量,和欧氏空间中的方差最小化有关。

高斯混合模型把数据视为多个概率分布的混合:

p(x)=j=1kπjN(xμj,Σj)p(x)=\sum_{j=1}^{k}\pi_j\mathcal{N}(x\mid\mu_j,\Sigma_j)

其中 πj0\pi_j\geq 0jπj=1\sum_j\pi_j=1。它输出的是样本属于各成分的概率,而不是强制性的硬标签。期望最大化算法交替计算责任度和更新参数,因此仍可能受初始化、协方差退化和成分数量影响。

2.4 聚类数不是一个纯数学事实

kk 未知时,常见的内部指标包括:

簇内平方和:

SSE(k)=jxiCjxiμj2\mathrm{SSE}(k)=\sum_j\sum_{x_i\in C_j}\|x_i-\mu_j\|^2

kk 增大时 SSE 必然不增加,极端情况下 k=nk=n 时 SSE 为零。因此“选择 SSE 最小的 kk”必然过拟合。肘部法只是观察收益递减的拐点,不是定理。

轮廓系数:

对样本 ii,令:

  • a(i)a(i):它与同簇其他样本的平均距离;
  • b(i)b(i):它与最近其他簇样本的平均距离。

则:

s(i)=b(i)a(i)max(a(i),b(i))s(i)=\frac{b(i)-a(i)}{\max(a(i),b(i))}

s(i)s(i) 越接近 1,表示样本更接近本簇而远离其他簇;接近 0 表示边界样本;小于 0 表示可能分错簇。

轮廓系数仍依赖距离和簇形状。对于同心圆,几何上合理的聚类可能并不获得理想的欧氏轮廓结果。

真正的簇数还应由用途决定:如果簇用于运营分层,需要可解释、可行动;如果用于压缩或初始化,可能更关心重构误差;如果用于用户画像,则必须防止把地区、设备或权限等混杂因素误当成用户偏好。


三、降维:保留什么信息,而不是简单“减少列数”

降维把:

xRdx\in\mathbb{R}^d

映射为:

z=f(x)Rr,r<dz=f(x)\in\mathbb{R}^r,\qquad r<d

但“信息”没有唯一含义。它可能指:

  • 总方差;
  • 线性重构能力;
  • 局部邻域;
  • 全局距离;
  • 分类或检索任务的有效信息;
  • 生成模型所需的潜在因素。

因此,降维方法的优劣不能脱离保留目标。

3.1 PCA 的形式化目标和推导

假设数据已经中心化:

i=1nxi=0\sum_{i=1}^{n}x_i=0

寻找单位方向 ww,使投影方差最大:

maxw2=11ni(wxi)2\max_{\|w\|_2=1}\frac{1}{n}\sum_i(w^\top x_i)^2

令协方差矩阵为:

S=1nixixiS=\frac{1}{n}\sum_i x_ix_i^\top

则:

1ni(wxi)2=wSw\frac{1}{n}\sum_i(w^\top x_i)^2 =w^\top S w

问题变为:

maxw2=1wSw\max_{\|w\|_2=1}w^\top S w

构造拉格朗日函数:

L(w,λ)=wSwλ(ww1)\mathcal{L}(w,\lambda)=w^\top S w-\lambda(w^\top w-1)

ww 求导:

2Sw2λw=02Sw-2\lambda w=0

因此:

Sw=λwSw=\lambda w

最优方向是协方差矩阵最大特征值对应的特征向量。后续主成分要求与前一个方向正交,并依次取得剩余最大方差。

PCA 也可以从线性重构角度推导:在所有 rr 维线性子空间中,选择使样本到该子空间的平方距离之和最小的子空间,得到的仍是前 rr 个主成分。这解释了 PCA 的核心边界:它保留的是全局线性方差,不保证保留分类边界、非线性流形或语义结构。

二维算例

考虑中心化后的四个点:

(2,0),(1,0),(1,0),(2,0)(-2,0),\quad(-1,0),\quad(1,0),\quad(2,0)

协方差矩阵为:

S=[2.5000]S= \begin{bmatrix} 2.5&0\\ 0&0 \end{bmatrix}

第一主成分是 w1=(1,0)w_1=(1,0),特征值为 2.52.5;第二主成分是 w2=(0,1)w_2=(0,1),特征值为 0。降为一维后,投影结果为:

2,1,1,2-2,-1,1,2

由于所有点本来就在 xx 轴上,重构误差为 0。

但考虑两条弯曲的“月牙”数据。它们可能在二维空间中具有清晰的类别结构,却不一定能沿某个单一线性方向分离。PCA 可能只保留总体方差最大的方向,导致两个类别重叠。这不是 PCA 实现错误,而是“最大方差”等价于“最有用信息”的假设失败。

3.2 标准化、SVD 和数据泄漏

实际使用 PCA 前常见流程是:

  1. 用训练数据计算均值和标准差;
  2. 用这些统计量标准化训练数据;
  3. 在标准化数据上拟合 PCA;
  4. 用相同统计量变换验证集和线上数据。

不能先把训练集和验证集拼起来计算均值、标准差或主成分。否则验证集的信息进入了表示学习过程,形成无监督数据泄漏。虽然没有使用标签,仍然泄漏了验证分布。

PCA 通常通过奇异值分解(SVD)实现。若中心化数据矩阵为 XX,则:

X=UΣVX=U\Sigma V^\top

右奇异向量对应主方向,奇异值平方与各方向解释的方差相关。工程上可以选择增量 PCA 处理无法一次放入内存的数据,但增量更新得到的结果依赖批次和数值实现,不能简单视为任意数据流下的精确批处理 PCA。

3.3 非线性降维:可视化不等于表示

t-SNE 通过高维和低维空间中的邻域概率分布构造差异目标,重点保持局部邻域。它适合探索可视化,但其二维坐标:

  • 坐标轴通常没有直接语义;
  • 簇间距离不一定有全局意义;
  • 不同随机种子、困惑度和学习率可能产生不同布局;
  • 不适合直接解释簇大小、密度和全局距离;
  • 通常不应把二维图直接作为生产检索或分类特征。

UMAP 也强调局部邻域,并通过图结构和低维优化生成嵌入。它同样受参数、随机性和数据预处理影响。二者都可以帮助发现数据问题,却不能单凭“图上看起来分成几团”证明真实业务群体存在。

自编码器使用编码器和解码器:

z=fθ(x),x^=gϕ(z)z=f_\theta(x),\qquad \hat{x}=g_\phi(z)

优化:

minθ,ϕiL(xi,gϕ(fθ(xi)))\min_{\theta,\phi}\sum_i\mathcal{L}(x_i,g_\phi(f_\theta(x_i)))

当瓶颈维度较低或加入正则时,模型被迫学习压缩表示。但高容量自编码器可能学到接近恒等映射,重构很好却没有有用的低维结构。变分自编码器进一步约束潜变量分布并优化证据下界,但其潜变量的语义可解释性并不会自动出现。


四、表示学习:向量空间如何成为下游接口

表示学习的目标是学习一个映射:

z=fθ(x)z=f_\theta(x)

使 zz 比原始输入更适合某个下游任务。这里的“更适合”必须通过目标定义:重构、相似性、预测、对比、生成或检索。

4.1 表示空间中的相似度

常见相似度包括:

欧氏距离:

d(x,y)=xy2d(x,y)=\|x-y\|_2

适合向量尺度和方向都具有意义的场景。

余弦相似度:

cos(x,y)=xyx2y2\cos(x,y)=\frac{x^\top y}{\|x\|_2\|y\|_2}

只关注方向,不关注向量长度。文本 Embedding 检索中常见余弦相似度或等价的归一化点积,但是否合适取决于 Embedding 模型的训练目标。

点积:

s(x,y)=xys(x,y)=x^\top y

同时受方向和向量范数影响。若模型通过点积训练,强行归一化可能改变排序行为。

因此,不能因为两个向量都是“Embedding”就随意混合模型、维度、归一化方式或距离函数。不同模型的向量空间通常没有可比的坐标语义。

4.2 Tokenization 与 Embedding 的联系

文本表示通常经过:

文本TokenizationToken ID上下文编码池化Embedding\text{文本} \rightarrow \text{Tokenization} \rightarrow \text{Token ID} \rightarrow \text{上下文编码} \rightarrow \text{池化} \rightarrow \text{Embedding}

Tokenization 把字符串映射为 token 序列。子词词表可以处理未登录词和复杂词形,但会产生长度差异。Transformer 中,每个 token 的上下文表示还依赖位置编码和注意力机制。若需要句子或文档级向量,就必须定义池化方式,例如:

  • 使用特殊位置的表示;
  • 对 token 表示做平均池化;
  • 进行加权池化;
  • 使用专门训练的句向量头。

平均池化不等于天然保留语义。一个 Embedding 模型是否适合语义检索、聚类、分类或异常检测,应通过对应任务验证。

4.3 对比学习为什么能形成结构

对比学习通常构造正样本对 (xi,xi+)(x_i,x_i^+) 和负样本。以 InfoNCE 为例:

Li=logexp(sim(zi,zi+)/τ)jexp(sim(zi,zj)/τ)\mathcal{L}_i = -\log \frac{\exp(\mathrm{sim}(z_i,z_i^+)/\tau)} {\sum_{j}\exp(\mathrm{sim}(z_i,z_j)/\tau)}

其中:

  • zi=fθ(xi)z_i=f_\theta(x_i)
  • sim\mathrm{sim} 是相似度;
  • τ\tau 是温度参数;
  • 分母包含候选正负样本。

最小化该损失会提高正对相似度相对于其他样本的相对优势。但结果取决于正负样本构造。如果把同一用户的不同语言、不同设备样本设为正对,模型会压低设备差异;如果把真正相似但来自不同类别的样本当负对,模型会人为拉开本应接近的样本。

生成式 AI 中,Embedding 常用于语义检索、RAG、重复内容检测、聚类和路由。生成模型的潜空间也可以用于编辑、采样和异常分析,但“潜空间距离近”不必然等价于“业务语义相近”。生成模型可能把风格、语言、长度或训练语料来源编码进向量,形成与业务目标无关的捷径。


五、异常检测:异常是相对于什么参考分布

异常检测不是识别“绝对错误”,而是估计样本偏离参考数据分布的程度。

设正常数据分布为 pnormal(x)p_{\text{normal}}(x)。一种直觉定义是:

x 异常pnormal(x)<τx\text{ 异常}\quad\Longleftrightarrow\quad p_{\text{normal}}(x)<\tau

但真实系统通常只能用训练数据估计分数 s(x)s(x),再选择阈值:

flag(x)=1[s(x)>τ]\text{flag}(x)=\mathbb{1}[s(x)>\tau]

阈值 τ\tau 不是算法自动发现的真理,而是由误报成本、漏报成本、审核能力和处置动作共同决定。

5.1 距离与密度方法

均值距离适合近似球形分布。若正常数据均值为 μ\mu,协方差为 Σ\Sigma,马氏距离为:

DM(x)=(xμ)Σ1(xμ)D_M(x)=\sqrt{(x-\mu)^\top\Sigma^{-1}(x-\mu)}

它会根据各方向的方差和相关性调整距离。沿高方差方向偏离较远,可能仍正常;沿低方差方向的小偏离,可能更异常。

例如:

μ=(0,0),Σ=[100100]\mu=(0,0),\qquad \Sigma= \begin{bmatrix} 1&0\\ 0&100 \end{bmatrix}

x=(3,0)x=(3,0) 的马氏距离平方为 99,而 x=(0,30)x=(0,30) 的马氏距离平方为 99。虽然欧氏距离分别是 3 和 30,考虑分布尺度后它们同样偏离三个标准差。

局部离群因子(LOF)比较样本与其邻居的局部密度。它能处理不同区域密度不同的情况,但 n_neighbors、距离度量和边界样本会显著影响结果。孤立森林通过随机特征和切分构造树:容易被快速隔离的点通常被视为异常。它不直接估计概率,适合高维表格数据的一类探索性检测,但异常比例参数、随机性和特征质量仍需校准。

5.2 重构型异常检测

如果模型主要在正常数据上训练,可以用重构误差:

s(x)=xgϕ(fθ(x))2s(x)=\|x-g_\phi(f_\theta(x))\|^2

作为异常分数。异常样本若无法被正常模式重构,分数可能较高。

但这不是必然成立。高容量自编码器可能同样重构异常;如果训练集混入大量异常,模型会把异常学成正常;如果异常只体现在某个未被损失充分加权的字段,分数也可能不高。

5.3 训练污染和异常比例

假设数据由:

P=(1ϵ)Pnormal+ϵPanomalyP=(1-\epsilon)P_{\text{normal}}+\epsilon P_{\text{anomaly}}

组成。很多无监督异常检测方法默认 ϵ\epsilon 很小。若异常占比上升,均值、协方差、密度和重构模型都会被污染。

因此,异常检测的关键问题不是“哪个算法最强”,而是:

  1. 训练数据是否主要由正常样本构成;
  2. 异常是否是点异常、上下文异常还是群体异常;
  3. 数据是否存在时间季节性和用户分层;
  4. 阈值是否按群体和时间段校准;
  5. 发现异常后是否有可执行的处置路径。

例如,凌晨 3 点登录可能对普通用户异常,但对运维账号并不异常;单个用户每天大量请求可能正常,但一批账号同时产生相同模式,可能是群体异常。全局分数无法自动替代上下文建模。


六、四类任务的边界并不相同

聚类、降维、异常检测和表示学习经常组合使用,但它们的输出语义不同。

任务 输出 主要目标 典型失败
聚类 簇编号或簇概率 发现群组 把尺度、密度或时间趋势误当群组
降维 低维坐标 压缩、可视化或保留某类结构 视觉分离被误解为真实语义
异常检测 异常分数或标记 排序偏离参考分布的样本 正常少数群体被误报
表示学习 向量 为检索、预测、生成或分析提供接口 向量相似度与业务相似度不一致

可以先用 Embedding 表示文本,再用聚类发现主题;也可以在 Embedding 空间做异常检测。但这会继承 Embedding 的偏差。若表示空间压低了语言差异,却保留了作者风格,那么聚类结果可能主要按作者分组,而不是按主题分组。

降维也可以用于异常检测的可视化,但不应默认先降到二维再检测。投影可能丢失异常所在的方向。若必须降维后检测,应比较原空间和降维空间的排名稳定性,并检查被丢弃主成分中的异常信号。


七、评估边界:没有标签时如何知道结果是否正确

7.1 内部评估不等于真实性

无标签时常见内部指标包括:

  • 轮廓系数;
  • Calinski–Harabasz 指数;
  • Davies–Bouldin 指数;
  • 聚类目标函数;
  • PCA 的解释方差比;
  • 重构误差;
  • 邻域保持率;
  • 异常分数分布和稳定性。

这些指标只能判断结果是否符合某种数学结构。例如,K-Means 的 SSE 低,说明簇内平方距离低;不说明这些簇就是业务上真实存在的群体。

解释方差比为:

EVR(r)=j=1rλjj=1dλj\mathrm{EVR}(r) = \frac{\sum_{j=1}^{r}\lambda_j} {\sum_{j=1}^{d}\lambda_j}

其中 λj\lambda_j 是按降序排列的特征值。EVR 高说明线性方差保留得多,但低方差方向可能包含稀有类别、风险信号或小群体信息。因此“保留 95% 方差”不等于“保留 95% 业务信息”。

7.2 稳定性评估

无监督结果必须检查对扰动是否稳定。可进行:

  • 不同随机种子重复训练;
  • bootstrap 重采样;
  • 时间窗口切分;
  • 特征子集扰动;
  • 样本轻微噪声扰动;
  • 不同初始化和超参数比较。

聚类标签编号本身没有意义。比较两次聚类时,不能直接计算标签相等比例,因为第一次的簇 1 可能对应第二次的簇 3。应使用调整兰德指数、归一化互信息,或先用匈牙利算法匹配簇编号。

稳定性也不等于正确性。一个由国家编码主导的错误聚类可能非常稳定。它需要结合特征贡献、分群画像和业务审查。

7.3 有限标签和下游验证

无监督系统可以使用少量人工标注进行外部验证,而不必把任务改造成完全监督学习。例如:

  • 从每个簇抽样审核代表样本和边界样本;
  • 对异常分数最高、随机样本和低分样本分别抽样;
  • 检查检索 Top-K 中是否语义相关;
  • 使用后续分类、推荐、去重或人工审核效率作为下游指标。

对异常检测,准确率通常不适合极度不平衡场景。若人工审核预算有限,应关注 Precision@K、Recall@K、审核命中率和不同群体的误报率。ROC-AUC 在异常极少时可能看起来不错,但并不代表前几十个结果可用;PR-AUC 通常更接近稀有事件筛选目标,但仍不能替代实际审核成本。

7.4 评估数据不能被无监督流程污染

即使没有标签,也要防止评估污染:

  • 不要用全量数据拟合标准化、PCA、词表或 Embedding 后再报告测试结果;
  • 不要根据测试集可视化反复调整参数;
  • 不要把人工审核过的异常样本重新放入训练集却仍称为独立测试;
  • 时间变化明显时,应使用按时间切分而非随机切分;
  • 用户、设备或文档存在重复时,应按实体分组切分。

如果线上数据分布不断变化,单次离线评估不足以证明长期有效。需要持续监控输入分布、向量分布、簇大小、异常率、人工命中率和处置结果。


八、一个可运行的 scikit-learn 端到端示例

下面的例子生成二维数据,先标准化,再使用 K-Means 聚类和 PCA 降维,并计算轮廓系数。它用于展示生命周期,不代表生产数据的真实分布。

import numpy as np
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score

# 1. 生成数据:三个近似球形的群体
X, _ = make_blobs(
    n_samples=600,
    centers=[(-4, -2), (0, 4), (5, -1)],
    cluster_std=[0.8, 1.0, 0.7],
    random_state=42,
)

# 2. 将预处理和聚类放进同一 Pipeline
cluster_pipeline = Pipeline([
    ("scale", StandardScaler()),
    ("cluster", KMeans(
        n_clusters=3,
        n_init=10,
        random_state=42
    )),
])

labels = cluster_pipeline.fit_predict(X)

# 3. silhouette_score 需要使用与模型一致的特征空间
X_scaled = cluster_pipeline.named_steps["scale"].transform(X)
score = silhouette_score(X_scaled, labels)

print("样本数:", len(X))
print("簇大小:", np.bincount(labels))
print("轮廓系数:", round(score, 3))

# 4. 在同一标准化空间中做 PCA,得到二维坐标
pca = PCA(n_components=2, random_state=42)
X_2d = pca.fit_transform(X_scaled)

print("降维后形状:", X_2d.shape)
print("解释方差比:", np.round(pca.explained_variance_ratio_, 3))

运行时通常会看到三个簇的样本数量大致接近,轮廓系数为正且较高,解释方差比之和为 1,因为原始数据本来就是二维且被降到二维。这里有几个容易忽略的因果关系:

  1. StandardScaler 只在 fit 阶段从输入数据计算均值和标准差;
  2. transform 使用已保存的统计量,保证训练和推理坐标一致;
  3. KMeansn_clusters=3 是人为给定的假设,不是由算法证明的;
  4. 轮廓系数使用标准化空间计算,否则评估距离与训练距离不一致;
  5. n_init 通过多次初始化选择较好结果,不能消除 K-Means 的模型假设;
  6. PCA 这里只用于表示和检查,不应据此断言数据存在三个真实语义群体。

生产代码还需要持久化整个 Pipeline,而不是只保存 K-Means。否则线上忘记执行相同标准化,距离和簇分配会发生系统性偏移。


九、生产系统中的数据流、状态和故障路径

无监督模型通常不是一次性脚本,而是一个持续运行的状态系统:

flowchart LR
    A[原始数据] --> B[权限过滤与脱敏]
    B --> C[特征/Tokenization/Embedding]
    C --> D[训练数据快照]
    D --> E[拟合模型与阈值]
    E --> F[版本化注册]
    F --> G[线上推理]
    G --> H[聚类/降维/异常结果]
    H --> I[检索、审核或业务动作]
    I --> J[人工反馈与结果记录]
    J --> K[离线评估、漂移监控]
    K --> D

关键状态包括:

  • 数据快照:明确采样时间、字段版本和权限范围;
  • 预处理状态:标准化均值方差、词表、Embedding 模型版本;
  • 模型状态:聚类中心、PCA 主方向、异常阈值;
  • 结果状态:样本 ID、模型版本、分数、解释字段和处置状态;
  • 反馈状态:人工确认、申诉、误报原因和后续标签。

常见故障并非模型抛出异常,而是状态不一致:

  • 训练使用旧版本 Embedding,线上使用新版本;
  • 训练时标准化,线上漏掉标准化;
  • PCA 维度改变,但向量数据库索引仍是旧维度;
  • 聚类中心更新后,历史簇编号被错误地当成同一业务群体;
  • 阈值按全局流量设定,却在某个小租户上产生大量误报;
  • 训练数据包含用户无权访问的内容,导致模型或索引泄露信息;
  • 异常告警没有幂等键,重试造成重复工单;
  • 并发更新模型和索引,出现“模型版本已切换、索引尚未构建完成”的半发布状态。

模型发布应至少具备版本绑定、原子切换和回滚能力。Embedding 版本发生变化时,通常应重建对应索引或明确禁止新旧向量混用;仅比较维度相同不能证明两个空间兼容。

权限不能只在原始数据导入时检查。检索、聚类画像、异常详情和人工审核页面都可能暴露敏感信息。应记录谁在什么时间、以什么模型版本访问了哪些结果,并对输出字段实施最小权限控制。脱敏后的数据仍可能通过唯一文本、稀有组合或向量近邻泄露信息。

成本也属于模型设计边界。成本来源包括:

  • 高维 Embedding 的计算和存储;
  • 全量重嵌入与索引重建;
  • O(n2)O(n^2) 距离矩阵和相似度计算;
  • 频繁重训与多随机种子实验;
  • 人工审核异常和簇样本的成本;
  • 低延迟线上推理与副本资源。

例如全量计算 nn 个向量的两两相似度需要约 n2n^2 级别的比较,数据增大一倍,比较量约增大四倍。大规模检索通常采用近似最近邻索引、分片、批量计算和增量更新,但这些方案会引入召回率、索引新鲜度和运维复杂度的取舍。


十、常见误解与诊断方法

误解一:无监督模型不需要人工参与

没有标签只意味着目标标签未直接提供。选择特征、相似度、簇数、异常比例和处置阈值仍需要领域知识。诊断时应问:模型发现的是用户真正关心的结构,还是数据采集过程、设备类型、时间段和权限边界?

误解二:二维图上分成几团,就证明存在几个群体

t-SNE、UMAP 和 PCA 图是投影结果。应同时检查原空间距离、参数扰动、随机种子、簇内代表样本和边界样本。若只有某一种二维设置出现分离,不能把图形当作证据。

误解三:异常分数高就等于恶意或错误

异常检测输出的是相对于参考分布的偏离。新用户、少数地区、节假日流量、刚上线的产品都可能被判高分。处置应分级:排序、采样审核、限流或阻断分别需要不同证据强度。

误解四:聚类标签具有跨版本身份

K-Means 的簇编号只是数组索引。模型重训后,即使业务群体相似,簇 0 也不一定仍代表原来的群体。需要通过中心相似度、样本重叠、画像特征和版本映射建立连续性;无法建立时,应把它视为新版本分群。

误解五:高解释方差意味着下游任务一定更好

PCA 优先保留总体方差。少数但重要的信号可能位于低方差方向。应直接评估降维表示在检索、分类、聚类稳定性或异常排序上的表现,而不是只设置一个方差阈值。

误解六:高维空间中的距离仍然直观

在高维空间中,距离可能出现集中现象:最近点和最远点的距离相对差异缩小,噪声特征会稀释有效方向。应检查特征尺度、冗余、缺失处理、距离分布和降维前后邻域保持情况。对文本向量,应验证归一化、模型版本和语料领域是否匹配。


十一、如何选择方法

可以按数据结构和输出用途选择,而不是按算法流行度选择:

  • 近似球形、尺度相近、需要快速分组:K-Means;
  • 需要软分配和概率解释,且近似高斯混合合理:高斯混合模型;
  • 簇形状非凸、存在噪声、密度相对稳定:DBSCAN;
  • 需要多层次分组结构:层次聚类;
  • 需要线性压缩、去冗余或快速预处理:PCA;
  • 需要二维探索邻域:t-SNE 或 UMAP,但不把可视化直接当作业务表示;
  • 已有强大的预训练模型,任务是语义检索或内容相似性:使用经过目标领域验证的 Embedding;
  • 正常样本占主导且需要异常排序:孤立森林、局部密度方法或重构模型;
  • 数据具有时间、用户、地区等上下文:优先建立条件基线,而不是只使用一个全局阈值。

这些方法也可以组合。例如:

文本Embedding标准化或归一化聚类\text{文本} \rightarrow \text{Embedding} \rightarrow \text{标准化或归一化} \rightarrow \text{聚类}

但每一步都会改变后续语义。先 PCA 再聚类可能降低噪声和计算成本,也可能丢掉小群体信号;先聚类再对每簇训练异常检测器,可能减少群体差异造成的误报,也可能把真正的群体级异常分散掉。


十二、最终的评估边界

无监督学习的结果至少应回答四个不同问题:

  1. 数学问题:目标函数是否被有效优化,结果是否数值稳定?
  2. 结构问题:发现的邻域、簇或低维结构是否对采样、参数和时间扰动稳定?
  3. 业务问题:结果是否对应可解释、可行动且有价值的群体或异常?
  4. 系统问题:数据权限、模型版本、索引、延迟、成本和故障恢复是否可控?

只回答第一个问题,容易得到“优化成功但业务无用”的模型;只回答第三个问题,容易把偶然样本或人工直觉误认为稳定规律;忽略第四个问题,则可能把正确模型部署成数据泄露、版本错配或告警失控的生产事故。

聚类不是发现天然类别,降维不是保留所有信息,异常不是事实判决,表示不是通用语义坐标,评估分数也不是正确性的替代品。无监督学习真正的工程边界,是明确参考分布、相似度、保留目标、阈值成本和证据来源,并让这些假设在数据、模型、权限和运行状态中保持一致。


系列导航与关联阅读

官方资料

本文依据研究论文、标准组织与主流框架官方文档重新梳理;正文、示例与工程清单由 WR BLOG 编写。