§ 4.2 · Section

无监督学习

Unsupervised Learning

监督学习需要"老师标答案"。但现实中90% 的数据根本没有答案——一堆用户行为日志、一堆图片、一堆网页。无监督学习做的事:不给答案,让机器自己找出"这里面有什么规律"

先把术语翻译成人话

无监督学习的术语听着玄,一堆"聚类、降维、流形",说白了都是超市理货员和图书馆管理员天天在干的活儿。先摆一张对照表。

术语换成大白话生活里对应什么
无监督学习(Unsupervised Learning)没人告诉你怎么分,你自己看着东西把它归成几堆超市新到一车杂货,自己决定分几个区上货架
聚类(Clustering)把长得像的凑一堆,堆和堆之间尽量不像洗衣前把深色、浅色、羊毛衫分成三摊
簇(Cluster)凑出来的其中一堆图书馆里的一个书架区,比如"历史类"
降维(Dimensionality Reduction)指标太多看不过来,压成两三个关键指标体检二十项,医生只看三项就下结论
异常检测(Anomaly Detection)先摸清"正常长啥样",偏离太多就报警银行发现你的卡半夜在国外刷了一笔
K(簇数)你打算分成几堆——得自己拍这个数装修时决定衣柜隔成几格
距离 / 相似度两个东西"像不像"的量化打分两件衣服是不是该放同一个抽屉
轮廓系数(Silhouette)这堆分得干不干净的自评分货架分区后回头看看有没有串货
关联规则(Association Rule)买了 A 的人是不是也爱买 B超市把啤酒和花生米摆在一块儿
生活场景
🧺 妈妈让你整理衣柜

你妈把一堆衣服扔给你:"分个类。" 她没说怎么分。
你看着这堆衣服,凭直觉把它们分成——
① 夏装一堆:短袖、短裤、背心
② 冬装一堆:羽绒服、毛衣
③ 内衣一堆:袜子、内裤
④ 配饰一堆:围巾、帽子
没有人告诉你"该按季节分"——但衣服本身的特征让你自己找出了"分组"。这就是无监督学习做的事。

和监督学习的对比

一句话先垫底:监督学习好比做带答案的作业,无监督学习好比让你去一个陌生仓库把货理顺——没人给你分类标准,你得自己看着东西琢磨该分几个区。

监督学习无监督学习
输入数据 + 标准答案只有数据
目标学"输入→输出"映射发现数据中的"结构"
典型任务分类、回归聚类、降维、异常检测
评价准确率(跟标准答案对)较难量化(看结果合不合理)

这张对比表最值钱的一行是最后一行——"评价:较难量化"。它看起来只是一句技术描述,实际上决定了无监督学习在工业界的全部命运。监督学习有一条铁律:"上线前先看测试集 AUC",团队之间可以拿数字吵架、拿数字决策。无监督学习没有这条铁律:你把用户聚成 5 群还是 8 群,谁也拿不出一个客观数字说哪个对。于是它的成败最终落到"业务方能不能看懂这几个群、能不能据此改动作"上,这是一件社会性的事,不是技术性的事。

再补一个常被混淆的概念:无监督学习不是"没有目标函数",它同样在优化一个明确的数学量。K-Means 在最小化"每个点到自己簇中心的距离平方和",PCA 在最大化"投影后保留的方差",自编码器在最小化"重建误差"。区别只在于:这个目标函数里没有 y。它衡量的是"结构描述得好不好",而不是"答案猜得对不对"。理解这一点,你就明白为什么无监督学习会给出"数学上完美但业务上荒谬"的结果——它优化的东西和你想要的东西之间,本来就没有硬绑定。

无监督学习的三大任务

三个任务名都挺唬人,但它们干的活儿其实就是超市里三个岗位:聚类是理货员——把同类商品归到一个货架区;降维是做报表的——三百个 SKU 的销量压成"生鲜/日百/酒水"三个数字给店长看;异常检测是防损员——盯着哪笔账、哪个人不太对劲。

01

聚类 · Clustering

把相似的东西自动分组——比如把 10 万用户按消费习惯分成 5 类,对每类做不同营销。
常用算法:K-Means、DBSCAN、层次聚类。

02

降维 · Dimensionality Reduction

