一个一千人、一千部电影的评分表,格子有一百万个,填过的可能只有五万个——因为没人看得完所有电影。可推荐系统里的 AI 还是能猜出你大概会给某部没看过的片子打几分。它用的方法叫矩阵分解,思路很朴素:既然人和物各自都能用少数几个数字概括,那就别存整张表,存这两组数字。
一张填不满的表,怎么被补上
这张表在数学上就是一个矩阵:行是用户,列是电影,格子里是评分。它的问题不是大,是空。按「看过的人打了多少分」算平均,遇到冷门片就完全没有依据——可能只有两个人评过,一个五星一个一星。
矩阵分解换了个问法:能不能给每个用户和每部电影各配一组数字,让「用户那组」和「电影那组」相乘的结果,尽量贴近已知的那些评分。一千人各配 20 个数字,一千部电影各配 20 个数字,一共四万个参数,却能给出整张表的估计值。
压缩的前提是承认这张表本来就没那么复杂
四万个参数能代替一百万个格子,靠的是一个假设:用户的口味没有一百万个自由度,而是由少数几个潜在维度决定。喜欢《海上钢琴师》的人大概率也能接受《天堂电影院》,这种相关性让矩阵的有效秩远低于它的尺寸。
那 20 个数字不对应「动作片」「文艺片」这类人工标签。模型学出来的维度可能是「偏轻松 / 偏沉重」,也可能是几个说不清名字的组合,换个随机种子顺序都会变。它们只需要满足一件事:乘出来能对上已知评分。
这里有个反直觉的地方。参数变少不等于存储变省:如果原表只有五万个观测值,稀疏存储反而更小;分解成四万个稠密参数,占的空间可能更大。所谓压缩,压的是自由度,换来的是对没见过的格子做估计的能力。这一点想清楚,就不会把它当成一种省空间的编码去用。
四种拆法,各自在哪里失效
「分解」是一类操作,不是一种算法。同样一张评分表,选哪种拆法,代价和失效条件差得很远:
| 方法 | 适用场景 | 代价 | 失效条件 |
|---|---|---|---|
| 特征值分解 | 方阵、对称、稠密,比如协方差矩阵 | 要求方阵,评分表这种长方形用不了 | 矩阵不对称时,特征值可能是复数 |
| 奇异值分解 | 任意长方形矩阵,做降维、去噪、低秩近似 | 要求矩阵完整,缺失值必须先填 | 缺失比例高时,填进去的值主导了结果 |
| 梯度下降式隐因子分解 | 带缺失值的评分表,推荐系统的主流做法 | 只对观测格子算误差,维度与正则要调 | 观测极少时,容易过拟合到个别用户 |
| 非负矩阵分解 | 词频、购买量这类非负数据,要可解释 | 结果偏「部件相加」,表达力弱于奇异值分解 | 数据含负值时不能直接用 |
| 主成分分析 | 特征高度相关的高维数据,降维与可视化 | 只做线性变换,非线性结构抓不到 | 分群明显的数据会被平均掉 |
第二行值得多说一句。奇异值分解怎么给出最优低秩近似,结论是在完整矩阵上它确实最优,可评分表天生不完整。硬把空格填成 0,等于告诉模型「这个人非常讨厌这部电影」,分解结果会整体偏移;填成均值,又把所有人的口味拉平。这也是推荐系统普遍改用第三行那种只对观测值算误差的做法。
k 取多少,是欠拟合与过拟合的分界
维度 k 是这套方法唯一必须自己定的超参。取 5,模型表达不够,热门片会推荐给所有人;取 200,它能把训练集里的评分背下来,遇到新用户照样没辙。选法不复杂:留出一部分已知评分不参与训练,按 k 从 5 到 100 各跑一遍,看留出集上的误差曲线,取拐点。
误差曲线通常先降后升,最低点就是合适的 k。这个点跟数据量有关:观测值多,k 可以大一些;观测值少,k 一大立刻过拟合。同一套参数换个品类就不适用,电影和外卖该用的维度不一样。
推荐之外,它还在做降维和找主题
把用户-物品矩阵换成文档-词矩阵,分解出来的维度常常对应可解释的主题,这是早期主题模型的做法。用在图像上,它能把一张图的像素矩阵压成几十个基向量的组合,做去噪和压缩。PCA 是怎么找主成分的本质上是同一件事的另一种说法,特征值分解在做什么则是它的数学底座。
稀疏到一定程度,分解也推不出东西
两个场景会直接失效。新用户只评过一两部片,他那一行几乎全空,方程约束不住,解出来的向量基本是随机的;全新电影没有任何评分,列全空,同理。这类冷启动不是调参能解决的,实际系统会退回内容特征、地域、热度这些旁路信息。
还有三个常被忽略的失效条件。评分本身有偏——只有喜欢的人才会去评分,观测到的分布和真实偏好不是一回事;用户口味会随时间变,三年前的五星不代表现在还喜欢,而基础分解是静态的;隐因子虽然不可读,却可能反推出敏感属性,用户向量外泄的风险不比原始评分低。
它也给不出解释。「因为你和某类用户相似」这种说法是事后编的,模型内部并没有这样的推理过程。要对客户解释推荐理由,得另配一套可解释的方法。
怎么判断一次分解靠不靠谱
看两个指标,别只看一个。评分预测误差衡量数值准不准,排序指标衡量推荐的位置对不对。这两个经常背离:误差降了,推给用户的还是那几部热门片,因为热门片的评分最容易预测准。
再做一个检查:把推荐结果按品类拆开看覆盖率。如果九成推荐集中在两成物品上,说明模型学到的是「什么流行」,没学到「这个人喜欢什么」。这个检查比任何单一指标都能暴露问题,也顺带解释了相似度用余弦还是欧氏距离为什么会明显改变推荐结果——相似度的算法换了,最近邻就换了一批,分解出来的结构也就跟着变。
速查:矩阵分解的判断要点
- 核心假设是低秩:口味由少数潜在维度决定
- 参数变少不等于存储变省,换来的是泛化能力
- 带缺失值的数据用梯度式分解,别硬填 0 或均值
- k 靠留出集选,曲线拐点就是合适的维度
- 冷启动与评分偏差,调参解决不了


