想象你是一家合唱团的声乐总监,办公桌抽屉里压着一张“歌手 × 歌曲”适配度表:五位歌手、六首歌,每个格子记着“这位歌手唱那首歌好不好听”(1-5 分)。但糟糕的是,表格三分之二的格子是空的——小雅从没唱过《茉莉花》,老陈也没试过那首新流行歌。有一天团长推门进来:“下个月演出,我要给每个人配一首最合适的歌,你把这表填满!” 你盯着空荡荡的表格发愁:总不能把每首歌都让每个人试唱一遍吧?这时你灵光一闪——每个歌手的嗓音其实都可以拆成几个“声线因子”:音域宽窄、音色甜度、节奏感强弱;每首歌也可以拆成同样的几个维度:调子高低、旋律柔美、律动强弱。适配度不是凭空冒出来的,而是“歌手的声线因子 × 歌曲的风格因子”碰撞出来的化学反应。只要把这两套因子找出来,没唱过的歌也能算出一个靠谱的预估分! 这就是矩阵分解的绝妙之处:它把一张稀疏的“用户-物品评分表”拆成两个小矩阵的乘积,用几个看不见的“隐因子”浓缩用户的口味和物品的特质,从而补全所有缺失的格子。这套方法在 Netflix 观影竞赛中一战成名,成为今天推荐系统的地基算法。读完这篇文章,你将彻底掌握它的思想、公式与工程实践。

岗位关联

矩阵分解是推荐系统的“第一性原理”。理解它的隐向量思想,你就能轻松看懂 DeepFM、YouTube DNN 等现代模型的底层逻辑,在技术选型时做出有底气的判断。

目录
  1. 可视化演示
  2. 分解思想:给声音写“坐标卡”
  3. 数学原理:把适配度写成算式
  4. 优化算法:两套排练方案
  5. 正则化护盘:防止死记硬背
  6. 推荐应用:从排练到登台
  7. 工程进阶:老歌手的进阶技巧
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

分解思想:给声音写“坐标卡”

为什么小雅唱《茉莉花》一定好听,而让她唱硬核摇滚可能是一场灾难?因为每副嗓音都有可拆解的特质:音域宽窄、音色甜度、节奏感强弱。每首歌也有对应的风格坐标:调子多高、旋律多柔、律动多强。适配度从来不是凭空冒出来的,而是“嗓音特质 × 歌曲风格”的化学反应——这就是矩阵分解的全部直觉。

推荐系统里的道理一模一样。用户和物品之间的“适配度”就是评分。矩阵分解的洞察是:我们不必知道“甜度”具体指什么,只假设存在 K 个看不见的“隐因子”,用户和物品都能用这 K 个维度来描述。那么用户 u 对物品 i 的预测评分,就等于用户向量与物品向量的内积(对应位置相乘再相加)。

形式化地说,我们把用户-物品评分矩阵 $R$(U 行 I 列)近似拆成两个矮矩阵的乘积:$P$(U×K)和 $Q$(K×I)。$P$ 的每一行是用户 $u$ 的隐因子向量 $p_u$,$Q$ 的每一列是物品 $i$ 的隐因子向量 $q_i$。因为 K 远小于 U 和 I,这本质上是一次降维——用 K 个维度浓缩用户和物品的全部特征。

回到合唱团:你把五位歌手和六首歌都塞进两个“声线维度”里。只要维度选得准,哪怕从未听过小雅唱《茉莉花》,也能从她的声线坐标和《茉莉花》的风格坐标算出大概能得几分。表格上每一个空白的格子,都藏着一张可以算出来的分数。