把"太多特征"压缩成"少数核心特征"——比如把 1000 个商品特征压成 3 个,方便可视化。
常用算法:PCA、t-SNE、UMAP。

03

异常检测 · Anomaly Detection

找出"跟正常不一样"的样本——比如信用卡盗刷、机器故障、网络入侵。
常用算法:Isolation Forest、Autoencoder。

聚类详解 · 怎么"自动分组"

拿最经典的 K-Means 举例,看它怎么把一堆用户分成 K 组:

1. 你指定 K = 3

"我想把这些用户分成 3 类。"K-Means 先在数据里随机选 3 个"中心点"。

2. 每个用户归属最近的中心

每个用户(由消费金额、频次、品类等特征组成的"向量")找到离自己最近的中心,归到那一组。

3. 重新计算中心

每组用户的平均值成为新的中心。回到第 2 步。

4. 收敛

重复若干次,中心不再变化——分好了。

Analogy · 自由分组

体育老师让全班 30 人"按体型自由分成 3 组"。
一开始大家乱站。老师让每组选个"组长",然后每个人"看哪个组长跟自己最像"——重新归到那一组。
然后再换"新组长"(最能代表这一组的人)。几轮下来,自动分成了"高瘦组 / 中等组 / 矮胖组"——这就是 K-Means。

Analogy · 超市理货员的一天

想象一下你是新来的超市理货员。店长扔给你一车间刚到的杂货,只说一句:"分区上货架,分几个区你自己定。"没有分类手册,没有标准答案——这就是无监督学习的全部处境。

你会怎么干?先在店里划出 5 个空区(相当于定 K=5),随手往每个区扔一样"代表货";然后一件件拿起商品,看它跟哪个区的代表最像就放过去;一轮放完,你回头看每个区实际堆的是什么,重新挑一件更能代表这个区的当"新代表"(这就是重算簇中心);再来一轮,直到没人需要挪窝——这就是 K-Means,一字不差。

顺着这个场景,三个坑也全都能看见:
① 你只能划出方方正正的区,可要是有一批"既是零食又是酒水的礼盒"横跨两个区呢?——K-Means 只会画规整的块,处理不了怪形状
② 第一次随手扔的"代表货"要是全扔在生鲜区,分区结果就歪了——初始中心敏感
③ 店里 90% 是日用百货、只有 20 瓶进口红酒,你为了"每区差不多大"会忍不住把日百硬切两半,反而把红酒塞进哪儿都不合适的角落——大簇小簇不均时最容易漏掉小而贵的那一撮
换成大白话:K-Means 是个手脚很快但没什么脑子的理货员,你得替它把货看一眼、把区数拍准。

K-Means 的三个致命弱点

K-Means 的原型算法 1957 年就由贝尔实验室的 Stuart Lloyd 提出了(当时用于脉冲编码调制),1967 年 MacQueen 给了它今天这个名字。它至今仍是全世界用得最多的聚类算法,原因简单:快、好懂、容易实现。但它有三个必须提前知道的弱点,不然一定踩坑。

弱点一:它只会画"圆形"的簇。K-Means 的判定标准是"离哪个中心近就归哪一组",几何上这意味着簇的边界一定是直线(垂直平分线),簇的形状一定是凸的、大致球形的。所以如果你的数据长成两个同心圆环、或者两条弯曲的月牙形,K-Means 会给出一个数学上无可指摘、直觉上荒谬到底的划分——它会把每个月牙切成两半,再把两个月牙各一半凑成一组。数据的真实形状不是球形时,K-Means 无救。

弱点二:它对初始中心和离群点都很敏感。初始中心随机选,选得不好会收敛到很差的局部最优;跑两次得到不同结果是常态。缓解办法是 2007 年提出的 K-Means++ 初始化——第一个中心随机选,后续中心以"离已有中心越远概率越大"的方式选,让初始中心尽量分散。今天所有主流库的默认设置都是它。至于离群点,因为簇中心是平均值,一个极端离群点就能把整个中心拽偏;如果换成中位数思想的 K-Medoids 就稳健得多,代价是慢很多。

弱点三:它假设每个簇的大小和密度差不多。如果真实数据是"一个 9000 人的大群 + 一个 100 人的小群",K-Means 倾向于把那个大群硬切成两半,而不是把小群单独拎出来——因为切大群能更多地降低总距离平方和。这在用户分群里非常要命:你最想找的那批高价值小众用户,恰恰是 K-Means 最容易忽略的。

