Slope One 算法详解:与矩阵分解、共现矩阵的异同

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 是协同过滤中的"轻量级选手",它不学习隐向量,而是直接利用物品间的平均评分差异进行预测,适合快速实现和增量更新;而矩阵分解是"重量级选手",通过隐向量学习获得更强的泛化能力,但计算成本更高。

相关推荐
Fuyo_11196 分钟前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
锋行天下11 分钟前
DeepSeek写Langgraph就是个大傻逼,一本正经胡说八道
前端·人工智能·后端
辰辰观影14 分钟前
字幕导入教程:外挂字幕一键加载方法
网络·经验分享
无糖可乐没有灵魂17 分钟前
Golang ❀ Netdiag 一个Go开源的网络排障信息收集工具
网络
Sarvartha25 分钟前
Date、LocalDate、LocalTime、LocalDateTime、DateTimeFormatter类
java
沃达德软件31 分钟前
智慧无人机图像识别分析技术
人工智能·目标检测·计算机视觉·目标跟踪·视觉检测·无人机
阿俊-全栈开发42 分钟前
LikeShop 多商户 Java 版商城微服务模块拆分与部署架构演进实践
java·微服务·架构·likeshop开源商城·多商户源码
染指11101 小时前
162.Agent-LangGraph-检查点的作用
人工智能·python·langchain·agents
FII工业富联科技服务1 小时前
从灯塔工厂到规模化智能运营:Omniverse Sim2Real与多智能体协同架构解析
人工智能·数字孪生·ai智能体·工业机器人·omniverse·柔性制造·灯塔工厂
合尘猫1 小时前
6GB 笔记本本地跑 Z-Image Turbo:一次从 cu121 到 cu130 的踩坑记录
人工智能·ai·大模型·本地部署