r^ui=pu⊤qi=∑k=1Kpuk⋅qki\displaystyle \hat{r}_{ui} = p_u^{\top} q_i = \sum_{k=1}^{K} p_{uk} \cdot q_{ki}
预测评分 = 两个 K 维向量逐位相乘再求和。维度越贴合真实口味,预测越准。
  1. 认识两个主角$u$ 表示第 $u$ 位用户(歌手),$i$ 表示第 $i$ 个物品(歌曲),$\hat{r}_{ui}$ 是预测出的适配分。
    r^ui\displaystyle \hat{r}_{ui}
  2. 用户隐因子向量$p_u$ 是用户 $u$ 的 K 维向量,$p_{uk}$ 表示用户在第 $k$ 个隐因子上的取值(歌手的“音域得分”)。
    pu=(pu1,pu2,…,puK)\displaystyle p_u = (p_{u1}, p_{u2}, \ldots, p_{uK})
  3. 物品隐因子向量$q_i$ 是物品 $i$ 的 K 维向量,$q_{ki}$ 表示物品在第 $k$ 个隐因子上的取值(歌曲的“风格坐标”)。
    qi=(q1i,q2i,…,qKi)\displaystyle q_i = (q_{1i}, q_{2i}, \ldots, q_{Ki})
  4. 内积求和把 K 个维度逐位相乘再累加,得到预测评分——两个声线坐标的契合度总分。
    ∑k=1Kpuk⋅qki\displaystyle \sum_{k=1}^{K} p_{uk} \cdot q_{ki}

数学原理:把适配度写成算式

声乐总监的新难题:已知一批“歌手-歌曲”适配分,要反推出每位歌手的声线坐标和每首歌的风格坐标,使得“歌手坐标 × 歌曲坐标”能还原已知分数。这不是猜谜,而是一个标准的数学优化问题。

先把目标翻译成数学语言。对每个已知评分,我们希望“预测值”与“真实值”尽可能接近。定义预测误差 $e_{ui} = r_{ui} - \hat{r}_{ui}$,然后让所有已知评分处的误差平方和最小——取平方是为了让正负误差都变成惩罚,且大误差被放大(唱跑调比稍微走音严重得多)。

从另一个角度看,$R$ 被近似为 $P \times Q$,而两个低矩阵相乘的秩最多只有 K,所以我们其实是在找原评分矩阵的一个低秩近似。遗憾的是,$p$ 和 $q$ 相乘导致目标函数不是凸函数,没有一步到位的闭式解,只能靠迭代方法逐步逼近。

就像合唱排练,你不可能一次算出所有人最完美的声线坐标,但可以先随便猜一组坐标,再反复修正。修正的方向和节奏,正是下一节“优化算法”要解决的问题。

J=1∣Ω∣∑(u,i)∈Ω(rui−pu⊤qi)2\displaystyle J = \frac{1}{|\Omega|} \sum_{(u,i) \in \Omega} \left( r_{ui} - p_u^{\top} q_i \right)^2
损失函数 = 所有已知评分处“真实值减预测值”的平方的平均值。这是矩阵分解要优化的总目标。
  1. 误差项括号里是“真实评分减预测评分”,$\Omega$ 表示所有已知评分的格子集合。
    rui−pu⊤qi\displaystyle r_{ui} - p_u^{\top} q_i
  2. 取平方让正负误差都算作惩罚,同时放大显著偏差——唱跑调比稍微走音要严重得多。
    (rui−pu⊤qi)2\displaystyle \left( r_{ui} - p_u^{\top} q_i \right)^2
  3. 求和范围只对已知评分的格子求和。没听过的歌无法对表,不能计入目标。
    ∑(u,i)∈Ω\displaystyle \sum_{(u,i) \in \Omega}
  4. 取平均除以已知评分数 $|\Omega|$,得到平均误差平方,与数据量解耦。
    1∣Ω∣∑(u,i)∈Ω\displaystyle \frac{1}{|\Omega|} \sum_{(u,i) \in \Omega}

优化算法:两套排练方案

有了损失函数,怎么找到最优因子?合唱团有两位风格迥异的教练。SGD 教练喜欢“盯人战术”:随机挑一个已知评分,算算当前误差,立刻只对这个评分涉及的用户和物品因子做微调,简单粗暴但见效极快。ALS 教练则喜欢“按部就班”:先固定所有歌曲的风格坐标,把每位歌手的最佳声线坐标用最小二乘法一次性算出来;再固定所有歌手,把所有歌曲的坐标算一遍。两边交替进行,稳扎稳打。

这两位教练就是矩阵分解的两大主流优化方法:SGD(随机梯度下降) 和 ALS(交替最小二乘)。SGD 每次只用一个样本更新参数,内存友好、适合流式增量数据;ALS 把参数分成用户因子和物品因子两组,轮流用最小二乘闭式解更新,天然适合分布式并行,对学习率不敏感,在稀疏数据上往往比 SGD 更稳定。

