Slope One 算法试图同时满足这样的的5个目标:
1) 易于实现和维护:普通工程师可以轻松解释所有的聚合数据,并且算法易于实现和测试。
2) 运行时可更新的:新增一个评分项,应该对预测结果即时产生影响。
3) 高效率的查询响应:快速的执行查询,可能需要付出更多的空间占用作为代价。
4) 对初次访问者要求少:对于一个评分项目很少的用户,也应该可以获得有效的推荐。
5) 合理的准确性:与最准确的方法相比,此方法应该是有竞争力的,准确性方面的微小增长不能以简单性和扩展性的大量牺牲为代价。
Slope One算法的核心思想非常的简单,基于所谓的“热门度差异”,也就是用户对物品的评分差异。举个简单的例子:
item1 | item2 | |
user1 | 3 | 6 |
user2 | 4 | ? |
表1:user对item的打分表
在表1中,我们知道user2对item1打3分,对item2打6分,User2对item1打4分。基于表1的打分数据我们如何预测user2对item2的打分呢。简单的方法,就是user2给item1的打分加上user1对两个item打分的相对差值,也就是:
p(user2, item2) = 4 + (6 – 3) = 7。
从上可知,问题就是寻找形如f(x) = x + b 这样的函数(这就是“slope one”命名的由来),来根据已知对item的打分情况去预测未知item的打分。再看一个复杂的例子:
item1 | item2 | item3 | |
user1 | 2 | 6 | 3 |
user2 | 3 | 4 | |
user3 | 4 | 5 | ? |
表2 user对item的打分表
从表中可以看到,user1和user3对3个物品均有打分,而user2只对item1和item3打分。item1和item3同时有2次打分,相对于item1,item3被user1打高了1分(3 – 2),被user2打高了1分(4 – 3),最终item3相对于item1的距离就是(1 + 1)/2 = 1。根据user3对item1的打分,对item3的预测打分应该是:p(users, item3) = 4 + 0.5 = 4.5。相对于item2,item3被user1被打了-3分(3 – 6)。item1有两次打分,item2仅有一次打分,上述计算方法并未考虑到这些。因此,应该给那些同时评分更多的偏移距离更大的权重,则:
在原始的paper中给出了三个算法,接下来从数学的角度来理解一算法。
1. Slope One
算法的主要思想来自于简单的一元线性模型f(x) = x + b。已知一些点对(xi, yi),其中i为正整数。使用上述线性模型来最小化预测误差的平方和,可以得到:
利用上式就可以计算得到b的值,然后,对于新的xi,使用我们可以利用f(x) = x + b来计算xi预测值。事实上,求b的值就是xi和yi差值的平均值。
利用上面的方法,可以得到ItemJ相对于ItemI的平均偏差:
其中,Sj,i(c)表示同时对item i和j打分的user set,而 card(Sj,i(c))表示user set中的user数。基于上面的公式,ui 对item j的预测值就等devj,i + ui 。最后把这些所有的预测值加起来进行平均就可以得到:
其中,Rj表示所有用户u已经给予评分且满足条件(i ¹ j且card(Sj,i(c))>0) 的item set。若是数据集足够的稠密,就可以使用近似的方法:
进而将把上面的预测公式进行简化得到:
2. Weighted Slope One
在上面的计算过程中,会发现一个问题,相对于item j,在计算 item i平均偏差devj,i时,并没有考虑到不同的用户数量对devj,i计算的影响。简单来说,一万个user都给了item j和i进行打分,而只有1个user对item j 和 m进行打分,那么最终计算得到的devj,i肯定会比devj,m更加的可信。因此,必须对最终的相对不同item计算得到的平均偏差进行加权,得到:
其中:
3. Bi-Polar Slope One
Bi-Polar Slope One 算法的主要思想是,对于user已经打过分的item,将其划分为两类:like和dislike,而其划分的依据就是将对应的评分和当前user的平均评分进行比较:
同样的方法,就可以界定对item i 和 j 具有共同喜好的user set:
基于上面的方法,可以对like或者dislike的item计算得到新的偏差值:
然后,就可以计算相对于item i的预测值:
最终,就可以计算得到整个算法的预测值:
使用MAE衡量算法的效果,得到的结果如下:
原始paper:
算法实现:
tutorial about how to implement Slope One in Python
详细的实验分析:
Slope One Predictors for Online Rating-Based Collaborative Filtering
来源:http://in.sdo.com/?p=2103