title: 经典推荐算法之 Slope one

date: 2017/5/16 15:29:24

tags:

推荐系统

Machine Learning

categories: 推荐系统

Slope One 是一系列应用于协同过滤的算法的统称。由 Daniel Lemire和Anna Maclachlan于2005年发表的论文中提出。 有争议的是,该算法堪称基于项目评价的non-trivial 协同过滤算法最简洁的形式。该系列算法的简洁特性使它们的实现简单而高效,而且其精确度与其它复杂费时的算法相比也不相上下。 该系列算法也被用来改进其它算法。

协同过滤简介及其主要优缺点

协同过滤推荐(Collaborative Filtering recommendation)在信息过滤和信息系统中正迅速成为一项很受欢迎的技术。与传统的基于内容过滤直接分析内容进行推荐不同,协同过滤分析用户兴趣,在用户群中找到指定用户的相似(兴趣)用户,综合这些相似用户对某一信息的评价,形成系统对该指定用户对此信息的喜好程度预测。 与传统文本过滤相比,协同过滤有下列优点:

能够过滤难以进行机器自动基于内容分析的信息。如艺术品、音乐。

能够基于一些复杂的,难以表达的概念(信息质量、品位)进行过滤。

推荐的新颖性。

尽管协同过滤技术在个性化推荐系统中获得了极大的成功,但随着站点结构、内容的复杂度和用户人数的不断增加,协同过滤技术的一些缺点逐渐暴露出来。 主要有以下三点:

稀疏性(sparsity):在许多推荐系统中,每个用户涉及的信息量相当有限,在一些大的系统如亚马逊网站中,用户最多不过就评估了上百万本书的1%~2%。造成评估矩阵数据相当稀疏,难以找到相似用户集,导致推荐效果大大降低。

扩展性(scalability):“最近邻居”算法的计算量随着用户和项的增加而大大增加,对于上百万之巨的数目,通常的算法将遭遇到严重的扩展性问题。

精确性(accuracy):通过寻找相近用户来产生推荐集,在数量较大的情况下,推荐的可信度随之降低。

Item-based协同过滤 和 过拟合

当可以对一些项目评分的时候,比如人们可以对一些东西给出1到5星的评价的时候,协同过滤意图基于一个个体过去对某些项目的评分和(庞大的)由其他用户的评价构成的数据库,来预测该用户对未评价项目的评分。 例如: 如果一个人给披头士的评分为5(总分5)的话,我们能否预测他对席琳狄翁新专辑的评分呢?

这种情形下, item-based 协同过滤系统根据其它项目的评分来预测某项目的分值,一般方法为 线性回归 (

). 于是,需要列出x2个线性回归方程和2x2个回归量,例如:当有1000个项目时,需要列多达1,000,000个线性回归方程, 以及多达2,000,000个回归量。除非我们只选择某些用户共同评价过的项目对,否则协同过滤会遇到过拟合问题。

另外一种更好的方法是使用更简单一些的式子,比如

实验证明当使用一半的回归量的时候,该式子(称为Slope One)的表现有时优于线性回归方程。该简化方法也不需要那么多存储空间和延迟。

Item-based 协同过滤只是协同过滤的一种形式.其它还有像 user-based 协同过滤一样研究用户间的联系的过滤系统。但是,考虑到其他用户数量庞大,item-based协同过滤更可行一些。

电子商务中的Item-based协同过滤

人们并不总是能给出评分,当用户只提供二进制数据(购买与否)的时候,就无法应用Slope One 和其它基于评分的算法。 二进制 item-based协同过滤应用的例子之一就是Amazon的 item-to-item 专利算法,该算法中用二进制向量表示用户-项目购买关系的矩阵,并计算二进制向量间的cosine相关系数。

有人认为Item-to-Item 算法甚至比Slope One 还简单,例如:

在本例当中,项目1和项目2间的cosine相关系数为:

项目1和项目3间的cosine相关系数为:

而项目2和项目3的cosine相关系数为:

于是,浏览项目1的顾客会被推荐买项目3(两者相关系数最大),而浏览项目2的顾客会被推荐买项目3,浏览了项目3的会首先被推荐买项目1(再然后是项目2,因为2和3的相关系数小于1和3)。该模型只使用了每对项目间的一个参数(cosine相关系数)来产生推荐。因此,如果有n个项目,则需要计算和存储 n(n-1)/2 个cosine相关系数。

Slope One 协同过滤

为了大大减少过适(过拟合)的发生,提升算法简化实现, Slope One 系列易实现的Item-based协同过滤算法被提了出来。本质上,该方法运用更简单形式的回归表达式

和单一的自由参数,而不是一个项目评分和另一个项目评分间的线性回归

。 该自由参数只不过就是两个项目评分间的平均差值。甚至在某些实例当中,它比线性回归的方法更准确[2],而且该算法只需要一半(甚至更少)的存储量。

例:

User A 对 Item I 评分为1 对Item J.评分为1.5