SGD 的更新公式如下($e_{ui}$ 是当前预测误差):

SGD 像“随机抽查、当场纠错”,ALS 像“先定歌单、人人对表”。虽然风格不同,但两位教练都指向同一个方向:让合唱团越唱越准。实际项目中,数据规模大、集群资源充足时常用 ALS;在线实时更新场景则更倾向 SGD。

puk←puk+η(eui⋅qki−λpuk)\displaystyle p_{uk} \leftarrow p_{uk} + \eta \left( e_{ui} \cdot q_{ki} - \lambda p_{uk} \right)
SGD 更新规则:旧因子加上“学习率 ×(误差 × 对侧因子 − 正则项)”。误差大就多调,误差小就微调。
  1. 预测误差$e_{ui} = r_{ui} - p_u^{\top} q_i$,当前模型对这对“用户-物品”的偏差有多大。
    eui=rui−pu⊤qi\displaystyle e_{ui} = r_{ui} - p_u^{\top} q_i
  2. 学习率$\eta$ 控制每次调整的步长——教练纠音的力度,太猛容易过冲,太小进展太慢。
    η\displaystyle \eta
  3. 梯度方向$e_{ui} \cdot q_{ki}$ 指明 $p_{uk}$ 该往哪个方向调——对侧的歌曲风格坐标告诉你“这维差了多远”。
    eui⋅qki\displaystyle e_{ui} \cdot q_{ki}
  4. 正则项拖住$-\lambda p_{uk}$ 把因子往回拽一点,防止坐标跑偏(保护嗓子)。
    −λpuk\displaystyle - \lambda p_{uk}
  5. 更新符号$\leftarrow$ 表示用“旧值 + 增量”覆盖旧值,每次排练后声线坐标微调一次。
    puk←puk+⋯\displaystyle p_{uk} \leftarrow p_{uk} + \cdots

正则化护盘:防止死记硬背

排练中最怕什么?教练只盯着某几首歌反复练到完美,歌手的声线坐标被强行扭曲——为了贴合那几个分数,音域被拉到了不自然的极端,结果一唱新歌就崩。这就是过拟合:模型把训练数据背得滚瓜烂熟,却失去了泛化能力。

推荐系统里更常见:一个用户只评过三四部电影,模型完全可以“背下来”这几个分数,而不是学到真正的口味偏好。一旦要预测他没看过的电影,预测值就会非常离谱。

解决办法是在损失函数里加 L2 正则项:对用户因子和物品因子的平方和进行惩罚,逼着因子值保持克制,不许走极端。正则系数 $\lambda$ 控制惩罚力度:太小等于没惩罚,模型照样过拟合;太大则把所有因子压向零,模型欠拟合,预测全变成均值附近。

正则化就像合唱团的“声带保护规则”——不许为了某一首歌把嗓子练哑,任何人的声线坐标都不许走极端。这样虽然那首特定歌的分数可能不是全场最高,但整个歌单的表现却最稳定。

J=∑(u,i)∈Ω(rui−pu⊤qi)2+λ∑u∥pu∥2+λ∑i∥qi∥2\displaystyle J = \sum_{(u,i) \in \Omega} \left( r_{ui} - p_u^{\top} q_i \right)^2 + \lambda \sum_{u} \| p_u \|^2 + \lambda \sum_{i} \| q_i \|^2
完整损失 = 拟合误差 + 正则惩罚。λ 是“声带保护力度”旋钮,调它是矩阵分解最重要的超参数工程。
  1. 第一项拟合误差保证预测值贴近已知评分——唱得像原曲,这是基本功。
    ∑(u,i)∈Ω(rui−pu⊤qi)2\displaystyle \sum_{(u,i) \in \Omega} \left( r_{ui} - p_u^{\top} q_i \right)^2
  2. 第二项用户因子惩罚$\|p_u\|^2 = \sum_k p_{uk}^2$,因子值越大罚得越狠——歌手的声线坐标不许极端。
    λ∑u∥pu∥2\displaystyle \lambda \sum_{u} \| p_u \|^2
  3. 第三项物品因子惩罚同样的约束加在物品上——歌曲风格坐标也不许离谱。
    λ∑i∥qi∥2\displaystyle \lambda \sum_{i} \| q_i \|^2
  4. 调和系数$\lambda$ 平衡“拟合”与“保守”,通过验证集调出最佳值。
    λ\displaystyle \lambda