算法要不要预设簇数能处理什么形状对噪声复杂度最适合
K-Means要(K)只能球形/凸形敏感O(n·K·d·iter) 很快大规模、簇形规整、要速度
DBSCAN不要(要 eps 和 minPts)任意形状自动识别为噪声O(n log n)(带索引)形状不规则、有离群点
层次聚类不要(事后剪树)较灵活(看链接方式)较敏感O(n²)~O(n³) 很慢小数据、需要树状谱系
高斯混合 GMM要(成分数)椭圆形(可拉伸)敏感中等要"软归属"概率的场景
谱聚类任意形状(图切割)中等O(n³) 很慢中小数据、非凸结构
HDBSCAN不要任意形状 + 变密度很稳健较高密度差异大的真实数据

DBSCAN 与层次聚类:另外两种世界观

两个名字先翻译一下:DBSCAN(Density-Based Spatial Clustering of Applications with Noise,基于密度的带噪声空间聚类——哪儿人挤就算一堆,落单的直接判成杂物)层次聚类(Hierarchical Clustering,一层层往上合并,最后得到一棵家族树)打个比方:DBSCAN 干的活儿好比地铁站里凭"哪块人挤成团"来判断哪几拨人是一起的,站台边上零星几个人就算路人;层次聚类好比图书馆的分类号,先分大类再分小类,你想要几层就在哪一层停。

DBSCAN(1996 年由 Ester、Kriegel 等人提出,2014 年获得 KDD 时间检验奖)换了一个完全不同的思路:不问"离哪个中心近",而问"周围挤不挤"。它只有两个参数——半径 eps 和最小点数 minPts,然后把所有点分成三类:

核心点 core   :半径 eps 内至少有 minPts 个点  → 处在稠密区域内部
边界点 border :自己不够稠密,但落在某个核心点的 eps 内 → 簇的边缘
噪声点 noise  :既不核心也不沾边  → 直接判为离群点,不归任何簇

聚类过程:
  从任一未访问的核心点出发,把它 eps 内的点全部拉进同一簇,
  再从新拉进来的核心点继续往外扩,直到扩不动为止 → 一个簇完成。
  换一个未访问核心点,重复。剩下扫不到的,全是噪声。

核心优势:簇的形状完全由数据密度决定,
         所以两条弯曲的月牙、一个 S 形的星系带,它都能正确分开。

DBSCAN 的两个杀手级特性是不需要预设簇数自带离群点识别——这两点在真实业务数据上价值极高,因为真实数据里总有一撮说不清道不明的怪样本,K-Means 会被迫把它们塞进某个簇从而污染整个簇的画像,DBSCAN 直接扣出来标成噪声。它的软肋是对 eps 极其敏感,而且假设所有簇的密度接近。如果数据里同时有一个极密的簇和一个稀疏的簇,同一个 eps 无法兼顾——这正是 2013 年之后 HDBSCAN 要解决的问题:它在不同密度层级上分别建簇,然后选出最稳定的那些。

层次聚类(Hierarchical Clustering)的世界观是"生物分类学式"的:它不给你一个划分,而给你一整棵树(树状图,dendrogram)。自底向上的凝聚式做法是:一开始每个点自成一簇,每一步合并距离最近的两簇,直到只剩一簇。你事后想分几类,就在树的相应高度横着切一刀。

这里的"两簇之间的距离"怎么算,会彻底改变结果,这是层次聚类最需要小心的地方。单链接(Single Linkage)用两簇最近两点的距离——容易产生"链式效应",把两个本该分开的簇通过一串中间点连成长条。全链接(Complete Linkage)用最远两点的距离——倾向产生紧凑的球形簇,但怕离群点。Ward 方法合并时最小化簇内方差增量,通常给出最均衡的结果,是实践中的默认首选。层次聚类的最大代价是复杂度——O(n²) 的距离矩阵在十万条数据上就要吃掉几十 GB 内存,所以它基本只用在几千条以内的数据上,或者用来对 K-Means 的结果做二次组织。

簇数怎么定:肘部法、轮廓系数和业务法则

"K 该等于几"是无监督学习里最经典的无解之问。业界有几个半客观的判据,知道它们各自的适用边界很重要。

