浅谈推荐算法–Slope One

       Slope One 推荐算法是2005年由 Daniel Lemire 教授在香港的 WWW 会议上提出的一个 Item-Based 推荐算法。很多人都会发现,股票上的很多技术指标都是不同时间间隔的平均值的柱状图活曲线图等,这是因为,股票上一直有个说法,那就是平均值可以掩盖一切异常波动。类似的,Slope one推荐算法也是认为:平均值可以调和不同用户对物品的评分差异。

        Slope One 算法试图同时满足这样的的5个目标:

        1)      易于实现和维护:普通工程师可以轻松解释所有的聚合数据,并且算法易于实现和测试。

        2)      运行时可更新的:新增一个评分项,应该对预测结果即时产生影响。

        3)      高效率的查询响应:快速的执行查询,可能需要付出更多的空间占用作为代价。

        4)      对初次访问者要求少:对于一个评分项目很少的用户,也应该可以获得有效的推荐。

        5)      合理的准确性:与最准确的方法相比,此方法应该是有竞争力的,准确性方面的微小增长不能以简单性和扩展性的大量牺牲为代价。

       Slope One算法的核心思想非常的简单,基于所谓的“热门度差异”,也就是用户对物品的评分差异。举个简单的例子:

 

item1

item2

user1

3

6

user2

4

表1:useritem的打分表

       在表1中,我们知道user2item1打3分,对item2打6分,User2item1打4分。基于表1的打分数据我们如何预测user2item2的打分呢。简单的方法,就是user2item1的打分加上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 useritem的打分表

       从表中可以看到,user1user3对3个物品均有打分,而user2只对item1item3打分。item1item3同时有2次打分,相对于item1item3user1打高了1分(3 – 2),被user2打高了1分(4 – 3),最终item3相对于item1的距离就是(1 + 1)/2 = 1。根据user3item1的打分,对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的值就是xiyi差值的平均值。

      利用上面的方法,可以得到ItemJ相对于ItemI的平均偏差:

      其中,Sj,i(c)表示同时对item ij打分的user set,而 card(Sj,i(c))表示user set中的user数。基于上面的公式,ui 对item j的预测值就等devj,i + ui 。最后把这些所有的预测值加起来进行平均就可以得到:

      其中,Rj表示所有用户u已经给予评分且满足条件(i ¹ jcard(Sj,i(c))>0) 的item set。若是数据集足够的稠密,就可以使用近似的方法:

      进而将把上面的预测公式进行简化得到:

        2.          Weighted Slope One

在上面的计算过程中,会发现一个问题,相对于item j,在计算 item i平均偏差devj,i时,并没有考虑到不同的用户数量对devj,i计算的影响。简单来说,一万个user都给了item ji进行打分,而只有1个useritem j 和 m进行打分,那么最终计算得到的devj,i肯定会比devj,m更加的可信。因此,必须对最终的相对不同item计算得到的平均偏差进行加权,得到:

       其中:

       3.          Bi-Polar Slope One

       Bi-Polar Slope One 算法的主要思想是,对于user已经打过分的item,将其划分为两类:likedislike,而其划分的依据就是将对应的评分和当前user的平均评分进行比较:

        同样的方法,就可以界定对item i 和 具有共同喜好的user set

        基于上面的方法,可以对like或者dislikeitem计算得到新的偏差值:

         然后,就可以计算相对于item i的预测值:

         最终,就可以计算得到整个算法的预测值:

 

         使用MAE衡量算法的效果,得到的结果如下:

 

原始paper:

Slope One Predictors for Online Rating-Based Collaborative Filtering, Daniel Lemire, Anna Maclachlan, 2005

算法实现:

tutorial about how to implement Slope One in Python

详细的实验分析:

Slope One Predictors for Online Rating-Based Collaborative Filtering


来源:http://in.sdo.com/?p=2103

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值