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

Slope One 方案

比方说我们有两个用户 $UserA$​​ 和 $UserB$ 以及他们对两个物体 $ItemI$ 和 $ItemJ$ 的评分。

$Item$ $i$ $Item$ $j$
$UserA$ 1.0 1.5
$UserB$ 2.0

我们可以预测 $UserB$ 对 $ItemJ$​​ 的分数是:

2

其中 $u$BI 表示 $UserB$ 对 $ItemI$​ 的评分 。带入可得:$u$​BI = 2.0 - (1.0 - 1.5) = 2.5

2

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

$Item$ $i$ $Item$ $j$ $Item$ $k$ $Item$ $l$ $Item$ $m$ $\overline{u}$
$UserA$ 1.5 1.0 1.2 1.0 2.0 1.34
$UserB$ 2.0 ? 4.0 2.1 4.0 3.03
$UserC$ 4.0 2.1 3.5 3.1 2.6 3.06
$UserD$ 3.0 2.3 2.0 2.1 1.0 2.08
$UserE$ 1.0 2.4 2.0 1.1 3.0 1.90

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

$Item$ $i$ $Item$ $j$ $Item$ $k$ $Item$ $l$ $Item$ $m$
$Item$ $i$ - 0.425 -0.24 0.42 -0.22
$Item$ $j$ -0.425 - 0.225 0.125 -0.2
$Item$ $k$ 0.24 -0.225 - 0.66 0.02
$Item$ $l$ -0.42 -0.125 -0.66 - -0.67
$Item$ $m$ 0.22 0.2 -0.02 0.67 -

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

3

其中 $dev_{ij}$ 表示 $Item$ $i$ 与 $Item$ $j$ 之间的偏差,$S_i(X)$ 表示训练集 $X$ 中所有包含物品 $i$ 的评分数组,$card(S)$ 表示在集合 $S$ 中元素的个数,$u_i$ 表示用户对物品 $i$ 的评分。

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

4

化简可得:

5

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

加权的 Slope One 方案

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

$Item$ $i$ $Item$ $j$ $Item$ $k$
$UserA$ 3.5 2.4 ?

$Item$ $i$ 和 $Item$ $j$ 的出现次数与评分分差:

$Item$ $i$ $Item$ $j$
$c$ 1000 30
$dev$ 0.5 0.2

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

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

6

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

两极 Slope One 方案

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

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

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

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

$Item$ $i$ $Item$ $j$ $Item$ $k$ $Item$ $l$ $Item$ $m$ $\overline{u}$
$UserA$ 1.5 1.0 1.2 1.0 2.0 1.34
$UserB$ 2.0 ? 4.0 2.1 4.0 3.03
$UserC$ 4.0 2.1 3.5 3.1 2.6 3.06
$UserD$ 3.0 2.3 2.0 2.1 1.0 2.08
$UserE$ 1.0 2.4 2.0 1.1 3.0 1.90

对于用户 $A$ 来说:

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

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

7

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

8

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

9