这个问题相当于装修时问"衣柜该隔几格"。隔 2 格太笼统,隔 30 格每格塞不满还找不着东西,中间那个"刚好够用又不啰嗦"的数没有公式,只能一边看东西一边试。下面几个方法说白了都是在帮你把这个"试"做得体面一点。

肘部法(Elbow Method):横轴 K,纵轴簇内距离平方和(SSE / Inertia)。K 增大 SSE 必然下降(极端情况每个点自成一簇,SSE = 0),所以不能光看下降,要看下降速度的拐点——从某个 K 开始,再增加簇数带来的收益明显变小,曲线出现一个"肘"。它的问题是:真实数据的曲线常常平滑得根本没有肘,三个人看同一张图能读出三个不同的 K。

SSE
 │●
 │ ●
 │  ●
 │   ●        ← 肘部大约在 K=4:再加簇,收益明显变小
 │    ●●
 │      ●●●●●●●
 └────────────────── K
   1 2 3 4 5 6 7 8 9

理想曲线(有明显折点)        真实数据常见曲线(平滑无肘)
 │●                            │●
 │ ●                           │  ●
 │  ●___________               │    ●
 │                             │      ●
 └──────────────               └────────●──── 无从下手

轮廓系数(Silhouette Coefficient)比肘部法客观得多,因为它同时考虑了"簇内够不够紧"和"簇间够不够远"。对每个样本 i 算两个数:a(i) 是它到同簇其他点的平均距离,b(i) 是它到最近的其他簇所有点的平均距离,那么:

公式看着别扭,意思其实就是问每件商品一句话:"你跟自己这个货架区的邻居熟,还是跟隔壁区更熟?"跟自家人熟得多,得分接近 +1;两边差不多,得分接近 0(说明这货放哪都行);跟隔壁更熟,得分是负的(说白了就是放错架子了)。

s(i) = ( b(i) - a(i) ) / max( a(i), b(i) )

取值范围 -1 ~ +1:
  s ≈ +1   这个点离自己簇很近、离别的簇很远  → 分对了
  s ≈  0   它正好卡在两个簇的边界上         → 归属存疑
  s ≈ -1   它离别的簇反而更近               → 大概率分错了

整个聚类的轮廓系数 = 所有 s(i) 的平均值。
用法:对 K=2,3,4,...,10 分别算一遍,取平均轮廓系数最高的 K。
经验:> 0.5 结构比较清晰;0.25 ~ 0.5 结构较弱;< 0.25 基本没结构。

另外两个值得知道的判据:Calinski-Harabasz 指数(簇间离散度与簇内离散度之比,越大越好,计算极快)和 Davies-Bouldin 指数(越小越好)。还有一个思路完全不同的 Gap Statistic:把你数据的 SSE 曲线和"完全随机均匀分布的假数据"的 SSE 曲线做对比,差距最大的那个 K 说明你的数据在那里比随机结构最显著——这是最接近统计检验思维的方法。

但真正最有用的判据往往是业务法则:市场部只能同时运营 4 套差异化文案,那 K 就等于 4,不用讨论;客服团队分成 6 个技能组,那用户诉求就聚成 6 类。在无监督学习里,"可执行"经常比"数学最优"重要一个数量级。更进一步,如果 K=5 时数学指标最好,但其中两个簇的用户画像业务方看了说"这俩我分不出区别",那就该合并——聚类的产出不是一个模型,而是一份能让人据此行动的洞察。

降维:把 200 维压成 2 维还能看懂

"200 维"这个说法听着玄,换成大白话就是"一个客户身上挂了 200 个指标"。好比一份医院全项体检报告打印出来有二十页,医生不会二十页全看——他其实就是心里把它压成"心血管风险、代谢风险、感染指标"这么两三个综合判断。降维干的活儿一模一样。

降维的动机有三层。第一是对抗维度灾难——在高维空间里,所有点之间的距离会趋于相等,"最近邻"这个概念失去意义,几乎所有基于距离的算法(K-Means、KNN、DBSCAN)都会退化。第二是可视化——人只能看懂二维和三维,要把 200 个指标的客户数据画成一张图,必须先降到 2 维。第三是去噪和加速——保留主要变化方向、丢掉琐碎抖动,往往还能顺带提升下游模型的效果。