推荐应用:从排练到登台

排练终于结束,该把合唱团推向市场了。矩阵分解落地推荐的流程就像一场完整的演出策划:第一步,收集历史评分数据(听众的反馈记录);第二步,随机初始化 P、Q 两个因子矩阵(先随便给每个人猜一组声线坐标);第三步,用 SGD 或 ALS 最小化损失函数(反复排练);第四步,用训练好的因子计算所有未知评分;第五步,排序取 TopK 推荐。

预测阶段的数学很简洁:对每个未评分的“用户-物品对”计算内积,然后按分数从高到低排序。但要注意排除用户已经购买或看过的物品——歌已经学过了,再推就没有意义。冷启动是绕不开的坎:新用户没有历史评分,也就没有可用的隐因子向量,常见的做法是用热门物品兜底,或者借助用户内容特征(注册信息、浏览记录)估算初始因子。

Netflix 竞赛是这套方法论的高光时刻:矩阵分解类模型在百万级评分数据上把推荐精度提升了约 10%,从此 SVD 家族成为工业界推荐系统的标配。合唱团越了解每个人的声线,越能把合适的歌推给合适的人唱。

r^ui=pu⊤qi,i∉Iu,取前 K 个最大的 r^ui\displaystyle \hat{r}_{ui} = p_u^{\top} q_i, \quad i \notin I_u, \quad \text{取前 } K \text{ 个最大的 } \hat{r}_{ui}
TopK 推荐:排除已交互物品后,按预测评分降序排列,取前 K 个作为推荐列表。
  1. 全量预测对每个未评分物品计算 $p_u^{\top}q_i$,补全所有“没听过的歌”的预估适配分。
    r^ui=pu⊤qi\displaystyle \hat{r}_{ui} = p_u^{\top} q_i
  2. 排除已购$i \notin I_u$ 表示只考虑用户 $u$ 尚未交互过的物品。
    i∉Iu\displaystyle i \notin I_u
  3. 降序排序按预测分从高到低排队——谁适配度最高,谁站 C 位。
    sort descending by r^ui\displaystyle \text{sort descending by } \hat{r}_{ui}
  4. 截取前 K只保留最靠前的 K 个物品进推荐列表,歌单太长听众记不住。
    Top K\displaystyle \text{Top } K

工程进阶:老歌手的进阶技巧

基础版矩阵分解有两个短板。第一,有些人天生打分苛刻——他给的 3 分可能相当于别人给的 5 分;第二,有些歌是公认神曲,几乎人人高分。这些“系统偏差”是评分基准问题,不该算进隐因子的头上。如果硬要隐因子去解释这些偏差,模型会浪费大量表达能力。

解决办法是在预测公式中加入偏差项:全局均值 $\mu$ 定基准,用户偏差 $b_u$ 刻画“这个人整体手松还是手紧”,物品偏差 $b_i$ 刻画“这首歌是不是天生讨喜”,剩下的 $p_u^{\top}q_i$ 才纯粹表达“口味交互”。

工程上还有两个常见痛点:评分矩阵极端稀疏(有记录的格子往往不到 1%),以及大量反馈是隐式的(点击、观看、购买),根本没有显式评分。应对手段包括加权矩阵分解(对置信度高的样本加大权重)、把隐式反馈转换成 0/1 标签,以及用 RMSE、NDCG 等指标综合评估推荐质量。就像老歌手清楚自己的音域优势,不会被“别人都打 3 分我也该打 3 分”的表象误导——有了偏差项,合唱团的适配表才真正贴近真实世界。