User B 对 Item I 评分为2.

你认为 User B 会给 Item J 打几分?

Slope One 的答案是:2.5 (1.5-1+2=2.5).

举个更实际的例子,考虑下表:

在本例中,项目2和1之间的平均评分差值为 (2+(-1))/2=0.5. 因此,item1的评分平均比item2高0.5。同样的,项目3和1之间的平均评分差值为3。因此,如果我们试图根据Lucy 对项目2的评分来预测她对项目1的评分的时候,我们可以得到 2+0.5 = 2.5。同样,如果我们想要根据她对项目3的评分来预测她对项目1的评分的话,我们得到 5+3=8.

如果一个用户已经评价了一些项目,可以这样做出预测:简单地把各个项目的预测通过加权平均值结合起来。当用户两个项目都评价过的时候,权值就高。在上面的例子中,项目1和项目2都评价了的用户数为2,项目1和项目3 都评价了的用户数为1,因此权重分别为2和1. 我们可以这样预测Lucy对项目1的评价:

于是,对“n”个项目,想要实现 Slope One,只需要计算并存储“n”对评分间的平均差值和评价数目即可。

步骤

计算物品之间的评分差的均值,记为物品间的评分偏差(两物品同时被评分)

根据物品间的评分偏差和用户的历史评分,预测用户对未评分的物品的评分。

将预测评分排序,取topN对应的物品推荐给用户。

举例

假设有100个人对物品A和物品B打分了,R(AB)表示这100个人对A和B打分的平均偏差;有1000个人对物品B和物品C打分了, R(CB)表示这1000个人对C和B打分的平均偏差;

应用Slope One的推荐系统

● hitflip DVD推荐系统

● How Happy

● inDiscover MP3推荐系统

● RACOFI Composer

● Value Investing News 股票新闻网站

● AllTheBests 购物推荐引擎

Python 实现

def loadData():

items={'A':{1:5,2:3},

'B':{1:3,2:4,3:2},

'C':{1:2,3:5}}

users={1:{'A':5,'B':3,'C':2},

2:{'A':3,'B':4},

3:{'B':2,'C':5}}

return items,users

#***计算物品之间的评分差

#items:从物品角度,考虑评分

#users:从用户角度,考虑评分

def buildAverageDiffs(items,users,averages):

#遍历每条物品-用户评分数据

for itemId in items:

for otherItemId in items:

average=0.0 #物品间的评分偏差均值

userRatingPairCount=0 #两件物品均评过分的用户数

if itemId!=otherItemId: #若无不同的物品项

for userId in users: #遍历用户-物品评分数

userRatings=users[userId] #每条数据为用户对物品的评分

#当前物品项在用户的评分数据中,且用户也对其他物品由评分

if itemId in userRatings and otherItemId in userRatings:

#两件物品均评过分的用户数加1

userRatingPairCount+=1

#评分偏差为每项当前物品评分-其他物品评分求和

average+=(userRatings[otherItemId]-userRatings[itemId])

averages[(itemId,otherItemId)]=average/userRatingPairCount

#***预测评分

#users:用户对物品的评分数据

#items:物品由哪些用户评分的数据

#averages:计算的评分偏差

#targetUserId:被推荐的用户

#targetItemId:被推荐的物品

def suggestedRating(users,items,averages,targetUserId,targetItemId):

runningRatingCount=0 #预测评分的分母

weightedRatingTotal=0.0 #分子

for i in users[targetUserId]:

#物品i和物品targetItemId共同评分的用户数

ratingCount=userWhoRatedBoth(users,i,targetItemId)

#分子

weightedRatingTotal+=(users[targetUserId][i]-averages[(targetItemId,i)])\

*ratingCount

#分母

runningRatingCount+=ratingCount

#返回预测评分

return weightedRatingTotal/runningRatingCount

# 物品itemId1与itemId2共同有多少用户评分

def userWhoRatedBoth(users,itemId1,itemId2):

count=0

#用户-物品评分数据

for userId in users:

#用户对物品itemId1与itemId2都评过分则计数加1

if itemId1 in users[userId] and itemId2 in users[userId]:

count+=1

return count

if __name__=='__main__':

items,users=loadData()

averages={}

#计算物品之间的评分差

buildAverageDiffs(items,users,averages)

#预测评分:用户2对物品C的评分

predictRating=suggestedRating(users,items,averages,2,'C')

print 'Guess the user will rate the score :',predictRating

结果:用户2对物品C的预测分值为

Guess the user will rate the score : 3.33333333333

Slop one 增量更新

主要方法在于根据新的评分项,更新偏差表与共同评分项个数

维基百科

推荐算法之 slope one 算法

黄明波. 基于Slope One算法的增量音乐推荐系统的设计与实现[D].重庆大学,2016