PCA(主成分分析)是 1901 年由 Karl Pearson 提出的,比机器学习这个词老了半个世纪。它的思路是纯线性的:找出数据方差最大的那个方向当第一主成分,再在与它垂直的方向里找方差第二大的当第二主成分,依此类推。因为它是线性变换,所以有三个宝贵的性质——结果确定(跑一百次都一样)、可以把新样本投影进同一空间、能反向重建回原始维度。它的局限也来自线性:如果数据的真实结构是弯曲的流形(比如卷成瑞士卷的一张纸),PCA 只会把它压扁而不是展开。

t-SNE(2008 年,van der Maaten 与 Hinton)走的是完全不同的路:它不关心保持全局距离,只关心保持局部邻居关系。做法是把高维空间里的点对距离转成概率、低维空间里也转成概率,然后最小化两个概率分布的 KL 散度。t-SNE 画出来的图漂亮得惊人,簇与簇之间界限分明,是深度学习论文里可视化特征的标准工具。但它有几个必须警惕的性质:

UMAP(2018 年,McInnes 等人)是 t-SNE 的现代替代品,基于代数拓扑和流形学习理论。它的实际优势有三条:快得多(百万级样本可跑,t-SNE 在十万级就很吃力)、全局结构保留得更好(簇间相对位置比 t-SNE 可信一些)、支持投影新样本。今天在单细胞基因组学、embedding 可视化这些领域,UMAP 已经基本取代了 t-SNE 的位置。

方法年份线性?保全局?可投影新样本?主要用途
PCA1901线性去噪、压缩、加速、做特征
t-SNE2008非线性论文里的可视化探索
UMAP2018非线性较好大规模可视化、生物信息
自编码器 AE1986 起非线性看设计深度特征压缩、异常检测

一条实操建议:PCA 用于生产管线,t-SNE / UMAP 用于人眼看图。不要把 t-SNE 降维后的两维当特征喂给下游分类器——它既不稳定也无法处理新数据。相反,PCA 保留 95% 方差后的前几十维,是一个非常靠谱的降噪特征集。

异常检测:找出"不正常"的四种思路

四条路线都能用一句人话讲完:统计法——离平均值太远就算怪,相当于看谁的身高超出全班一大截;密度法——周围一个人都没有就算怪,就像停车场里孤零零停在最远角落的那辆车;隔离法——几刀就能把它单独切出来的就算怪;重建法——照着"正常样子"复原不出来的就算怪,好比老师傅一摸就知道这块料不对。

异常检测在业务上的价值可能是无监督学习里最直接的——信用卡盗刷、服务器入侵、生产线不良品、设备故障预警,每一个都对应真金白银。它之所以常被划到无监督,是因为异常样本天生稀少且形态千奇百怪,凑不出足够的标签来做监督学习。你没法穷举"所有可能的作弊方式",但你能相对完整地描述"正常长什么样"。

主流有四条技术路线。基于统计:假设数据服从某个分布,落在 3 个标准差之外就算异常(Z-score);或者用四分位距 IQR 划界。简单、可解释、适合单变量。基于距离/密度:一个点周围特别空旷就是异常,DBSCAN 天然产出的噪声点就属于这类,LOF(局部离群因子)是更精细的版本,它比较一个点的局部密度和它邻居们的局部密度之比,因此能在密度不均的数据上工作。

基于隔离:2008 年周志华等人提出的 Isolation Forest 用了一个非常反直觉但极其有效的想法——不去建模"正常",而是直接建模"容易被孤立"。它随机选一个特征、随机选一个切分值,反复切分数据;异常点因为处在稀疏区域,平均只需要很少几刀就能被单独切出来,而正常点埋在稠密区域里需要切很多刀。用"平均切分次数"当异常分,快、不需要算距离、天然适合高维。基于重建:训一个自编码器只用正常数据,它学会了把正常样本压缩再还原;遇到异常样本时它还原不出来,重建误差飙高就报警。这条路线在工业时序信号、设备振动数据上用得非常多。

异常检测的真正难点从来不是算法,而是报警阈值和运营成本的平衡。一个每天报 3000 条告警的系统等于没有系统——风控团队根本看不完,最后集体忽略,这叫"告警疲劳"。所以真实系统的设计一定是分层的:模型给出异常分 → 高分自动拦截 → 中分进人工审核队列 → 低分放行但记录,同时把人工审核的结论回流成标签,让下游逐步演化出一个监督模型。纯无监督的异常检测通常只是第一版,成熟系统最终都会长成"无监督打头、监督兜底"的混合体。

