• 协同过滤算法之—slope one算法


       之前转载的一篇推荐算法总结,里面提到了目前常用的推荐算法,其中第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

  • 相关阅读:
    c++设计模式总结
    Java复习(四)类的重用
    Java复习(三)类中的方法
    Java复习(二)类与对象的基本概念
    Java复习(一)——Java语言概述、开发环境、基础知识
    Java复数的加乘除运算
    人见人爱A+B
    noj快排
    noj最长公共子序列
    C语言里有没有sort函数?有!
  • 原文地址:https://www.cnblogs.com/iamccme/p/3080831.html
Copyright © 2020-2023  润新知