r^ui=μ+bu+bi+pu⊤qi\displaystyle \hat{r}_{ui} = \mu + b_u + b_i + p_u^{\top} q_i
带偏差的预测 = 全局均值 + 用户习惯偏差 + 物品热门偏差 + 隐因子交互。偏差项让模型解释性更强、精度更高。
  1. 全局均值$\mu$ 是所有评分的平均值,作为预测的起跑线(合唱团的整体基准分)。
    μ\displaystyle \mu
  2. 用户偏差$b_u$ 表示用户 $u$ 的平均打分与全局均值的差——要求苛刻的歌手给分普遍偏低。
    bu=rˉu∗−μ\displaystyle b_u = \bar{r}_{u*} - \mu
  3. 物品偏差$b_i$ 表示物品 $i$ 的平均得分与全局均值的差——神曲自带的天然高分光环。
    bi=rˉ∗i−μ\displaystyle b_i = \bar{r}_{*i} - \mu
  4. 隐因子交互扣除基准后剩下的 $p_u^{\top}q_i$,才真正刻画“这个人到底吃不吃这套风格”。
    pu⊤qi\displaystyle p_u^{\top} q_i

AI 应用场景

场景一:Netflix 电影推荐(离线召回)

阶段:离线召回

解决的问题:传统近邻协同过滤在稀疏矩阵上找相似用户,数据一稀疏推荐质量就断崖式下跌。矩阵分解用隐因子压缩用户与电影,训练一次即可全量预测,召回池质量大幅提升。

具体案例:推荐算法工程师每天凌晨用 Spark ALS 在分布式集群上重新训练因子矩阵,白天在线服务只需计算 $p_u^{\top}q_i$ 即可快速取出候选电影,再交给精排模型做二次排序。隐因子还天然成为“用户画像向量”,供相似用户挖掘使用。

场景二:电商商品推荐(TopK 排序)

阶段:排序与推荐

解决的问题:传统“买了 A 也买 B”的关联规则捕捉不了跨类目偏好。矩阵分解的隐因子能学到“这个用户偏爱简约风”这类跨品类口味,实现真正的个性化推荐。

具体案例:某跨境电商使用 PySpark ALS 对 1 亿用户 × 500 万商品的交互矩阵建模,配合偏差项消除热门商品偏差,推荐点击率提升 15%,用户人均购买品类数增加 20%。

场景三:音乐流媒体隐式反馈建模

阶段:特征建模

解决的问题:音乐 App 没有星级评分,只有播放、跳过、完播等隐式信号。直接把“播放次数”当评分用会被刷榜行为带偏,需要加权矩阵分解对高置信度样本加大权重。

具体案例:算法工程师把用户对歌曲的播放次数映射为置信度权重,播放越多的样本在损失函数中权重越高,同时对播放次数做对数缩放抑制长尾噪声。该方案上线后,歌单完播率提升 12%。

Python 演示

python42 行
import numpy as np def matrix_factorization(R, K=3, lr=0.01, reg=0.1, epochs=200):    """用 SGD 实现矩阵分解,返回用户因子、物品因子和损失历史。"""    n_users, n_items = R.shape    rng = np.random.default_rng(42)    P = rng.normal(0, 0.1, (n_users, K))    Q = rng.normal(0, 0.1, (K, n_items))    mask = R > 0    loss_history = []    for _ in range(epochs):        for u in range(n_users):            for i in range(n_items):                if mask[u, i]:                    err = R[u, i] - P[u] @ Q[:, i]                    P[u] += lr * (err * Q[:, i] - reg * P[u])                    Q[:, i] += lr * (err * P[u] - reg * Q[:, i])        pred = P @ Q        loss = float(np.sum((R[mask] - pred[mask]) ** 2))        loss_history.append(loss)    return P, Q, loss_history def recommend(P, Q, u, top_k=3):    """为用户 u 返回预测评分最高的 top_k 个物品。"""    scores = P[u] @ Q    return np.argsort(scores)[-top_k:][::-1] if __name__ == "__main__":    R = np.array([        [5, 3, 0, 1, 0, 4],        [4, 0, 0, 1, 2, 0],        [1, 1, 0, 5, 4, 0],        [0, 2, 4, 0, 5, 3],        [0, 0, 5, 4, 0, 2],    ])    P, Q, losses = matrix_factorization(R, K=3, epochs=200)    print("预测评分矩阵:")    print(np.round(P @ Q, 1))    print(f"最终损失:{losses[-1]:.3f}")    for u in range(R.shape[0]):        rec = recommend(P, Q, u)        print(f"用户{u}推荐物品:{rec.tolist()}")
目的:用纯 NumPy 实现矩阵分解的 SGD 训练,对稀疏评分矩阵做补全,并为每个用户输出 TopK 物品推荐。
  1. P = rng.normal(0, 0.1, (n_users, K))用小方差高斯分布随机初始化用户隐因子矩阵,打破对称性又不至于初始偏差过大。
  2. err = R[u, i] - P[u] @ Q[:, i]计算当前预测误差,这是所有更新的“方向盘”。
  3. P[u] += lr * (err * Q[:, i] - reg * P[u])执行 SGD 更新:误差乘对侧因子指明方向,正则项拖住因子防止走极端。
  4. mask = R > 0生成布尔掩码,只对已知评分(非零格)计算损失和梯度。
  5. np.argsort(scores)[-top_k:][::-1]对预测分排序后取最大的 K 个下标,再反转成降序。