把 3000 条换算一下就知道有多离谱:审一条平均要 2 分钟,3000 条就是 100 个工时,相当于要养 12 个人的办公室专门干这一件事,还得天天加班。所以这套分层设计说白了就是医院的分诊思路——真危急的直接推进抢救室,看着可疑的进排队候诊,明显没事的登记一下就放走。

关联规则与"啤酒与尿布"的真相

关联规则挖掘(Association Rule Mining)是无监督学习里最古老的分支之一,1993 年由 Agrawal 等人在 IBM 提出 Apriori 算法。它回答的问题是:"买了 A 的人是不是也倾向于买 B?"三个核心指标必须一起看,只看其中一个必然被骗:

三个指标一句话对应过来:支持度问的是"这事在超市里一天发生多少回"(太少就不值得改货架),置信度问的是"买了 A 的人有几成也买了 B",提升度问的是"这几成到底是真有搭配倾向,还是本来人人都买"。打个比方:几乎每个人结账都要个塑料袋,你就不能说"买牛奶的人爱买塑料袋"——这不是洞察,这是废话。提升度干的活儿就是把这类废话筛掉。

规则形式:{尿布} → {啤酒}

支持度 Support(A→B) = 同时买 A 和 B 的订单数 / 总订单数
   ← 这条规则覆盖了多大的生意?太低说明是边角料,没有商业价值

置信度 Confidence(A→B) = 同时买 A 和 B 的订单数 / 买了 A 的订单数
   ← 买了 A 的人里,有几成也买了 B?

提升度 Lift(A→B) = Confidence(A→B) / Support(B)
   ← 关键指标!= 1 表示两者独立(毫无关系)
                 > 1 表示正相关(真的有搭配倾向)
                 < 1 表示负相关(买了 A 反而不买 B)

反例:{任意商品} → {塑料袋} 的置信度可能高达 0.9,
     但因为 90% 的订单都买塑料袋,Support(塑料袋)=0.9,
     Lift = 0.9/0.9 = 1.0 → 这条规则一点信息量都没有。
     只看置信度的人,会兴奋地"发现"一堆这种废话。

现在说"啤酒与尿布"。这个故事的标准版本是:某超市通过数据挖掘发现买尿布的男性顾客常同时买啤酒(因为妻子让他去买尿布,他顺手给自己拿几罐),于是把两者摆在一起,销量大增。这个故事被写进了无数本商业书和数据分析课件。

但它的真实性长期存疑。可追查的源头指向 1990 年代初 Teradata 的一位管理者 Thomas Blischok 在一次演讲中提到的、为 Osco Drug 做的购物篮分析,其中确实观察到下午时段尿布和啤酒的共现现象。然而从未有任何超市被确证真的因此调整了货架,也没有公开数据证实调整后销量上升。多年来它在转述中不断被添枝加叶,逐渐从"一个观察"变成了"一个成功案例"。

为什么要花篇幅讲这个真伪?因为它精准地展示了无监督学习最大的陷阱——人类对"发现的模式"有近乎本能的过度解读冲动。算法从一千万条订单里挖出十万条关联规则,其中绝大多数是统计噪声或废话(塑料袋类),但人一旦看到一条能编出好故事的规则,立刻就会相信它是因果、是洞察、是商机。这就是无监督学习必须配上两道防线的原因:一是提升度这类扣除了基线的统计量,二是随后的 A/B 实验。挖出来的规则只是假设,把货架真的换掉、跑两周对照组,才算验证。

无监督学习怎么评估:三类指标

"难以评估"不等于"无法评估",业界有一套分层的做法,从纯数学到纯业务。

类型代表指标需要什么能回答什么
内部指标轮廓系数、CH 指数、DB 指数、SSE只要数据本身簇内紧不紧、簇间分不分得开
外部指标ARI 调整兰德指数、NMI 归一化互信息、纯度需要一小份真实标签算法分的组和真实类别对得上吗
相对指标不同 K、不同算法之间的稳定性对比多次运行/重采样这个结构是稳的还是碰巧的
业务指标分群后各群转化率差异、A/B 实验收益线上实验这个分群到底赚不赚钱

