Slope One 是一系列应用于协同过滤的算法的统称。由 Daniel Lemire和Anna Maclachlan于2005年发表的论文中提出。

Slope One 方案

比方说我们有两个用户 UserAUserA​​ 和 UserBUserB 以及他们对两个物体 ItemIItemIItemJItemJ 的评分。

ItemItem ii ItemItem jj
UserAUserA 1.0 1.5
UserBUserB 2.0

我们可以预测 UserBUserBItemJItemJ​​ 的分数是:

2

其中 uuBI 表示 UserBUserBItemIItemI​ 的评分 。带入可得:uuBI = 2.0 - (1.0 - 1.5) = 2.5

2

我们可以将数据集扩展一下:

ItemItem ii ItemItem jj ItemItem kk ItemItem ll ItemItem mm u\overline{u}
UserAUserA 1.5 1.0 1.2 1.0 2.0 1.34
UserBUserB 2.0 ? 4.0 2.1 4.0 3.03
UserCUserC 4.0 2.1 3.5 3.1 2.6 3.06
UserDUserD 3.0 2.3 2.0 2.1 1.0 2.08
UserEUserE 1.0 2.4 2.0 1.1 3.0 1.90

基于上述的方法我们可以得到「物品之间的评分偏差矩阵」:

ItemItem ii ItemItem jj ItemItem kk ItemItem ll ItemItem mm
ItemItem ii - 0.425 -0.24 0.42 -0.22
ItemItem jj -0.425 - 0.225 0.125 -0.2
ItemItem kk 0.24 -0.225 - 0.66 0.02
ItemItem ll -0.42 -0.125 -0.66 - -0.67
ItemItem mm 0.22 0.2 -0.02 0.67 -

物品的评分偏差计算方法如下:

3

其中 devijdev_{ij} 表示 ItemItem iiItemItem jj 之间的偏差,Si(X)S_i(X) 表示训练集 XX 中所有包含物品 ii 的评分数组,card(S)card(S) 表示在集合 SS 中元素的个数,uiu_i 表示用户对物品 ii 的评分。

再根据这个偏差,我们可以预测用户 BB 对物品 jj 的评分:

4

化简可得:

5

简而言之,Slope One 通过「共同用户」物品的平均打分,来预测某用户下一物品的打分。

加权的 Slope One 方案

从「评分预测」来看,打分用户数对评分偏差没有影响。也就是说,不管有多少用户给某两个物品打分,我们只是取所有物品评分差的平均值。比如我们有 UserAUserA​ 的打分表:

ItemItem ii ItemItem jj ItemItem kk
UserAUserA 3.5 2.4 ?

ItemItem iiItemItem jj 的出现次数与评分分差:

ItemItem ii ItemItem jj
cc 1000 30
devdev 0.5 0.2

按 Slope One 算法来计算的话打分为:P(uk)P(u_k)​​​ = (3.5 + 2.4) / 2 + (0.5 + 0.2) / 2 = 3.3

那么我们可以对评分分差「加权」:

6

这样计算结果就是:P(uk)P(u_k) = (1000(3.5+0.5)+30(2.4+0.2))1000+30\frac{(1000*(3.5+0.5) + 30*(2.4+0.2))}{1000+30}​ = 3.96

两极 Slope One 方案

在上面这个例子我们发现频繁出现的部分对于预测的影响过于强大。我们将使用新的方法把数据集分成两个部分:

  • 用户喜欢的:Slike(u)={iS(u)ui>u}S^{like}(u) = \left\{i \in S(u) | u_i > \overline{u}\right\}
  • 用户不喜欢的:Sdislike(u)={iS(u)ui<u}S^{dislike}(u) = \left\{i \in S(u) | u_i < \overline{u}\right\}

我们认为,只有两个用户对某物品的评分一致的时候,这个评分才是有效的(两个用户对同一物品的评价都是喜欢或者都是不喜欢的时候)。其实这个时候我们开始简单地考虑了用户之间的相似度(都喜欢或者都不喜欢同一物品可以侧面反映用户的相似度)。

我们还是以之前的数据集为例:

ItemItem ii ItemItem jj ItemItem kk ItemItem ll ItemItem mm u\overline{u}
UserAUserA 1.5 1.0 1.2 1.0 2.0 1.34
UserBUserB 2.0 ? 4.0 2.1 4.0 3.03
UserCUserC 4.0 2.1 3.5 3.1 2.6 3.06
UserDUserD 3.0 2.3 2.0 2.1 1.0 2.08
UserEUserE 1.0 2.4 2.0 1.1 3.0 1.90

对于用户 AA 来说:

  • Slike={i,m}S^{like} = \left\{i, m\right\}
  • Sdislike={j,k,l}S^{dislike} = \left\{j, k, l\right\}

所以我们可以把物品的评分合集划分成两个部分:

7

同理,偏差值的计算也有两部分:

8

则预测分数的时候我们需要考虑喜欢和不喜欢两个偏差

9