常见误区

误区“我把 K 设成 100,特征越多模型越强!隐因子不就是压缩特征吗,维度越高信息丢失越少。”

正解K 太大时,模型有足够容量去“背”每个评分细节,把噪音也学进来——就像给歌手定了 100 维声线坐标,结果每个维度都在强行贴合某一次跑调。K 太小又表达不出复杂口味。实践中 K 通常在 10\sim200 之间,配合验证集损失曲线挑选最优值。

为何常见:直觉上“更多特征 = 更强表达力”没错,但忽略了模型对训练数据之外的新评分同样要预测,追求“记得牢”不等于“猜得准”。

误区“模型训练完,算所有物品的预测分,选分数最高的几个扔给用户完事。”

正解预测评分只是第一步。真实推荐还要做已购过滤、多样性控制、新鲜度加权、业务规则约束(广告位、库存),并用 NDCG、Recall@K 等排序指标评估。况且预测分只代表“喜好程度”,不代表“此刻该推荐”。

为何常见:教程通常只讲到评分预测就结束,让人误以为推荐 = 评分排序,忽略了从“预测”到“推荐”之间的大量工程决策。

误区“反正都是让损失下降的优化器,选哪个看心情。”

正解两者工程特性差异显著:SGD 每次只用一个样本更新,内存友好、天然支持流式增量;ALS 把参数分成两组交替求解,每个子问题都是最小二乘闭式解,天然适合分布式并行,且对学习率不敏感。数据量大、集群资源充足时首选 ALS;在线实时更新场景更倾向 SGD。选错方案可能导致训练慢一个数量级。

为何常见:只盯着“两者都能收敛到低损失”这个共同点,忽略了它们面对不同工程约束时表现的巨大差异。

误区“正则化能防过拟合,那我把 λ 设成 10,保险起见总没错吧?”

正解λ 过大会把所有隐因子压向零,模型欠拟合,预测全变成均值附近——相当于把所有歌手的声音都抹成“标准音”,毫无个性。正确的做法是在验证集上扫描 λ 的对数刻度取值(如 0.01 到 10),选损失曲线最低点。

为何常见:知道正则化能防过拟合后很容易走向另一个极端,忽视了“拟合”与“保守”之间的平衡本就是一个权衡问题。

面试题

Q1. 矩阵分解把用户-物品评分矩阵近似为什么形式的乘积?

单选题 · easy

  • A.用户隐因子矩阵乘以物品隐因子矩阵← 正确答案
  • B.用户评分均值乘以物品出现次数
  • C.用户特征矩阵乘以物品标签向量
  • D.用户聚类中心乘以物品簇标签

答案:A。矩阵分解的核心就是 $R \approx P \times Q$,其中 P 是用户隐因子矩阵,Q 是物品隐因子矩阵。B、C、D 描述的都不是矩阵分解的标准形式。

Q2. 下列哪一项属于矩阵分解中的“隐因子”?

单选题 · easy

  • A.用户注册填写的性别和年龄段
  • B.物品分类标签和价格区间值
  • C.数据里未明说但可推断的潜在特征← 正确答案
  • D.用户提交的文本评价和评论分数

答案:C。隐因子的“隐”字正是指数据中没有直接给出的潜在维度,比如“偏爱简约风”这类无法从属性表里直接看到的口味。A、B、D 都是可直接观测的显式信息。

Q3. 矩阵分解的损失函数通常基于什么误差?

单选题 · mid

  • A.预测评分与实际评分的平方差值← 正确答案
  • B.预测评分与实际评分的绝对值差
  • C.两个物品向量之间的余弦相似度
  • D.用户平均分与物品平均分之差