这里要特别说稳定性检验,它是最被低估的一招:把数据随机抽 80% 跑一次聚类,再抽另外 80% 跑一次,看两次的簇结构是否一致(可以用 ARI 度量重叠部分的一致性)。如果每次抽样都给出完全不同的分群,说明这个结构是算法凭空造出来的,不是数据里真实存在的。K-Means 永远会给你 K 个簇——哪怕你喂给它一堆完全均匀随机的点,它也会一本正经地切成 K 块。稳定性检验就是为了识破这种"无结构数据上的假结构"。

想象一下你让两个理货员各拿八成的货去分区,一个分成"食品/日百/清洁",另一个分成"国产/进口/礼盒"——两份都说得通,但结论完全不搭,这说明这批货本来就没有唯一的自然分法。换成大白话两次抽样分出来的堆对不上,那这个"发现"就是算法自己编的。

另一个实用手法叫簇画像(Cluster Profiling):聚完之后,对每个簇统计它在各个特征上相对总体均值的偏离,找出最有区分度的三五个特征来给簇起名字。比如某簇"月消费额是均值的 3.2 倍、退货率只有均值的 0.3 倍、只在夜间下单",那它就叫"高净值夜猫子"。能起出名字的簇才是有用的簇——这句话是无监督学习落地的实操标准,比任何轮廓系数都更接近项目验收的真实门槛。

实战:用户分群与推荐系统里的无监督

用户分群(Customer Segmentation)是无监督学习最经典的商业应用。最广为使用的框架是 RFM 模型——只用三个特征:R(Recency)最近一次消费距今多久、F(Frequency)一段时间内消费几次、M(Monetary)累计消费多少钱。三个维度各分高低,理论上有 8 种组合,实践中常配合 K-Means 聚出 5–8 个群,每个群配一套完全不同的运营动作:

群体RFM 特征该做什么
核心高价值R 近、F 高、M 高VIP 专属服务、优先客服,重点是别打扰、别流失
潜力新客R 很近、F 低、M 低引导第二单,做品类拓展,培养复购习惯
沉睡老客R 远、F 曾高、M 高召回是最高优先级——历史价值高,唤醒成本远低于拉新
价格敏感型F 中、M 低、只在促销下单只在大促时定向发券,平时不投预算
一次性流量R 远、F=1、M 低基本放弃,不值得投放成本

RFM 之所以历经三十年不倒,是因为它特征少、口径清、每个群业务方一看就懂、每个群都能对应一个明确动作。这四点恰好就是无监督学习项目成功的四个条件。相反,那些一上来就堆两百个特征、聚出十二个群然后谁也说不清区别的项目,几乎全部烂尾。

推荐系统里无监督的角色更隐蔽但更根本。经典的协同过滤就是彻底的无监督思路:"和你买过相同商品的那批人还买了什么"——它不需要任何人告诉算法商品的类别或属性,纯靠共现矩阵。后来的矩阵分解(2006–2009 年 Netflix 百万美元大奖赛的主角)把用户-物品评分矩阵拆成两个低维矩阵,本质上就是一次降维:给每个用户和每个物品各学一个几十维的隐向量,向量的每一维对应某种说不清但确实存在的品味维度(可能是"文艺度",可能是"暴力程度")。这些维度没有人定义过,是算法从数据结构里自己挖出来的——这正是无监督学习的定义。

今天的向量检索(Embedding + ANN 近似最近邻)是同一思路的工业化版本:把几亿个商品、视频、用户都压成向量放进向量数据库,来了一个请求就找最近的一百个。Facebook 开源的 FAISS、以及 HNSW 这类图索引算法,让"在十亿向量里毫秒级找最近邻"成为标准能力。无监督学习在这里不是一个"分析工具",而是整个推荐系统的地基。

最后一个不那么显眼但极其重要的应用:数据探索与质量诊断。拿到一份陌生数据,先跑 PCA 和 UMAP 画一张图,往往一眼就能看出问题——数据明显分成两团(说明混进了两个来源不同的批次)、有一撮点孤立在角落(说明存在异常录入)、某个维度上所有点排成一条直线(说明这个特征是另一个特征的线性变换,冗余)。这种"看一眼数据长什么样"的能力,是所有后续建模工作的前提,也是无监督学习在日常工作中被使用得最频繁的方式,只是它通常不被写进项目文档。

