1. 交替最小二乘(ALS)是什么?
一句话概括:ALS 是矩阵分解的一种优化算法。
它的核心思想是——P 和 Q 两个矩阵都是未知的,那就先随机固定一个,求解另一个;再固定刚求出的那个,回头求解第一个;如此交替迭代,直到收敛。
核心逻辑:
目标:R≈P×QTR ≈ P × Q^TR≈P×QT
难点:P 和 Q 都不知道,无法直接求解
ALS 的解法:
- 第 1 步:随机初始化 Q
- 第 2 步:固定 Q,把 P 当作未知数,用最小二乘法直接求出 P
- 第 3 步:固定 P,把 Q 当作未知数,用最小二乘法直接求出 Q
- 第 4 步:重复第 2~3 步,直到误差收敛
为什么叫“交替”:因为我们在 P 和 Q 之间来回切换,交替地优化它们。
为什么叫“最小二乘”:因为每一步都是在求解一个标准的最小二乘问题(线性回归),有闭式解,不需要梯度下降。
2. ALS 与梯度下降(SGD)的对比
| 优化方式 | 逐样本更新,沿梯度方向走一小步 | 固定一个矩阵,对另一个矩阵求闭式解 |
| 是否可并行 | 样本之间可并行,但参数更新有依赖 | 用户之间、物品之间完全独立,极易并行 |
| 收敛速度 | 通常需要较多轮 | 在隐式反馈场景下,通常收敛更快 |
| 隐式反馈支持 | 需要额外设计 | 天然支持加权(Weighted-ALS) |
| 工业界应用 | 广泛 | Facebook、Spotify 等推荐系统的主力 |
3. 隐式反馈是什么?有什么作用?
核心问题:显式反馈(评分)非常稀疏。大多数用户只看不评,但他们的浏览、点击、收藏、购买等行为却大量存在。
隐式反馈的定义:
- 用户与物品发生了交互(浏览、点击、购买),记为 1。
- 用户与物品没有交互,记为 0。
- 交互的次数代表了用户对物品的置信度(看得越多,越确定他喜欢)。
隐式反馈的作用:
4. 从评分预测转向行为预测(One-Class 问题)
评分预测:预测用户会给物品打几分(回归问题)。
行为预测:预测用户会不会与物品发生交互(二分类/One-Class 问题)。
转换方式:
- 将显式评分矩阵转换为隐式反馈矩阵:
- 有评分/交互 → (rui=1)( r_{ui} = 1 )(rui=1)
- 无评分/交互 → (rui=0)( r_{ui} = 0 )(rui=0)
- 但 0 太多了(大部分用户对大部分物品没有交互),不能全部当作负样本。
这就是负样本采样要解决的问题。
5. 负样本采样的作用
问题:如果将所有缺失值都当作负样本(0),会导致:
解决方案:只采样一部分缺失值作为负样本。
两种采样方法:
| 均匀随机采样 | 从所有缺失值中随机抽取,数量与正样本相同 | 简单,但不够精准 |
| 按物品热门程度采样 | 越热门的物品,越可能被采为负样本 | 实践中更有效,因为热门物品用户大概率知道,没交互就是真的不感兴趣 |
核心直觉:一个越热门的物品,用户越可能知道它的存在。如果用户知道它却没有交互,那这很可能是一个真正的负样本。
6. 加权交替最小二乘(Weighted-ALS)
目标函数:
minp∗,q∗∑(u,i)∈Kcui(rui−pu⋅qiT)2+λ(∥pu∥2+∥qi∥2)
\\min_{p^*, q^*} \\sum_{(u,i) \\in \\mathcal{K}} c_{ui} \\left( r_{ui} – p_u \\cdot q_i^T \\right)^2 + \\lambda \\left( \\|p_u\\|^2 + \\|q_i\\|^2 \\right)
p∗,q∗min(u,i)∈K∑cui(rui−pu⋅qiT)2+λ(∥pu∥2+∥qi∥2)
置信度:
cui=1+α⋅Cui
c_{ui} = 1 + \\alpha \\cdot C_{ui}
cui=1+α⋅Cui
其中 (Cui)( C_{ui} )(Cui) 是用户 u 对物品 i 的交互次数,(α)( \\alpha )(α) 是超参数(默认 40)。
ALS 的更新公式:
固定 Q,求解 P(对每个用户 u 独立求解):
pu=(QTCuQ+λI)−1QTCuru
p_u = \\left( Q^T C_u Q + \\lambda I \\right)^{-1} Q^T C_u r_u
pu=(QTCuQ+λI)−1QTCuru
固定 P,求解 Q(对每个物品 i 独立求解):
qi=(PTCiP+λI)−1PTCiri
q_i = \\left( P^T C_i P + \\lambda I \\right)^{-1} P^T C_i r_i
qi=(PTCiP+λI)−1PTCiri
其中:
- (Cu)( C_u )(Cu) 是 (n×n)( n \\times n )(n×n) 对角矩阵,对角线元素为 (cui)( c_{ui} )(cui)。
- (ru)( r_u )(ru) 是用户 u 对所有物品的隐式反馈向量(0 或 1)。
7. 完整数值推导案例
7.1 数据准备
用户-物品隐式反馈次数矩阵:
| U1 | 3 | 1 | 0 |
| U2 | 2 | 0 | 4 |
转换为隐式反馈矩阵 (rui)( r_{ui} )(rui)(有交互=1,无交互=0):
| U1 | 1 | 1 | 0 |
| U2 | 1 | 0 | 1 |
计算置信度 (cui=1+α⋅Cui)( c_{ui} = 1 + \\alpha \\cdot C_{ui} )(cui=1+α⋅Cui),设 (α=1)( \\alpha = 1 )(α=1)(为简化手算,实际默认 40):
| U1 | (1+3=4)(1+3=4)(1+3=4) | (1+1=2)(1+1=2)(1+1=2) | (1+0=1)(1+0=1)(1+0=1) |
| U2 | (1+2=3)(1+2=3)(1+2=3) | (1+0=1)(1+0=1)(1+0=1) | (1+4=5)(1+4=5)(1+4=5) |
参数设定:
- 隐向量维度:(k=2)( k = 2 )(k=2)
- 正则化系数:(λ=0.1)( \\lambda = 0.1 )(λ=0.1)
初始化 Q 矩阵(随机小值):
Q=[0.10.20.30.40.50.6]
Q = \\begin{bmatrix}
0.1 & 0.2 \\\\
0.3 & 0.4 \\\\
0.5 & 0.6
\\end{bmatrix}
Q=0.10.30.50.20.40.6
(第 1 行对应 I1,第 2 行对应 I2,第 3 行对应 I3)
7.2 固定 Q,求解 P
求解 U1 的隐向量 (p1)( p_1 )(p1)
U1 的置信度对角矩阵 (C1)( C_1 )(C1):
C1=[400020001]
C_1 = \\begin{bmatrix}
4 & 0 & 0 \\\\
0 & 2 & 0 \\\\
0 & 0 & 1
\\end{bmatrix}
C1=400020001
U1 的隐式反馈向量 (r1)( r_1 )(r1):
r1=[110]
r_1 = \\begin{bmatrix} 1 \\\\ 1 \\\\ 0 \\end{bmatrix}
r1=110
计算 (QTC1Q)( Q^T C_1 Q )(QTC1Q):
先计算 (C1Q)( C_1 Q )(C1Q):
C1Q=[4×0.14×0.22×0.32×0.41×0.51×0.6]=[0.40.80.60.80.50.6]
C_1 Q = \\begin{bmatrix}
4 \\times 0.1 & 4 \\times 0.2 \\\\
2 \\times 0.3 & 2 \\times 0.4 \\\\
1 \\times 0.5 & 1 \\times 0.6
\\end{bmatrix} = \\begin{bmatrix}
0.4 & 0.8 \\\\
0.6 & 0.8 \\\\
0.5 & 0.6
\\end{bmatrix}
C1Q=4×0.12×0.31×0.54×0.22×0.41×0.6=0.40.60.50.80.80.6
再计算 (QT(C1Q))( Q^T (C_1 Q) )(QT(C1Q)):
QT=[0.10.30.50.20.40.6]
Q^T = \\begin{bmatrix}
0.1 & 0.3 & 0.5 \\\\
0.2 & 0.4 & 0.6
\\end{bmatrix}
QT=[0.10.20.30.40.50.6]
QTC1Q=[0.10.30.50.20.40.6][0.40.80.60.80.50.6]
Q^T C_1 Q = \\begin{bmatrix}
0.1 & 0.3 & 0.5 \\\\
0.2 & 0.4 & 0.6
\\end{bmatrix} \\begin{bmatrix}
0.4 & 0.8 \\\\
0.6 & 0.8 \\\\
0.5 & 0.6
\\end{bmatrix}
QTC1Q=[0.10.20.30.40.50.6]0.40.60.50.80.80.6
第一行第一列:(0.1×0.4+0.3×0.6+0.5×0.5=0.04+0.18+0.25=0.47)( 0.1 \\times 0.4 + 0.3 \\times 0.6 + 0.5 \\times 0.5 = 0.04 + 0.18 + 0.25 = 0.47 )(0.1×0.4+0.3×0.6+0.5×0.5=0.04+0.18+0.25=0.47)
第一行第二列:(0.1×0.8+0.3×0.8+0.5×0.6=0.08+0.24+0.30=0.62)( 0.1 \\times 0.8 + 0.3 \\times 0.8 + 0.5 \\times 0.6 = 0.08 + 0.24 + 0.30 = 0.62 )(0.1×0.8+0.3×0.8+0.5×0.6=0.08+0.24+0.30=0.62)
第二行第一列:(0.2×0.4+0.4×0.6+0.6×0.5=0.08+0.24+0.30=0.62)( 0.2 \\times 0.4 + 0.4 \\times 0.6 + 0.6 \\times 0.5 = 0.08 + 0.24 + 0.30 = 0.62 )(0.2×0.4+0.4×0.6+0.6×0.5=0.08+0.24+0.30=0.62)
第二行第二列:(0.2×0.8+0.4×0.8+0.6×0.6=0.16+0.32+0.36=0.84)( 0.2 \\times 0.8 + 0.4 \\times 0.8 + 0.6 \\times 0.6 = 0.16 + 0.32 + 0.36 = 0.84 )(0.2×0.8+0.4×0.8+0.6×0.6=0.16+0.32+0.36=0.84)
QTC1Q=[0.470.620.620.84]
Q^T C_1 Q = \\begin{bmatrix}
0.47 & 0.62 \\\\
0.62 & 0.84
\\end{bmatrix}
QTC1Q=[0.470.620.620.84]
加上 (λI=0.1I)( \\lambda I = 0.1I )(λI=0.1I):
QTC1Q+λI=[0.570.620.620.94]
Q^T C_1 Q + \\lambda I = \\begin{bmatrix}
0.57 & 0.62 \\\\
0.62 & 0.94
\\end{bmatrix}
QTC1Q+λI=[0.570.620.620.94]
计算 (QTC1r1)( Q^T C_1 r_1 )(QTC1r1):
先计算 (C1r1)( C_1 r_1 )(C1r1):
C1r1=[4×12×11×0]=[420]
C_1 r_1 = \\begin{bmatrix}
4 \\times 1 \\\\
2 \\times 1 \\\\
1 \\times 0
\\end{bmatrix} = \\begin{bmatrix} 4 \\\\ 2 \\\\ 0 \\end{bmatrix}
C1r1=4×12×11×0=420
再计算 (QT(C1r1))( Q^T (C_1 r_1) )(QT(C1r1)):
QT(C1r1)=[0.1×4+0.3×2+0.5×00.2×4+0.4×2+0.6×0]=[0.4+0.60.8+0.8]=[1.01.6]
Q^T (C_1 r_1) = \\begin{bmatrix}
0.1 \\times 4 + 0.3 \\times 2 + 0.5 \\times 0 \\\\
0.2 \\times 4 + 0.4 \\times 2 + 0.6 \\times 0
\\end{bmatrix} = \\begin{bmatrix}
0.4 + 0.6 \\\\
0.8 + 0.8
\\end{bmatrix} = \\begin{bmatrix} 1.0 \\\\ 1.6 \\end{bmatrix}
QT(C1r1)=[0.1×4+0.3×2+0.5×00.2×4+0.4×2+0.6×0]=[0.4+0.60.8+0.8]=[1.01.6]
求解线性方程组:
[0.570.620.620.94][p11p12]=[1.01.6]
\\begin{bmatrix}
0.57 & 0.62 \\\\
0.62 & 0.94
\\end{bmatrix} \\begin{bmatrix} p_{11} \\\\ p_{12} \\end{bmatrix} = \\begin{bmatrix} 1.0 \\\\ 1.6 \\end{bmatrix}
[0.570.620.620.94][p11p12]=[1.01.6]
行列式:(0.57×0.94−0.622=0.5358−0.3844=0.1514)( 0.57 \\times 0.94 – 0.62^2 = 0.5358 – 0.3844 = 0.1514 )(0.57×0.94−0.622=0.5358−0.3844=0.1514)
p11=0.94×1.0−0.62×1.60.1514=0.94−0.9920.1514=−0.0520.1514≈−0.343
p_{11} = \\frac{0.94 \\times 1.0 – 0.62 \\times 1.6}{0.1514} = \\frac{0.94 – 0.992}{0.1514} = \\frac{-0.052}{0.1514} \\approx -0.343
p11=0.15140.94×1.0−0.62×1.6=0.15140.94−0.992=0.1514−0.052≈−0.343
p12=0.57×1.6−0.62×1.00.1514=0.912−0.620.1514=0.2920.1514≈1.929
p_{12} = \\frac{0.57 \\times 1.6 – 0.62 \\times 1.0}{0.1514} = \\frac{0.912 – 0.62}{0.1514} = \\frac{0.292}{0.1514} \\approx 1.929
p12=0.15140.57×1.6−0.62×1.0=0.15140.912−0.62=0.15140.292≈1.929
所以 (p1=[−0.343,1.929])( p_1 = [-0.343, 1.929] )(p1=[−0.343,1.929])。
求解 U2 的隐向量 (p2)( p_2 )(p2)
U2 的置信度对角矩阵:
C2=[300010005]
C_2 = \\begin{bmatrix}
3 & 0 & 0 \\\\
0 & 1 & 0 \\\\
0 & 0 & 5
\\end{bmatrix}
C2=300010005
U2 的隐式反馈向量:
r2=[101]
r_2 = \\begin{bmatrix} 1 \\\\ 0 \\\\ 1 \\end{bmatrix}
r2=101
计算 (QTC2Q)( Q^T C_2 Q )(QTC2Q):
先计算 (C2Q)( C_2 Q )(C2Q):
C2Q=[3×0.13×0.21×0.31×0.45×0.55×0.6]=[0.30.60.30.42.53.0]
C_2 Q = \\begin{bmatrix}
3 \\times 0.1 & 3 \\times 0.2 \\\\
1 \\times 0.3 & 1 \\times 0.4 \\\\
5 \\times 0.5 & 5 \\times 0.6
\\end{bmatrix} = \\begin{bmatrix}
0.3 & 0.6 \\\\
0.3 & 0.4 \\\\
2.5 & 3.0
\\end{bmatrix}
C2Q=3×0.11×0.35×0.53×0.21×0.45×0.6=0.30.32.50.60.43.0
再计算 (QT(C2Q))( Q^T (C_2 Q) )(QT(C2Q)):
QTC2Q=[0.10.30.50.20.40.6][0.30.60.30.42.53.0]
Q^T C_2 Q = \\begin{bmatrix}
0.1 & 0.3 & 0.5 \\\\
0.2 & 0.4 & 0.6
\\end{bmatrix} \\begin{bmatrix}
0.3 & 0.6 \\\\
0.3 & 0.4 \\\\
2.5 & 3.0
\\end{bmatrix}
QTC2Q=[0.10.20.30.40.50.6]0.30.32.50.60.43.0
第一行第一列:(0.1×0.3+0.3×0.3+0.5×2.5=0.03+0.09+1.25=1.37)( 0.1 \\times 0.3 + 0.3 \\times 0.3 + 0.5 \\times 2.5 = 0.03 + 0.09 + 1.25 = 1.37 )(0.1×0.3+0.3×0.3+0.5×2.5=0.03+0.09+1.25=1.37)
第一行第二列:(0.1×0.6+0.3×0.4+0.5×3.0=0.06+0.12+1.50=1.68)( 0.1 \\times 0.6 + 0.3 \\times 0.4 + 0.5 \\times 3.0 = 0.06 + 0.12 + 1.50 = 1.68 )(0.1×0.6+0.3×0.4+0.5×3.0=0.06+0.12+1.50=1.68)
第二行第一列:(0.2×0.3+0.4×0.3+0.6×2.5=0.06+0.12+1.50=1.68)( 0.2 \\times 0.3 + 0.4 \\times 0.3 + 0.6 \\times 2.5 = 0.06 + 0.12 + 1.50 = 1.68 )(0.2×0.3+0.4×0.3+0.6×2.5=0.06+0.12+1.50=1.68)
第二行第二列:(0.2×0.6+0.4×0.4+0.6×3.0=0.12+0.16+1.80=2.08)( 0.2 \\times 0.6 + 0.4 \\times 0.4 + 0.6 \\times 3.0 = 0.12 + 0.16 + 1.80 = 2.08 )(0.2×0.6+0.4×0.4+0.6×3.0=0.12+0.16+1.80=2.08)
加上 (λI)( \\lambda I )(λI):
QTC2Q+λI=[1.471.681.682.18]
Q^T C_2 Q + \\lambda I = \\begin{bmatrix}
1.47 & 1.68 \\\\
1.68 & 2.18
\\end{bmatrix}
QTC2Q+λI=[1.471.681.682.18]
计算 (QTC2r2)( Q^T C_2 r_2 )(QTC2r2):
先计算 (C2r2)( C_2 r_2 )(C2r2):
C2r2=[3×11×05×1]=[305]
C_2 r_2 = \\begin{bmatrix}
3 \\times 1 \\\\
1 \\times 0 \\\\
5 \\times 1
\\end{bmatrix} = \\begin{bmatrix} 3 \\\\ 0 \\\\ 5 \\end{bmatrix}
C2r2=3×11×05×1=305
再计算 (QT(C2r2))( Q^T (C_2 r_2) )(QT(C2r2)):
QT(C2r2)=[0.1×3+0.3×0+0.5×50.2×3+0.4×0+0.6×5]=[0.3+2.50.6+3.0]=[2.83.6]
Q^T (C_2 r_2) = \\begin{bmatrix}
0.1 \\times 3 + 0.3 \\times 0 + 0.5 \\times 5 \\\\
0.2 \\times 3 + 0.4 \\times 0 + 0.6 \\times 5
\\end{bmatrix} = \\begin{bmatrix}
0.3 + 2.5 \\\\
0.6 + 3.0
\\end{bmatrix} = \\begin{bmatrix} 2.8 \\\\ 3.6 \\end{bmatrix}
QT(C2r2)=[0.1×3+0.3×0+0.5×50.2×3+0.4×0+0.6×5]=[0.3+2.50.6+3.0]=[2.83.6]
求解线性方程组:
[1.471.681.682.18][p21p22]=[2.83.6]
\\begin{bmatrix}
1.47 & 1.68 \\\\
1.68 & 2.18
\\end{bmatrix} \\begin{bmatrix} p_{21} \\\\ p_{22} \\end{bmatrix} = \\begin{bmatrix} 2.8 \\\\ 3.6 \\end{bmatrix}
[1.471.681.682.18][p21p22]=[2.83.6]
行列式:(1.47×2.18−1.682=3.2046−2.8224=0.3822)( 1.47 \\times 2.18 – 1.68^2 = 3.2046 – 2.8224 = 0.3822 )(1.47×2.18−1.682=3.2046−2.8224=0.3822)
p21=2.18×2.8−1.68×3.60.3822=6.104−6.0480.3822=0.0560.3822≈0.147
p_{21} = \\frac{2.18 \\times 2.8 – 1.68 \\times 3.6}{0.3822} = \\frac{6.104 – 6.048}{0.3822} = \\frac{0.056}{0.3822} \\approx 0.147
p21=0.38222.18×2.8−1.68×3.6=0.38226.104−6.048=0.38220.056≈0.147
p22=1.47×3.6−1.68×2.80.3822=5.292−4.7040.3822=0.5880.3822≈1.538
p_{22} = \\frac{1.47 \\times 3.6 – 1.68 \\times 2.8}{0.3822} = \\frac{5.292 – 4.704}{0.3822} = \\frac{0.588}{0.3822} \\approx 1.538
p22=0.38221.47×3.6−1.68×2.8=0.38225.292−4.704=0.38220.588≈1.538
所以 (p2=[0.147,1.538])( p_2 = [0.147, 1.538] )(p2=[0.147,1.538])。
更新后的 P 矩阵:
P=[−0.3431.9290.1471.538]
P = \\begin{bmatrix}
-0.343 & 1.929 \\\\
0.147 & 1.538
\\end{bmatrix}
P=[−0.3430.1471.9291.538]
7.3 固定 P,求解 Q
求解 I1 的隐向量 (q1)( q_1 )(q1)
I1 的置信度对角矩阵(U1 对 I1 置信度=4,U2 对 I1 置信度=3):
CI1=[4003]
C_{I1} = \\begin{bmatrix}
4 & 0 \\\\
0 & 3
\\end{bmatrix}
CI1=[4003]
I1 的隐式反馈向量:
rI1=[11]
r_{I1} = \\begin{bmatrix} 1 \\\\ 1 \\end{bmatrix}
rI1=[11]
计算 (PTCI1P)( P^T C_{I1} P )(PTCI1P):
先计算 (CI1P)( C_{I1} P )(CI1P):
CI1P=[4×(−0.343)4×1.9293×0.1473×1.538]=[−1.3727.7160.4414.614]
C_{I1} P = \\begin{bmatrix}
4 \\times (-0.343) & 4 \\times 1.929 \\\\
3 \\times 0.147 & 3 \\times 1.538
\\end{bmatrix} = \\begin{bmatrix}
-1.372 & 7.716 \\\\
0.441 & 4.614
\\end{bmatrix}
CI1P=[4×(−0.343)3×0.1474×1.9293×1.538]=[−1.3720.4417.7164.614]
再计算 (PT(CI1P))( P^T (C_{I1} P) )(PT(CI1P)):
PT=[−0.3430.1471.9291.538]
P^T = \\begin{bmatrix}
-0.343 & 0.147 \\\\
1.929 & 1.538
\\end{bmatrix}
PT=[−0.3431.9290.1471.538]
PTCI1P=[−0.3430.1471.9291.538][−1.3727.7160.4414.614]
P^T C_{I1} P = \\begin{bmatrix}
-0.343 & 0.147 \\\\
1.929 & 1.538
\\end{bmatrix} \\begin{bmatrix}
-1.372 & 7.716 \\\\
0.441 & 4.614
\\end{bmatrix}
PTCI1P=[−0.3431.9290.1471.538][−1.3720.4417.7164.614]
第一行第一列:((−0.343)(−1.372)+0.147×0.441=0.4706+0.0648=0.5354)( (-0.343)(-1.372) + 0.147 \\times 0.441 = 0.4706 + 0.0648 = 0.5354 )((−0.343)(−1.372)+0.147×0.441=0.4706+0.0648=0.5354)
第一行第二列:((−0.343)(7.716)+0.147×4.614=−2.6466+0.6783=−1.9683)( (-0.343)(7.716) + 0.147 \\times 4.614 = -2.6466 + 0.6783 = -1.9683 )((−0.343)(7.716)+0.147×4.614=−2.6466+0.6783=−1.9683)
第二行第一列:(1.929×(−1.372)+1.538×0.441=−2.6466+0.6783=−1.9683)( 1.929 \\times (-1.372) + 1.538 \\times 0.441 = -2.6466 + 0.6783 = -1.9683 )(1.929×(−1.372)+1.538×0.441=−2.6466+0.6783=−1.9683)
第二行第二列:(1.929×7.716+1.538×4.614=14.884+7.096=21.980)( 1.929 \\times 7.716 + 1.538 \\times 4.614 = 14.884 + 7.096 = 21.980 )(1.929×7.716+1.538×4.614=14.884+7.096=21.980)
加上 (λI)( \\lambda I )(λI):
PTCI1P+λI=[0.6354−1.9683−1.968322.080]
P^T C_{I1} P + \\lambda I = \\begin{bmatrix}
0.6354 & -1.9683 \\\\
-1.9683 & 22.080
\\end{bmatrix}
PTCI1P+λI=[0.6354−1.9683−1.968322.080]
计算 (PTCI1rI1)( P^T C_{I1} r_{I1} )(PTCI1rI1):
先计算 (CI1rI1)( C_{I1} r_{I1} )(CI1rI1):
CI1rI1=[43]
C_{I1} r_{I1} = \\begin{bmatrix} 4 \\\\ 3 \\end{bmatrix}
CI1rI1=[43]
再计算 (PT(CI1rI1))( P^T (C_{I1} r_{I1}) )(PT(CI1rI1)):
PT(CI1rI1)=[−0.343×4+0.147×31.929×4+1.538×3]=[−1.372+0.4417.716+4.614]=[−0.93112.330]
P^T (C_{I1} r_{I1}) = \\begin{bmatrix}
-0.343 \\times 4 + 0.147 \\times 3 \\\\
1.929 \\times 4 + 1.538 \\times 3
\\end{bmatrix} = \\begin{bmatrix}
-1.372 + 0.441 \\\\
7.716 + 4.614
\\end{bmatrix} = \\begin{bmatrix} -0.931 \\\\ 12.330 \\end{bmatrix}
PT(CI1rI1)=[−0.343×4+0.147×31.929×4+1.538×3]=[−1.372+0.4417.716+4.614]=[−0.93112.330]
求解线性方程组:
[0.6354−1.9683−1.968322.080][q11q12]=[−0.93112.330]
\\begin{bmatrix}
0.6354 & -1.9683 \\\\
-1.9683 & 22.080
\\end{bmatrix} \\begin{bmatrix} q_{11} \\\\ q_{12} \\end{bmatrix} = \\begin{bmatrix} -0.931 \\\\ 12.330 \\end{bmatrix}
[0.6354−1.9683−1.968322.080][q11q12]=[−0.93112.330]
行列式:(0.6354×22.080−(−1.9683)2=14.0296−3.8742=10.1554)( 0.6354 \\times 22.080 – (-1.9683)^2 = 14.0296 – 3.8742 = 10.1554 )(0.6354×22.080−(−1.9683)2=14.0296−3.8742=10.1554)
q11=22.080×(−0.931)−(−1.9683)×12.33010.1554=−20.556+24.26910.1554=3.71310.1554≈0.366
q_{11} = \\frac{22.080 \\times (-0.931) – (-1.9683) \\times 12.330}{10.1554} = \\frac{-20.556 + 24.269}{10.1554} = \\frac{3.713}{10.1554} \\approx 0.366
q11=10.155422.080×(−0.931)−(−1.9683)×12.330=10.1554−20.556+24.269=10.15543.713≈0.366
q12=0.6354×12.330−(−1.9683)×(−0.931)10.1554=7.834−1.83210.1554=6.00210.1554≈0.591
q_{12} = \\frac{0.6354 \\times 12.330 – (-1.9683) \\times (-0.931)}{10.1554} = \\frac{7.834 – 1.832}{10.1554} = \\frac{6.002}{10.1554} \\approx 0.591
q12=10.15540.6354×12.330−(−1.9683)×(−0.931)=10.15547.834−1.832=10.15546.002≈0.591
所以 (q1=[0.366,0.591])( q_1 = [0.366, 0.591] )(q1=[0.366,0.591])。
求解 I2 的隐向量 (q2)( q_2 )(q2)
I2 的置信度对角矩阵(U1 对 I2 置信度=2,U2 对 I2 置信度=1):
CI2=[2001]
C_{I2} = \\begin{bmatrix}
2 & 0 \\\\
0 & 1
\\end{bmatrix}
CI2=[2001]
I2 的隐式反馈向量:
rI2=[10]
r_{I2} = \\begin{bmatrix} 1 \\\\ 0 \\end{bmatrix}
rI2=[10]
计算 (PTCI2P)( P^T C_{I2} P )(PTCI2P):
先计算 (CI2P)( C_{I2} P )(CI2P):
CI2P=[2×(−0.343)2×1.9291×0.1471×1.538]=[−0.6863.8580.1471.538]
C_{I2} P = \\begin{bmatrix}
2 \\times (-0.343) & 2 \\times 1.929 \\\\
1 \\times 0.147 & 1 \\times 1.538
\\end{bmatrix} = \\begin{bmatrix}
-0.686 & 3.858 \\\\
0.147 & 1.538
\\end{bmatrix}
CI2P=[2×(−0.343)1×0.1472×1.9291×1.538]=[−0.6860.1473.8581.538]
再计算 (PT(CI2P))( P^T (C_{I2} P) )(PT(CI2P)):
PTCI2P=[−0.3430.1471.9291.538][−0.6863.8580.1471.538]
P^T C_{I2} P = \\begin{bmatrix}
-0.343 & 0.147 \\\\
1.929 & 1.538
\\end{bmatrix} \\begin{bmatrix}
-0.686 & 3.858 \\\\
0.147 & 1.538
\\end{bmatrix}
PTCI2P=[−0.3431.9290.1471.538][−0.6860.1473.8581.538]
第一行第一列:((−0.343)(−0.686)+0.147×0.147=0.235+0.022=0.257)( (-0.343)(-0.686) + 0.147 \\times 0.147 = 0.235 + 0.022 = 0.257 )((−0.343)(−0.686)+0.147×0.147=0.235+0.022=0.257)
第一行第二列:((−0.343)(3.858)+0.147×1.538=−1.323+0.226=−1.097)( (-0.343)(3.858) + 0.147 \\times 1.538 = -1.323 + 0.226 = -1.097 )((−0.343)(3.858)+0.147×1.538=−1.323+0.226=−1.097)
第二行第一列:(1.929×(−0.686)+1.538×0.147=−1.323+0.226=−1.097)( 1.929 \\times (-0.686) + 1.538 \\times 0.147 = -1.323 + 0.226 = -1.097 )(1.929×(−0.686)+1.538×0.147=−1.323+0.226=−1.097)
第二行第二列:(1.929×3.858+1.538×1.538=7.442+2.366=9.808)( 1.929 \\times 3.858 + 1.538 \\times 1.538 = 7.442 + 2.366 = 9.808 )(1.929×3.858+1.538×1.538=7.442+2.366=9.808)
加上 (λI)( \\lambda I )(λI):
PTCI2P+λI=[0.357−1.097−1.0979.908]
P^T C_{I2} P + \\lambda I = \\begin{bmatrix}
0.357 & -1.097 \\\\
-1.097 & 9.908
\\end{bmatrix}
PTCI2P+λI=[0.357−1.097−1.0979.908]
计算 (PTCI2rI2)( P^T C_{I2} r_{I2} )(PTCI2rI2):
先计算 (CI2rI2)( C_{I2} r_{I2} )(CI2rI2):
CI2rI2=[20]
C_{I2} r_{I2} = \\begin{bmatrix} 2 \\\\ 0 \\end{bmatrix}
CI2rI2=[20]
再计算 (PT(CI2rI2))( P^T (C_{I2} r_{I2}) )(PT(CI2rI2)):
PT(CI2rI2)=[−0.343×2+0.147×01.929×2+1.538×0]=[−0.6863.858]
P^T (C_{I2} r_{I2}) = \\begin{bmatrix}
-0.343 \\times 2 + 0.147 \\times 0 \\\\
1.929 \\times 2 + 1.538 \\times 0
\\end{bmatrix} = \\begin{bmatrix} -0.686 \\\\ 3.858 \\end{bmatrix}
PT(CI2rI2)=[−0.343×2+0.147×01.929×2+1.538×0]=[−0.6863.858]
求解线性方程组:
[0.357−1.097−1.0979.908][q21q22]=[−0.6863.858]
\\begin{bmatrix}
0.357 & -1.097 \\\\
-1.097 & 9.908
\\end{bmatrix} \\begin{bmatrix} q_{21} \\\\ q_{22} \\end{bmatrix} = \\begin{bmatrix} -0.686 \\\\ 3.858 \\end{bmatrix}
[0.357−1.097−1.0979.908][q21q22]=[−0.6863.858]
行列式:(0.357×9.908−(−1.097)2=3.537−1.203=2.334)( 0.357 \\times 9.908 – (-1.097)^2 = 3.537 – 1.203 = 2.334 )(0.357×9.908−(−1.097)2=3.537−1.203=2.334)
q21=9.908×(−0.686)−(−1.097)×3.8582.334=−6.797+4.2322.334=−2.5652.334≈−1.099
q_{21} = \\frac{9.908 \\times (-0.686) – (-1.097) \\times 3.858}{2.334} = \\frac{-6.797 + 4.232}{2.334} = \\frac{-2.565}{2.334} \\approx -1.099
q21=2.3349.908×(−0.686)−(−1.097)×3.858=2.334−6.797+4.232=2.334−2.565≈−1.099
q22=0.357×3.858−(−1.097)×(−0.686)2.334=1.377−0.7532.334=0.6242.334≈0.267
q_{22} = \\frac{0.357 \\times 3.858 – (-1.097) \\times (-0.686)}{2.334} = \\frac{1.377 – 0.753}{2.334} = \\frac{0.624}{2.334} \\approx 0.267
q22=2.3340.357×3.858−(−1.097)×(−0.686)=2.3341.377−0.753=2.3340.624≈0.267
所以 (q2=[−1.099,0.267])( q_2 = [-1.099, 0.267] )(q2=[−1.099,0.267])。
求解 I3 的隐向量 (q3)( q_3 )(q3)
I3 的置信度对角矩阵(U1 对 I3 置信度=1,U2 对 I3 置信度=5):
CI3=[1005]
C_{I3} = \\begin{bmatrix}
1 & 0 \\\\
0 & 5
\\end{bmatrix}
CI3=[1005]
I3 的隐式反馈向量:
rI3=[01]
r_{I3} = \\begin{bmatrix} 0 \\\\ 1 \\end{bmatrix}
rI3=[01]
计算 (PTCI3P)( P^T C_{I3} P )(PTCI3P):
先计算 (CI3P)( C_{I3} P )(CI3P):
CI3P=[1×(−0.343)1×1.9295×0.1475×1.538]=[−0.3431.9290.7357.690]
C_{I3} P = \\begin{bmatrix}
1 \\times (-0.343) & 1 \\times 1.929 \\\\
5 \\times 0.147 & 5 \\times 1.538
\\end{bmatrix} = \\begin{bmatrix}
-0.343 & 1.929 \\\\
0.735 & 7.690
\\end{bmatrix}
CI3P=[1×(−0.343)5×0.1471×1.9295×1.538]=[−0.3430.7351.9297.690]
再计算 (PT(CI3P))( P^T (C_{I3} P) )(PT(CI3P)):
PTCI3P=[−0.3430.1471.9291.538][−0.3431.9290.7357.690]
P^T C_{I3} P = \\begin{bmatrix}
-0.343 & 0.147 \\\\
1.929 & 1.538
\\end{bmatrix} \\begin{bmatrix}
-0.343 & 1.929 \\\\
0.735 & 7.690
\\end{bmatrix}
PTCI3P=[−0.3431.9290.1471.538][−0.3430.7351.9297.690]
第一行第一列:((−0.343)(−0.343)+0.147×0.735=0.118+0.108=0.226)( (-0.343)(-0.343) + 0.147 \\times 0.735 = 0.118 + 0.108 = 0.226 )((−0.343)(−0.343)+0.147×0.735=0.118+0.108=0.226)
第一行第二列:((−0.343)(1.929)+0.147×7.690=−0.662+1.130=0.468)( (-0.343)(1.929) + 0.147 \\times 7.690 = -0.662 + 1.130 = 0.468 )((−0.343)(1.929)+0.147×7.690=−0.662+1.130=0.468)
第二行第一列:(1.929×(−0.343)+1.538×0.735=−0.662+1.130=0.468)( 1.929 \\times (-0.343) + 1.538 \\times 0.735 = -0.662 + 1.130 = 0.468 )(1.929×(−0.343)+1.538×0.735=−0.662+1.130=0.468)
第二行第二列:(1.929×1.929+1.538×7.690=3.721+11.827=15.548)( 1.929 \\times 1.929 + 1.538 \\times 7.690 = 3.721 + 11.827 = 15.548 )(1.929×1.929+1.538×7.690=3.721+11.827=15.548)
加上 (λI)( \\lambda I )(λI):
PTCI3P+λI=[0.3260.4680.46815.648]
P^T C_{I3} P + \\lambda I = \\begin{bmatrix}
0.326 & 0.468 \\\\
0.468 & 15.648
\\end{bmatrix}
PTCI3P+λI=[0.3260.4680.46815.648]
计算 (PTCI3rI3)( P^T C_{I3} r_{I3} )(PTCI3rI3):
先计算 (CI3rI3)( C_{I3} r_{I3} )(CI3rI3):
CI3rI3=[05]
C_{I3} r_{I3} = \\begin{bmatrix} 0 \\\\ 5 \\end{bmatrix}
CI3rI3=[05]
再计算 (PT(CI3rI3))( P^T (C_{I3} r_{I3}) )(PT(CI3rI3)):
PT(CI3rI3)=[−0.343×0+0.147×51.929×0+1.538×5]=[0.7357.690]
P^T (C_{I3} r_{I3}) = \\begin{bmatrix}
-0.343 \\times 0 + 0.147 \\times 5 \\\\
1.929 \\times 0 + 1.538 \\times 5
\\end{bmatrix} = \\begin{bmatrix} 0.735 \\\\ 7.690 \\end{bmatrix}
PT(CI3rI3)=[−0.343×0+0.147×51.929×0+1.538×5]=[0.7357.690]
求解线性方程组:
[0.3260.4680.46815.648][q31q32]=[0.7357.690]
\\begin{bmatrix}
0.326 & 0.468 \\\\
0.468 & 15.648
\\end{bmatrix} \\begin{bmatrix} q_{31} \\\\ q_{32} \\end{bmatrix} = \\begin{bmatrix} 0.735 \\\\ 7.690 \\end{bmatrix}
[0.3260.4680.46815.648][q31q32]=[0.7357.690]
行列式:(0.326×15.648−0.4682=5.101−0.219=4.882)( 0.326 \\times 15.648 – 0.468^2 = 5.101 – 0.219 = 4.882 )(0.326×15.648−0.4682=5.101−0.219=4.882)
q31=15.648×0.735−0.468×7.6904.882=11.501−3.5994.882=7.9024.882≈1.619
q_{31} = \\frac{15.648 \\times 0.735 – 0.468 \\times 7.690}{4.882} = \\frac{11.501 – 3.599}{4.882} = \\frac{7.902}{4.882} \\approx 1.619
q31=4.88215.648×0.735−0.468×7.690=4.88211.501−3.599=4.8827.902≈1.619
q32=0.326×7.690−0.468×0.7354.882=2.507−0.3444.882=2.1634.882≈0.443
q_{32} = \\frac{0.326 \\times 7.690 – 0.468 \\times 0.735}{4.882} = \\frac{2.507 – 0.344}{4.882} = \\frac{2.163}{4.882} \\approx 0.443
q32=4.8820.326×7.690−0.468×0.735=4.8822.507−0.344=4.8822.163≈0.443
所以 (q3=[1.619,0.443])( q_3 = [1.619, 0.443] )(q3=[1.619,0.443])。
更新后的 Q 矩阵:
Q=[0.3660.591−1.0990.2671.6190.443]
Q = \\begin{bmatrix}
0.366 & 0.591 \\\\
-1.099 & 0.267 \\\\
1.619 & 0.443
\\end{bmatrix}
Q=0.366−1.0991.6190.5910.2670.443
7.4 第一次迭代完成后的推荐计算
预测 U1 对 I3 的偏好分数(U1 从未与 I3 交互过):
r^13=p1⋅q3T=(−0.343)×1.619+1.929×0.443
\\hat{r}_{13} = p_1 \\cdot q_3^T = (-0.343) \\times 1.619 + 1.929 \\times 0.443
r^13=p1⋅q3T=(−0.343)×1.619+1.929×0.443
=−0.555+0.854=0.299
= -0.555 + 0.854 = 0.299
=−0.555+0.854=0.299
预测 U2 对 I2 的偏好分数(U2 从未与 I2 交互过):
r^22=p2⋅q2T=0.147×(−1.099)+1.538×0.267
\\hat{r}_{22} = p_2 \\cdot q_2^T = 0.147 \\times (-1.099) + 1.538 \\times 0.267
r^22=p2⋅q2T=0.147×(−1.099)+1.538×0.267
=−0.162+0.411=0.249
= -0.162 + 0.411 = 0.249
=−0.162+0.411=0.249
预测 U1 对 I2 的偏好分数(U1 已与 I2 交互过,用于验证):
r^12=p1⋅q2T=(−0.343)×(−1.099)+1.929×0.267
\\hat{r}_{12} = p_1 \\cdot q_2^T = (-0.343) \\times (-1.099) + 1.929 \\times 0.267
r^12=p1⋅q2T=(−0.343)×(−1.099)+1.929×0.267
=0.377+0.515=0.892
= 0.377 + 0.515 = 0.892
=0.377+0.515=0.892
观察:U1 对已交互物品 I2 的预测分数(0.892)高于对未交互物品 I3 的预测分数(0.299),说明模型初步学到了 U1 的偏好。
7.5 多轮迭代后的收敛效果
经过数百轮交替迭代,P 和 Q 会收敛到稳定值。假设收敛后的参数为:
P=[0.851.200.300.95],Q=[0.700.500.200.900.600.30]
P = \\begin{bmatrix}
0.85 & 1.20 \\\\
0.30 & 0.95
\\end{bmatrix}, \\quad
Q = \\begin{bmatrix}
0.70 & 0.50 \\\\
0.20 & 0.90 \\\\
0.60 & 0.30
\\end{bmatrix}
P=[0.850.301.200.95],Q=0.700.200.600.500.900.30
最终预测 U1 对 I3 的偏好分数:
r^13=0.85×0.60+1.20×0.30=0.51+0.36=0.87
\\hat{r}_{13} = 0.85 \\times 0.60 + 1.20 \\times 0.30 = 0.51 + 0.36 = 0.87
r^13=0.85×0.60+1.20×0.30=0.51+0.36=0.87
最终预测 U2 对 I2 的偏好分数:
r^22=0.30×0.20+0.95×0.90=0.06+0.855=0.915
\\hat{r}_{22} = 0.30 \\times 0.20 + 0.95 \\times 0.90 = 0.06 + 0.855 = 0.915
r^22=0.30×0.20+0.95×0.90=0.06+0.855=0.915
推荐结果:
- 对 U1:I3 的偏好分数为 0.87,高于 I2(已交互,0.892),但 I3 是未交互物品,因此推荐 I3 给 U1。
- 对 U2:I2 的偏好分数为 0.915,是未交互物品中分数最高的,因此推荐 I2 给 U2。
8. 总结:从数据到推荐的全流程
| 1. 收集隐式反馈 | 用户行为日志(浏览、点击、购买) | 统计交互次数 (Cui)( C_{ui} )(Cui) | 交互次数矩阵 |
| 2. 构建隐式反馈矩阵 | 交互次数矩阵 | 有交互=1,无交互=0 | 二元矩阵 (rui)( r_{ui} )(rui) |
| 3. 计算置信度 | 交互次数矩阵 | (cui=1+αCui)( c_{ui} = 1 + \\alpha C_{ui} )(cui=1+αCui) | 置信度矩阵 |
| 4. 初始化 Q | — | 随机小值 | 初始 Q 矩阵 |
| 5. 固定 Q 求解 P | Q + 置信度 + 反馈矩阵 | (pu=(QTCuQ+λI)−1QTCuru)( p_u = (Q^T C_u Q + \\lambda I)^{-1} Q^T C_u r_u )(pu=(QTCuQ+λI)−1QTCuru) | 更新后的 P |
| 6. 固定 P 求解 Q | P + 置信度 + 反馈矩阵 | (qi=(PTCiP+λI)−1PTCiri)( q_i = (P^T C_i P + \\lambda I)^{-1} P^T C_i r_i )(qi=(PTCiP+λI)−1PTCiri) | 更新后的 Q |
| 7. 重复 5-6 | — | 直到收敛 | 最终 P 和 Q |
| 8. 推荐 | P 和 Q | 点积预测 + 排序 | Top-N 推荐列表 |
一句话记住 ALS + 隐式反馈:
ALS 用交替求解的方式,把“同时求 P 和 Q”的难题变成了“固定一个求另一个”的简单最小二乘问题。隐式反馈把评分预测变成了行为预测,而置信度加权和负样本采样让模型在极度稀疏的数据中依然能学到准确的用户偏好。