答案:A。标准矩阵分解用误差平方和(L2 损失)构造目标函数,平方让正负误差都成为惩罚且放大显著偏差。绝对值差虽可用来构造变体,但不是标准做法。

Q4. L2 正则化在矩阵分解中的主要作用是什么?

单选题 · mid

  • A.惩罚过大的隐因子参数防止过拟合← 正确答案
  • B.把评分矩阵变成全零矩阵降低稀疏
  • C.增大模型复杂度以提升拟合能力
  • D.把所有评分都归一化到零和壹区间

答案:A。L2 正则项 $\lambda(\|p_u\|^2+\|q_i\|^2)$ 惩罚因子值过大,逼着模型保持克制,从而提升泛化能力。B 和 D 与正则化无关,C 恰好是正则化要抑制的方向。

Q5. SGD 更新隐因子时,参数调整的核心方向由什么决定?

单选题 · mid

  • A.预测误差乘以另一侧的隐因子值← 正确答案
  • B.随机生成一个数乘以学习率大小
  • C.实际评分除以预测评分的数值商
  • D.用户总数乘以物品总数的乘积值

答案:A。SGD 的梯度计算中,用户因子的更新方向是“误差 × 物品因子”,物品因子同理。误差越大、对侧因子越大,调整幅度越大。B、C、D 都不是梯度下降的方向来源。

Q6. ALS 交替最小二乘的工作方式是什么?

单选题 · mid

  • A.固定用户因子优化物品因子再交替← 正确答案
  • B.同时更新全部的用户与物品因子
  • C.每轮仅随机挑一个评分做更新
  • D.先计算均值再计算方差循环往复

答案:A。ALS 把参数分成两组,先固定物品因子用最小二乘求解用户因子,再反过来固定用户因子求解物品因子,交替迭代。C 描述的是 SGD 的更新方式,B 不是交替策略。

Q7. 加入偏差项后 $\hat{r}_{ui} = \mu + b_u + b_i + p_u^{\top}q_i$,其中 $b_u$ 表示什么?

单选题 · hard

  • A.用户整体打分风格带来的偏移← 正确答案
  • B.所有物品评分算出的全局均值
  • C.物品自身热门程度带来的偏移
  • D.用户因子与物品因子的内积值

答案:A。$b_u$ 是用户偏差,刻画“这个用户给分整体偏松还是偏紧”。B 对应 $\mu$,C 对应 $b_i$,D 对应 $p_u^{\top}q_i$。四个选项分别对应公式中的四个组成部分。

Q8. 下列哪些做法能有效缓解矩阵分解的过拟合?

多选题 · mid

  • A.增大正则化系数 lambda 值← 正确答案
  • B.增大隐因子数量 K 的取值
  • C.纳入更多已知评分数据参与训练← 正确答案
  • D.增加训练轮数直到损失完全归零

答案:AC。增大 λ 加强惩罚、增加数据量提升泛化,两者都能缓解过拟合。增大 K 和把训练轮数怼到损失归零都会让模型记住更多噪音,反而加重过拟合。

Q9. 面对新用户冷启动问题,下列处理方式合理的有哪些?

多选题 · hard

  • A.用热门物品兜底推荐新用户← 正确答案
  • B.直接随机初始化新用户的因子
  • C.用内容特征辅助估计初始因子← 正确答案
  • D.删除所有新用户与物品的数据

答案:AC。新用户没有历史评分,热门兜底和内容特征引导是工业界常用方案。B 随机初始化虽能跑但推荐质量差,不是合理的设计;D 直接删数据属于数据泄露,毫无道理。

Q10. 关于 Netflix 竞赛与矩阵分解,下列说法正确的有哪些?

多选题 · extreme

  • A.竞赛推动了 SVD 类模型的普及应用← 正确答案
  • B.冠军模型只使用了单一矩阵分解
  • C.竞赛数据是稀疏的用户评分矩阵← 正确答案
  • D.竞赛目标只预测评分的正负号

答案:AC。Netflix 竞赛让矩阵分解声名鹊起,其数据确实是海量稀疏评分矩阵。冠军模型是大量模型的融合而非单一矩阵分解,竞赛目标也是预测具体评分值而非仅预测正负号。