1. Slope One 算法是什么?
一句话概括 :Slope One 是一种基于物品的协同过滤算法 ,它通过计算物品之间的平均评分差异(偏差)来预测用户对未评分物品的评分。它的核心假设是:两个物品之间的评分差是固定的线性关系,即"用户对物品 i 的评分 ≈ 用户对物品 j 的评分 + 物品 i 与 j 的平均偏差"。
核心公式:
- 物品 i 相对于物品 j 的平均偏差:
dev(i,j)=1∣Uij∣∑u∈Uij(rui−ruj) \text{dev}(i, j) = \frac{1}{|U_{ij}|} \sum_{u \in U_{ij}} (r_{ui} - r_{uj}) dev(i,j)=∣Uij∣1u∈Uij∑(rui−ruj)
其中 (Uij)(U_{ij})(Uij) 是同时评过物品 i 和 j 的用户集合。 - 用户 u 对物品 i 的预测评分:
r^ui=1∣Iu∣∑j∈Iu(ruj+dev(i,j)) \hat{r}{ui} = \frac{1}{|I_u|} \sum{j \in I_u} (r_{uj} + \text{dev}(i, j)) r^ui=∣Iu∣1j∈Iu∑(ruj+dev(i,j))
其中 (Iu)(I_u)(Iu) 是用户 u 已评分的物品集合。
直观理解:如果看过《星球大战》的人平均比看过《泰坦尼克号》的人多打 1 分,那么一个给《泰坦尼克号》打 4 分的人,大概率会给《星球大战》打 5 分。
2. Slope One 与矩阵分解、共现矩阵的异同
| 对比维度 | 共现矩阵 | 矩阵分解 | Slope One |
|---|---|---|---|
| 本质 | 用户-物品评分矩阵(稀疏) | 将共现矩阵分解为低维隐向量 (P)(P)(P) 和 (Q)(Q)(Q) | 直接利用共现矩阵计算物品间的平均评分偏差 |
| 是否学习参数 | 不学习,只是数据 | 学习用户/物品隐向量(Embedding) | 不学习复杂参数,只统计偏差 |
| 模型复杂度 | 无 | 较高(需要梯度下降迭代) | 极低(一次统计即可) |
| 可解释性 | 无 | 隐向量含义较抽象 | 偏差值直观("物品 i 比 j 平均高多少分") |
| 冷启动 | 稀疏问题严重 | 可缓解(隐向量泛化) | 对共评用户少的物品偏差估计不准 |
| 增量更新 | --- | 需要重新训练 | 容易增量更新(新增评分只需更新偏差) |
| 预测方式 | 无法直接预测 | 点积 (pu⋅qiT)(p_u \cdot q_i^T)(pu⋅qiT) | 加权平均 (ruj+dev(i,j))(r_{uj} + \text{dev}(i,j))(ruj+dev(i,j)) |
核心异同:
- 相同点:都基于用户-物品共现矩阵,都是协同过滤方法,都利用已知评分预测未知评分。
- 不同点 :矩阵分解学习潜在因子 ,能捕捉用户和物品的深层特征;Slope One 只考虑物品间的平均差异,模型简单,但表达能力有限,容易受异常值影响。
3. 数值推导案例(基于之前的共现矩阵)
3.1 原始共现矩阵
| 用户 \ 物品 | I1 | I2 | I3 | I4 |
|---|---|---|---|---|
| U1 | 5 | 3 | ? | 1 |
| U2 | 4 | ? | ? | 2 |
| U3 | 1 | 1 | 5 | ? |
3.2 计算物品间的平均偏差 (dev(i,j))(\text{dev}(i,j))(dev(i,j))
同时评过 I1 和 I2 的用户:U1(5,3),U3(1,1)
- U1 的差值:(5−3=2)(5 - 3 = 2)(5−3=2)
- U3 的差值:(1−1=0)(1 - 1 = 0)(1−1=0)
- (dev(I1,I2)=2+02=1)(\text{dev}(I1, I2) = \frac{2+0}{2} = 1)(dev(I1,I2)=22+0=1)
- 因此 (dev(I2,I1)=−1)(\text{dev}(I2, I1) = -1)(dev(I2,I1)=−1)
同时评过 I1 和 I4 的用户:U1(5,1),U2(4,2)
- U1 差值:(5−1=4)(5 - 1 = 4)(5−1=4)
- U2 差值:(4−2=2)(4 - 2 = 2)(4−2=2)
- (dev(I1,I4)=4+22=3)(\text{dev}(I1, I4) = \frac{4+2}{2} = 3)(dev(I1,I4)=24+2=3)
- (dev(I4,I1)=−3)(\text{dev}(I4, I1) = -3)(dev(I4,I1)=−3)
同时评过 I1 和 I3 的用户:U3(1,5)
- 差值:(1−5=−4)(1 - 5 = -4)(1−5=−4)
- (dev(I1,I3)=−4)(\text{dev}(I1, I3) = -4)(dev(I1,I3)=−4)
- (dev(I3,I1)=4)(\text{dev}(I3, I1) = 4)(dev(I3,I1)=4)
同时评过 I2 和 I3 的用户:U3(1,5)
- 差值:(1−5=−4)(1 - 5 = -4)(1−5=−4)
- (dev(I2,I3)=−4)(\text{dev}(I2, I3) = -4)(dev(I2,I3)=−4)
- (dev(I3,I2)=4)(\text{dev}(I3, I2) = 4)(dev(I3,I2)=4)
其他物品对(如 I2-I4, I3-I4)没有共同评分用户,偏差未知,预测时忽略。
3.3 预测未知评分
预测 U1 对 I3 的评分
U1 已评分物品:(Iu={I1=5,I2=3,I4=1})(I_u = \{I1=5, I2=3, I4=1\})(Iu={I1=5,I2=3,I4=1})
- 使用 I1:(rU1,I1+dev(I3,I1)=5+4=9)(r_{U1,I1} + \text{dev}(I3, I1) = 5 + 4 = 9)(rU1,I1+dev(I3,I1)=5+4=9)
- 使用 I2:(rU1,I2+dev(I3,I2)=3+4=7)(r_{U1,I2} + \text{dev}(I3, I2) = 3 + 4 = 7)(rU1,I2+dev(I3,I2)=3+4=7)
- 使用 I4:(dev(I3,I4))(\text{dev}(I3, I4))(dev(I3,I4)) 未知,忽略。
预测值:
r^U1,I3=9+72=8 \hat{r}_{U1,I3} = \frac{9 + 7}{2} = 8 r^U1,I3=29+7=8
所以 U1 对 I3 的预测评分为 8。
预测 U2 对 I2 的评分
U2 已评分物品:(Iu={I1=4,I4=2})(I_u = \{I1=4, I4=2\})(Iu={I1=4,I4=2})
- 使用 I1:(rU2,I1+dev(I2,I1)=4+(−1)=3)(r_{U2,I1} + \text{dev}(I2, I1) = 4 + (-1) = 3)(rU2,I1+dev(I2,I1)=4+(−1)=3)
- 使用 I4:(dev(I2,I4))(\text{dev}(I2, I4))(dev(I2,I4)) 未知,忽略。
预测值:
r^U2,I2=31=3 \hat{r}_{U2,I2} = \frac{3}{1} = 3 r^U2,I2=13=3
所以 U2 对 I2 的预测评分为 3。
预测 U2 对 I3 的评分
U2 已评分物品:(Iu={I1=4,I4=2})(I_u = \{I1=4, I4=2\})(Iu={I1=4,I4=2})
- 使用 I1:(rU2,I1+dev(I3,I1)=4+4=8)(r_{U2,I1} + \text{dev}(I3, I1) = 4 + 4 = 8)(rU2,I1+dev(I3,I1)=4+4=8)
- 使用 I4:(dev(I3,I4))(\text{dev}(I3, I4))(dev(I3,I4)) 未知。
预测值:
r^U2,I3=81=8 \hat{r}_{U2,I3} = \frac{8}{1} = 8 r^U2,I3=18=8
所以 U2 对 I3 的预测评分为 8。
预测 U3 对 I4 的评分
U3 已评分物品:(Iu={I1=1,I2=1,I3=5})(I_u = \{I1=1, I2=1, I3=5\})(Iu={I1=1,I2=1,I3=5})
- 使用 I1:(rU3,I1+dev(I4,I1)=1+(−3)=−2)(r_{U3,I1} + \text{dev}(I4, I1) = 1 + (-3) = -2)(rU3,I1+dev(I4,I1)=1+(−3)=−2)
- 使用 I2:(dev(I4,I2))(\text{dev}(I4, I2))(dev(I4,I2)) 未知。
- 使用 I3:(dev(I4,I3))(\text{dev}(I4, I3))(dev(I4,I3)) 未知。
预测值:
r^U3,I4=−21=−2 \hat{r}_{U3,I4} = \frac{-2}{1} = -2 r^U3,I4=1−2=−2
预测为负数,实际中需要截断到评分范围 1,5,因此可设为 1。
3.4 与矩阵分解预测结果对比
之前矩阵分解(收敛后)的预测:
- U1 对 I3:(p1⋅q3T=2.5×0.2+1.8×1.8=3.74)(p_1 \cdot q_3^T = 2.5 \times 0.2 + 1.8 \times 1.8 = 3.74)(p1⋅q3T=2.5×0.2+1.8×1.8=3.74)
- U2 对 I2:(p2⋅q2T=2.3×1.5+0.5×0.2=3.55)(p_2 \cdot q_2^T = 2.3 \times 1.5 + 0.5 \times 0.2 = 3.55)(p2⋅q2T=2.3×1.5+0.5×0.2=3.55)
- U2 对 I3:(p2⋅q3T=2.3×0.2+0.5×1.8=1.36)(p_2 \cdot q_3^T = 2.3 \times 0.2 + 0.5 \times 1.8 = 1.36)(p2⋅q3T=2.3×0.2+0.5×1.8=1.36)
- U3 对 I4:(p3⋅q4T=0.3×0.5+2.8×0.3=0.99)(p_3 \cdot q_4^T = 0.3 \times 0.5 + 2.8 \times 0.3 = 0.99)(p3⋅q4T=0.3×0.5+2.8×0.3=0.99)
对比表:
| 预测项 | Slope One | 矩阵分解 |
|---|---|---|
| U1-I3 | 8 | 3.74 |
| U2-I2 | 3 | 3.55 |
| U2-I3 | 8 | 1.36 |
| U3-I4 | -2(截断为1) | 0.99 |
分析:
- Slope One 严重依赖物品间的平均偏差,当共评用户少时,偏差估计可能不准确(例如 I1 和 I3 只有 U3 一个共同评分,导致偏差被极端值主导)。
- 矩阵分解通过隐向量学习,能更好地平滑和泛化,预测值更合理。
- Slope One 的优点是计算简单、可增量更新,适合对实时性要求高、物品数量不多的场景。
4. 总结
| 概念 | 核心思想 | 优点 | 缺点 |
|---|---|---|---|
| 共现矩阵 | 用户-物品评分矩阵,稀疏 | 直观,是协同过滤的基础 | 稀疏,无法直接预测 |
| 矩阵分解 | 分解为低维隐向量,点积预测 | 泛化能力强,能捕捉潜在因子 | 训练复杂,可解释性差 |
| Slope One | 统计物品间平均偏差,加权预测 | 简单,可增量更新,易于实现 | 依赖共评数据,对稀疏和异常值敏感 |
一句话总结:Slope One 是协同过滤中的"轻量级选手",它不学习隐向量,而是直接利用物品间的平均评分差异进行预测,适合快速实现和增量更新;而矩阵分解是"重量级选手",通过隐向量学习获得更强的泛化能力,但计算成本更高。