在传统基于内容的推荐系统中,根据商品特性的相似性来做推荐,例如:如果你购买了Machine Learning, Tom M.Mitchell这本书,系统会给你推荐The Elements of Statistical Learning, Trevor Hastie/Robert Tibshirani/Jerome Friedman。这两本都是机器学习领域的经典书籍,系统基于机器学习这个共同的特性做了上述推荐。
协同过滤(Collaborative Filtering)旨在基于用户行为或者说兴趣的相似性进行推荐,简单来说就是,如果用户U1买了商品P1但没有买P2,但是用户U2买了商品P1且买了商品P2,那么我们可以给用户U1推荐商品P2。
常用的协同过滤算法有item-based和user-based,常用于具有user-item关系矩阵时的推荐问题。其中item-based推荐将商品表示成用户是否购买的布尔向量,即将用户作为商品的特征,如果要判断买了item1是否要买item2,可以计算item1和item2的向量的相似度,计算方法有cosine、pearson相关系数、欧氏距离等。而user-based推荐将用户表示成商品是否被购买的向量,即将商品作为用户的特征,同样计算向量相似度就可以做推荐了。
协同过滤的另外一种简单而高效的方法是Slope One,这个算法适用于用户对商品评分预测问题。先看一个非常简单的例子:
User | Rating to Item 1 | Rating to Item 2 |
U1 | 9.5 | 4.5 |
U2 | 7.0 | 2.0 |
U3 | 8.0 | ? |
已知用户U1/U2对两个商品Item1和Item2的打分以及U3对Item1的打分,问U3对商品2的打分是?
Slope One 的答案非常简介:8. 0 – ((9.5 -4.5) + (7.0 – 2.0)/2 = 3.0。文字解释就是:先计算出其他对于对Item1和Item2打分差值的均值,再用U3对Item1打分减去这个均值。
为了扩展到更普适的情形,再来看另外一个略微复杂一点的例子:
User | Rating to Item 1 | Rating to Item 2 | Rating to Item 3 |
---|---|---|---|
John | 5.0 | 3.0 | 2.0 |
Mark | 3.0 | 4.0 | NULL |
Lucy | NULL | 2.0 | 5.5 |
问题是Lucy对Item1的评分是多少?
先看其他用户对Item1跟其他Item打分差值:
John和Mark对于Item1和Item2评分差的均值为: ((5.0 – 3.0) + (3.0 – 4.0))/2 = 0.5,再看John对于Item1和Item3评分差的均值为:(5.0 – 2.0) = 3.0。
那么Lucy对Item1的打分就是((2. 0 -(-0.5)) * 2 + (5.5 – (-3.0) * 1) / (2 + 1) = 13.5 / 3 = 4.5。文字解释就是看其他用户对Item1和其他Item打分差的均值,然后看自己第Item1和其他Item,用跟其他Item差值做加权平均。其中Item1和Item2打分差出现了2次,Item1和Item3打分差出现了1次。
总的来说,我们只需要存储商品对之间的评分插值以及评价次数即可,这对于处理商业推荐系统中的数据稀疏问题非常有用。
参考:
[1] http://zh.wikipedia.org/zh-cn/Slope_one