欢迎光临
我们一直在努力

交替最小二乘(ALS)与隐式反馈

1. 交替最小二乘(ALS)是什么?

一句话概括:ALS 是矩阵分解的一种优化算法。

它的核心思想是——P 和 Q 两个矩阵都是未知的,那就先随机固定一个,求解另一个;再固定刚求出的那个,回头求解第一个;如此交替迭代,直到收敛。

核心逻辑:

目标:R≈P×QTR ≈ P × Q^TRP×QT

难点:P 和 Q 都不知道,无法直接求解

ALS 的解法:

  • 第 1 步:随机初始化 Q
  • 第 2 步:固定 Q,把 P 当作未知数,用最小二乘法直接求出 P
  • 第 3 步:固定 P,把 Q 当作未知数,用最小二乘法直接求出 Q
  • 第 4 步:重复第 2~3 步,直到误差收敛

为什么叫“交替”:因为我们在 P 和 Q 之间来回切换,交替地优化它们。

为什么叫“最小二乘”:因为每一步都是在求解一个标准的最小二乘问题(线性回归),有闭式解,不需要梯度下降。


2. ALS 与梯度下降(SGD)的对比

对比维度SGDALS
优化方式 逐样本更新,沿梯度方向走一小步 固定一个矩阵,对另一个矩阵求闭式解
是否可并行 样本之间可并行,但参数更新有依赖 用户之间、物品之间完全独立,极易并行
收敛速度 通常需要较多轮 在隐式反馈场景下,通常收敛更快
隐式反馈支持 需要额外设计 天然支持加权(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),会导致:

  • 正负样本极度不平衡(1 个正样本 vs 10000 个负样本)。
  • 计算量巨大(需要遍历所有用户-物品对)。
  • 信息偏差:用户没有交互,可能只是因为他不知道这个物品的存在,而不是不喜欢。
  • 解决方案:只采样一部分缺失值作为负样本。

    两种采样方法:

    方法做法效果
    均匀随机采样 从所有缺失值中随机抽取,数量与正样本相同 简单,但不够精准
    按物品热门程度采样 越热门的物品,越可能被采为负样本 实践中更有效,因为热门物品用户大概率知道,没交互就是真的不感兴趣

    核心直觉:一个越热门的物品,用户越可能知道它的存在。如果用户知道它却没有交互,那这很可能是一个真正的负样本。


    6. 加权交替最小二乘(Weighted-ALS)

    目标函数:
    min⁡p∗,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,qmin(u,i)Kcui(ruipuqiT)2+λ(pu2+qi2)

    置信度:
    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 数据准备

    用户-物品隐式反馈次数矩阵:

    用户 \\ 物品I1I2I3
    U1 3 1 0
    U2 2 0 4

    转换为隐式反馈矩阵 (rui)( r_{ui} )(rui)(有交互=1,无交互=0):

    用户 \\ 物品I1I2I3
    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):

    用户 \\ 物品I1I2I3
    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.940.622=0.53580.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.00.62×1.6=0.15140.940.992=0.15140.0520.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.60.62×1.0=0.15140.9120.62=0.15140.2921.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.181.682=3.20462.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.81.68×3.6=0.38226.1046.048=0.38220.0560.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.61.68×2.8=0.38225.2924.704=0.38220.5881.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.63541.96831.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.63541.96831.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.02963.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.155420.556+24.269=10.15543.7130.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.8341.832=10.15546.0020.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.3571.0971.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.3571.0971.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.5371.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.3346.797+4.232=2.3342.5651.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.3770.753=2.3340.6240.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.6480.4682=5.1010.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.7350.468×7.690=4.88211.5013.599=4.8827.9021.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.6900.468×0.735=4.8822.5070.344=4.8822.1630.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.3661.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=p1q3T=(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=p2q2T=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=p1q2T=(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”的难题变成了“固定一个求另一个”的简单最小二乘问题。隐式反馈把评分预测变成了行为预测,而置信度加权和负样本采样让模型在极度稀疏的数据中依然能学到准确的用户偏好。

    赞(0)
    未经允许不得转载:171主机测评 » 交替最小二乘(ALS)与隐式反馈
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址