之前转载的一篇推荐算法总结,里面提到了目前常用的推荐算法,其中第1,2,4种算法都属于协同过滤算法(Collaborative Filtering)。 可见协同过滤已经成为推荐系统中最为常用的算法之一。
而Slope One算法做为一种简单高效的协同过滤算法,最大优点在于算法很简单, 易于实现, 执行效率高。
一. 基本概念
Slope One的基本概念很简单, 例子1, 用户X, Y和A都对Item1打了分. 同时用户X,Y还对Item2打了分, 用户A对Item2可能会打多少分呢?
User | Rating to Item 1 | Rating to Item 2 |
X | 5 | 3 |
Y | 4 | 3 |
A | 4 | ? |
根据SlopeOne算法, 应该是:4 - ((5-3) + (4-3))/2 = 2.5.
解释一下. 用户X对Item1的rating是5, 对Item2的rating是3, 那么他可能认为Item2应该比Item1少两分. 同时用户Y认为Item2应该比Item1少1分. 据此我们知道所有对Item1和Item2都打了分的用户认为Item2会比Item1平均少1.5分. 所以我们有理由推荐用户A可能会对Item2打(4-1.5)=2.5分;
很简单是不是? 找到对Item1和Item2都打过分的用户, 算出rating差的平均值, 这样我们就能推测出对Item1打过分的用户A对Item2的可能Rating, 并据此向A用户推荐新项目.
这里我们能看出Slope One算法的一个很大的优点, 在只有很少的数据时候也能得到一个相对准确的推荐, 这一点可以解决Cold Start的问题.
当然这个只是个算例简单地说明下原理,当user和item都很多的时候,你可以用加权的办法来做。
二.加权Slope one算法
接下来我们看看加权算法(Weighted Slope One). 如果有100个用户对Item1和Item2都打过分, 有1000个用户对Item3和Item2也打过分. 显然这两个rating差的权重是不一样的. 因此我们的计算方法是
(100*(Rating 1 to 2) + 1000(Rating 3 to 2)) / (100 + 1000)
为什么我会感觉这个算法的效果会不理想呢?因为,这个算法总是把你的口味和大众的平均口味作对等,推荐出来的东西很难是非常个性化的。很容易让很多用户的推荐结果趋向一致,也就是大数的平均值,也即大众的平均口味。
三.Slope one算法变种
昨天跟室友聊到了他小论文的方向,就是对Slope one进行优化。Slope one算法最被人诟病的一个问题就是没有个性化。现在很多优化都是将slope one算法跟其它个性化算法结合起来。比如我室友就是将Slope one算法与 基于标签的推荐算法结合起来,来实现个性化。
说一下他的思路吧。还以上一个例子为例。他假定我们对于每一个Item有一些标签。比如对于电影Item,有4个维度的标签 [导演,主演, 影片类型, 语种]。
首先我们定义两个item Item1, Item2的Jaccard相似度: Sim(Item1, Item2) = |Item1,Item2的交集| / |Item1,Item2的并集|
设R[Item1]为用户对Item1的评分, R_tag[Item1]为基于标签的推荐算法求得的用户对Item1的评分预测。
假设跟Item3最为相似的Item为 Item1 和 Item2, 那么应用基于标签的推荐对Item3的评分值 :
R_tag[Item3] = (R[Item1] * sim(Item1, Item3) + R[Item2] * sim(Item2, Item3)) / (sim(Item1, Item3) + sim(Item2, Item3) )
而基于Slope one算法求得的用户对于Item1的评分预测为 R_Slope[Item1]
利用一个可变参数 λ 来对两种参数进行调权:
R_PRE[Item1] = λ * R_Slope[Item1] + (1 - λ)* R_tag[Item1]
λ可根据实验结果进行调节。
目前有许多种讲个性化推荐算法与Slope one算法结合起来的研究,可见Slope算法还是很有用的一种协同过滤算法。
参考: http://www.cnblogs.com/kuber/archive/2008/06/10/1216846.html