无监督学习在你生活中的样子

你做的事背后的无监督学习
淘宝"猜你喜欢"用户聚类——把跟你品味相似的人买的东西推给你
抖音把视频分领域内容聚类——自动把视频分成"美食 / 旅行 / 萌宠"……
银行风控发现盗刷异常检测——你的卡突然在国外刷一笔大的,立刻冻结
新闻客户端自动归类文本聚类——自动把新闻分成"体育 / 财经 / 娱乐"……
生物学家发现新物种基因聚类——把相似基因型的个体归为一类

无监督学习的局限

除了这三条,还有两个更隐蔽的局限值得单列。第一,它极度依赖"距离"的定义,而距离在高维空间里是不可靠的。K-Means 默认用欧氏距离,这意味着"月消费额差 1000 元"和"年龄差 1000 岁"在数学上是等价的——所以不做特征缩放的聚类结果,基本等于只按量级最大的那个特征分组。这是聚类项目里最常见的低级错误:忘了做标准化,结果簇的划分完全被"收入"这一列主导,其他二十个特征形同虚设。

"特征缩放"这个词翻译成人话就是"先把单位统一了再比"。好比你在菜市场比两样东西贵不贵,一个标"元/斤"、一个标"元/公斤",不换算就直接比大小,结论必然荒唐。忘了标准化的聚类,本质上就是拿元和公斤在硬比。

第二,它给出的结构可能是真的,但和你关心的事无关。假设你想对用户分群做营销,聚类却按"手机品牌 + 屏幕分辨率"把用户分成了三组——从数据角度这个结构千真万确、稳定可复现,但它对营销毫无用处。无监督学习不知道你的业务目标,它只能找到"数据里最显著的那个结构",而最显著的往往是最琐碎的(设备型号、注册渠道、时区)。解法是在特征选择阶段就动手:只把你认为和业务目标相关的特征喂进去。换句话说,无监督学习并没有把人的判断从流程里去掉,只是把它从"打标签"挪到了"选特征"。

为什么现在很少单独用"纯无监督"

纯粹的无监督学习今天用得越来越少——因为有更好的"变种":

说"纯无监督用得少"其实有点冤枉它,更准确的说法是:无监督学习从"独立的解决方案"变成了"流程里的一个环节"。今天它最常出现在这四个位置——

位置做什么为什么必须是无监督
建模最前端PCA/UMAP 画图看数据分布、查批次效应拿到数据时还没有标签
特征工程中段把聚类簇号当成一个新特征喂给监督模型簇号编码了"这个用户像哪一类人"
标注前的采样先聚类,再从每个簇里各抽一些送去标注保证标注样本覆盖数据的各个区域
线上监控监测新数据的分布是否偏离训练时的分布漂移检测天然没有标签

第三条特别值得强调,它是无监督和监督最漂亮的一次协作:先用无监督聚类摸清数据有哪几种形态,再按簇分层抽样送去人工标注。这样得到的一千条标注,比随机抽的一千条覆盖度好得多——因为随机抽样会按比例大量抽到最常见的那类,而稀有但重要的形态可能一条都抽不到。这个技巧在冷启动阶段能省下相当可观的标注预算。

至于自监督学习为什么算是无监督的"进化版",关键在于它把"没有目标"这个根本缺陷补上了。无监督学习的困境是没有 y,于是没有明确的优化目标、没有客观评估。自监督的做法是从数据里造出一个假的 y——遮住一个词让模型猜、把图片旋转 90 度让模型判断旋转了多少度、把同一张图的两种裁剪拉近而把不同图推远。一旦有了 y,损失函数、反向传播、验证集评估这一整套监督学习的成熟机械立刻全部可用,而数据依然是零标注成本的。这就是 2018 年之后自监督全面碾压传统无监督的原因,下一篇 § 4.4 会把它讲透。

Recap · 收束

无监督学习 = "让机器自己在数据里找结构"。它是监督学习的好帮手,但今天最热的"自监督"已经把它推向了新高度——下一篇我们看强化学习。

☰ 主页
Xue Hai Wu Ya · § 4.2 · Unsupervised Learning