slope one matlab代码,经典推荐算法之 Slope one相关推荐

  1. Matlab代码:ADMM算法在考虑碳排放交易的电力系统最优潮流中的应用

    Matlab代码:ADMM算法在考虑碳排放交易的电力系统最优潮流中的应用 关键词:交替方向乘子法, ADMM , 最优潮流 ,碳排放, 分布式优化 仿真软件:Matlab软件调用cplex求解器进行求 ...

  2. 经典推荐算法(基于内容的推荐算法)

    基于内容的推荐算法(Content-Based Recommendations,CB)是一种经典推荐算法,一般只依赖于用户及物品自身的内容属性和行为属性,而不涉及其他用户 的行为,在 冷启动 的情况下 ...

  3. 再看经典推荐算法之召回算法

    在学习和应用推荐算法的过程中,发现越来越多的文章在描述深度学习应用在推荐系统上的方法,不可否认深度学习的发展给推荐系统带来了巨大的进步,但是传统的经典算法仍然是非常值得学习的,毕竟可以作为一个比较高的 ...

  4. 经典推荐算法之协同过滤

    本文是个人在学习过程中的总结,如有错误或者不全面的地方,请大家指正,谢谢! 一. 协同过滤算法简介 二. 基于用户的协同过滤算法 2.1 实例 2.2 相似度计算方式 2.2.1 余弦相似度 2.2. ...

  5. 基于PCA 人脸识别/人脸识别算法/人脸检测程序源码MATLAB ELM+PCA人脸识别 PCA人脸识别matlab代码 基于PCA算法的人脸识别

    1.基于PCA的人脸识别代码 2.MATLAB ELM+PCA人脸识别 2.基于PCA的人脸识别(matlab)(采用PCA算法进行人脸识别,通过抽取人脸的主要成 分,构成特征脸空间,识别时将测试图像 ...

  6. 经典推荐算法-协同过滤

    协同过滤算法 1.传统推荐模型的演化关系图 2. 协同过滤 2.1 什么是协同过滤 2.2 计算用户相似度 2.3 最终结果排序 2.4 存在缺点 2.5 ItemCF 2.6 各自的应用场景 1.传 ...

  7. 层次聚类 matlab代码_聚类算法解析一

    01 概述 本次针对聚类算法进行讲解,因为内容较多,会分多篇文章进行讲解,主要的内容包括聚类算法的整体介绍,针对不同类别的聚类算法比如划分聚类.层次聚类.密度聚类等算法进行介绍,在讲解每类算法时会结合 ...

  8. 蝙蝠算法的matlab程序,经典蝙蝠算法MATLAB实现

    为什么会有这么多基于群智能的算法,蚁群.粒子群.鱼群.烟花.炮竹.猪群.牛群.马群.羊群.猴群.鸡群...算法.?????? 黑人问号.jpg 蝙蝠算法( BA) 是 Yang 教授于 2010 年基 ...

  9. 复合梯形公式matlab代码_MATLAB龙贝格积分算法

    什么是龙贝格积分算法 龙贝格(Romberg)积分算法也被称为逐次分半加速算法,通过把积分区间逐次分半的方法进行数值积分求解.由于其采用的是逐次分半计算,后一次计算是对前一次近似结果的修正,因此相对于 ...

最新文章

  1. 计算机专业和学历的关系!!重要!!
  2. 在MATLAB中读取同一路径下多个txt或mat文件
  3. 虚拟列表控件---加载大数据行
  4. OSI七层-相关协议
  5. 二进制文件被拒_苹果商店上架,二进制文件被拒绝
  6. python大牛自学心得_自学Python编程的第十天(希望有IT大牛看见的指点小弟我,万分感谢)---------来自苦逼的转行人...
  7. 新mac 下第一次 安装 mongodb 步骤
  8. vue之initComputed模块源码说明
  9. C#数字黑洞之一(水仙花数黑洞153)
  10. WeWork上演宫斗大戏,这个市还上吗?
  11. 如何解决Windows10系统空闲时间CPU占用高,风扇很响的问题?
  12. td-agent(Fluentd)的使用
  13. 社群就是微信群吗?社群的本质是什么?
  14. python编程求导数_SciPy函数求导数
  15. Dos窗口的打开方式及其常用命令
  16. java 大量数据保存_使用Java保存大量数据的最佳实践
  17. 2009年5月30日
  18. 搭建自己的NAS 系统
  19. BEC 高级,成绩A。
  20. 搜索技术哪些算法模型可以实现千人千面个性化服务

热门文章

  1. ico图标下载 ico大全_我们可以做些什么来向ICO投资者保证我们不会用他们的钱消失...
  2. python cx_Oracle连接Oracle数据库查询
  3. 在微信小程序中使用字体图标
  4. 用Python标准库turtle画一头金牛,祝您新年牛气冲天!
  5. Eclipse JAVA项目的 目录结构 和 导入 import菜单使用
  6. 二分图的最大匹配问题
  7. [机器学习-实战篇]Imdb数据集情感分析之贝叶斯
  8. 移动web-触摸事件touch
  9. 去哪儿-07-city-router
  10. 批量从网上下载图片、zip等文件到本地[java爬虫]