本章主要介绍了利用协作型算法对项目进行推荐,这里的项目可以是商品,电影,音乐。一个协作型算法的关键是对一大群人进行搜索,从中找出与我们品味最相似的一群人,算法会对这些人的所偏好的内容进行考查,并将它们组合起来构造出一个经过排名的推荐列表。本文主要通过一个电影推荐的例子完成这个过程。

1.搜集偏好

在实际中,用户对项目的偏好往往是以打分,评论,收藏标签,点击等方式体现,可以用数字值将这些行为进行具体化,比如说打分可以由1-5的区别,收藏标签可以由0和1之分。所以进行推荐的第一步是要收集用户的喜好数据,在这里用一个字典来保存用户的历史喜好数据。

critics = {'Lisa Rose': {'Lady in the Water': 2.5,'Snakes on a Plane': 3.5,'Just My Luck': 3.0,'Superman Returns': 3.5,'You, Me and Dupree': 2.5,'The Night Listener': 3.0,},'Gene Seymour': {'Lady in the Water': 3.0,'Snakes on a Plane': 3.5,'Just My Luck': 1.5,'Superman Returns': 5.0,'The Night Listener': 3.0,'You, Me and Dupree': 3.5,},'Michael Phillips': {'Lady in the Water': 2.5,'Snakes on a Plane': 3.0,'Superman Returns': 3.5,'The Night Listener': 4.0,},'Claudia Puig': {'Snakes on a Plane': 3.5,'Just My Luck': 3.0,'The Night Listener': 4.5,'Superman Returns': 4.0,'You, Me and Dupree': 2.5,},'Mick LaSalle': {'Lady in the Water': 3.0,'Snakes on a Plane': 4.0,'Just My Luck': 2.0,'Superman Returns': 3.0,'The Night Listener': 3.0,'You, Me and Dupree': 2.0,},'Jack Matthews': {'Lady in the Water': 3.0,'Snakes on a Plane': 4.0,'The Night Listener': 3.0,'Superman Returns': 5.0,'You, Me and Dupree': 3.5,},'Toby': {'Snakes on a Plane': 4.5, 'You, Me and Dupree': 1.0,'Superman Returns': 4.0},
}

字典中的每一项表示了一个用户对电影的评分,分值在1-5之间。

2.计算用户相似度

在搜集完成用户的喜好之后,必须有一种方法来判断用户之间的相似度的算法,人以类聚,物与群分,找到与指定的用户相似的用户是推荐的基础。实际中用到的相似度计算法方法主要有欧几里得距离和皮尔逊相关系数。

欧几里得距离

欧几里得距离就是计算两个向量之间的距离,这里可以把用户对每一部电影的评分看作是一个向量,然后计算两个向量之间的距离。用一个简单的二维图示表示如下:

这里的横坐标和纵坐标分别表示一部电影,这样就可以将所有的用户置于这样的一个电影空间中,这个只是二维的情况,多不电影的话就对应的是一个多维的空间。利用欧几里得距离计算用户之间的相似度的过程如下所示:

利用欧几里得距离来测量用户之间的相似度
#prefs:   用户偏好
#p1,p2:   不同的用户
#返回用户之间的相似度
def sim_distance(prefs,p1,p2):si={}for item in prefs[p1]:          #遍历用户p1和p2,找到二者共有的项目if item in prefs[p2]:si[item]=1if len(si)==1:return 0#计算二者之间的欧几里得距离sum_of_squares=sum([pow(prefs[p1][item]-prefs[p2][item],2) for item inprefs[p1] if item  in prefs[p2]])return 1/(1+sqrt(sum_of_squares))

在计算距离的过程中,如果二者的距离越小,则表示二者的相似度越大,所以最后有一个取倒数的操作。

  皮尔逊相关度评价

皮尔逊相关系数是判断一组数据和一条直线之间拟合程度的一宗度量,在数据很不规范的时候会给出更好的结果。如下图所示,横纵坐标表示两个用户,坐标点表示的是用户对电影的评分,这样二者都评分的电影都在一个平面内了,组成了这样的散点图,现在用一条直线去拟合这些散点图,如果两个用户之间越相似,那么这些散点就越能拟合到一条直线上。

皮尔逊相关系数的计算公式如下:

相关系数的取值范围的-1到1之间,-1表示二者负相关,1表示二者正相关,0 表示二者不相关,皮尔逊相关度评价首先找出二者都评价过的物品,然后计算评分的总和和平方和,并求得评分的乘积之和。计算过程如下所示:

#利用皮尔逊相关系数来计算用户之间的相似度
#prefs:   用户偏好
#p1,p2:   不同的用户
#返回用户之间的相似度
def sim_person(prefs,p1,p2):si={}for item in prefs[p1]:if item in prefs[p2]:si[item]=1if len(si)==0:return 0n=len(si)#计算二者公共项目评分的总和sum1=sum([prefs[p1][it] for it in si])sum2=sum([prefs[p2][it] for it in si])#计算二者公共项目评分的平方和sum1sq=sum([pow(prefs[p1][it],2) for it in si])sum2sq=sum([pow(prefs[p2][it],2) for it in si])#计算二者评分的乘积之和psum=sum([prefs[p1][it]*prefs[p2][it] for it in si])#分子num=psum-sum1*sum2/n#分母den=sqrt((sum1sq-pow(sum1,2)/n)*(sum2sq-pow(sum2,2)/n))if den==0:return 0return num/den

3.找出相似的用户

计算出一对用户之间的相似度之后,就可以通过遍历所有的用户,找出某一个用户相似度最高的前k个用户,计算相似度,排序即可。

#求取指定用户相似度最高的前n个用户
def topMatches(prefs,person,n=5,similarity=sim_person):scores=[(similarity(prefs,person,other),other)for other in prefs if other!=person]scores.sort()scores.reverse()return scores[0:n]

 4.产生推荐列表

找出与制定用户之间相似度最高的k个用户之后,当然可以把这前k个用户的所有电影前部推荐给用户,但是注意到这些用户之间的相似度是不一样的,所以我们要对每一部电影计算一个推荐度,通过一个经过加权的评价值来为影片打分,用相似度乘以对每一部影片的打分得到推荐度。


   如图所示,每一个用户与Toby之间的相似度乘以他们对电影的评分,最后得到一个推荐值,将这些推荐值相加和再除以所有用户的相似度之和就得到了最后的推荐度。具体实现过程如下:

#根据用户之间的相似度进行物品推荐
def getRecommendations(prefs,person,similarity=sim_person):totals={}simSums={}for other in prefs:if other==person:             #与自己不做比较continuesim=similarity(prefs,person,other)        #与每一个用户计算相似度if sim<=0:continuefor item in prefs[other]:#只对自己还没有看过的项目进行推荐if item not in prefs[person] or prefs[person][item]==0:totals.setdefault(item,0)#计算最终的item的推荐指数totals[item]+=prefs[other][item]*sim#最终的左右相似度之和simSums.setdefault(item,0)simSums[item]+=sim#建立一个归一化的列表rankings=[(total/simSums[item],item) for (item,total) in totals.items()]rankings.sort()rankings.reverse()return rankings

最后得到的推荐结果如下所示:

5.在MovieLens数据集上进行推荐

下载MovieLens数据集,其中用到的文件有u.item和u.data两个文件,u.item中主要包含了电影的具体详细,u.data中包含了用户对电影的评分,首先需要将u.item文件读取到字典中。

#利用真实的电影数据集进行推荐
def loadMovieLens(path):movies={}for line in open(path+'/u.item',encoding='utf-8'):(id,title)=line.split('|')[0:2]movies[id]=titleprefs={}for line in open(path+'/u.data',encoding='utf-8'):(user,movieid,rating,ts)=line.split('\t')prefs.setdefault(user,{})prefs[user][movies[movieid]]=float(rating)return prefs

进行推荐的结果如下,仅仅输出了某一个用户的前几个推荐项目:

集体智慧编程第二章之提供推荐相关推荐

  1. 【集体智慧编程】第二章、提供推荐

    一.前言 本章即将告诉大家,如何根据群体偏好来为人们提供推荐.有许多针对于此的应用,如:在线购物中的商品推荐.热门网站的推荐,以及帮助人们寻找音乐和影片的应用.本章将告诉你如何构筑一个系统,用以寻找具 ...

  2. 《集体智慧编程》——第一章导读

    为什么80%的码农都做不了架构师?>>>    什么是集体智慧 其含义是指:为了长早新的想法,而将一群人的行为.偏好或思想组合在一起. 完成这项工作的一种最为基础的方法,便是使用调查 ...

  3. 《集体智慧编程》读书笔记10

    最近重读<集体智慧编程>,这本当年出版的介绍推荐系统的书,在当时看来很引领潮流,放眼现在已经成了各互联网公司必备的技术. 这次边阅读边尝试将书中的一些Python语言例子用C#来实现,利于 ...

  4. 《集体智慧编程》读书笔记2

    最近重读<集体智慧编程>,这本当年出版的介绍推荐系统的书,在当时看来很引领潮流,放眼现在已经成了各互联网公司必备的技术. 这次边阅读边尝试将书中的一些Python语言例子用C#来实现,利于 ...

  5. 《集体智慧编程》读书笔记4

    最近重读<集体智慧编程>,这本当年出版的介绍推荐系统的书,在当时看来很引领潮流,放眼现在已经成了各互联网公司必备的技术. 这次边阅读边尝试将书中的一些Python语言例子用C#来实现,利于 ...

  6. 《集体智慧编程》数学公式

    这篇博客的目的主要是为了记录这些公式,取自原书附录B. 1.欧几里得距离(Euclidean Distance) 用途:计算距离,衡量相似度 公式: 代码实现: def euclidean(p, q) ...

  7. 《集体智慧编程》笔记(2 / 12):提供推荐

    Making Recommendations 文章目录 协作型过滤 搜集偏好 寻找相近的用户 欧几里得距离评价 皮尔逊相关度评价 应该选用哪一种相似性度量方法 为评分者打分 推荐物品 匹配相似商品 构 ...

  8. 提供推荐--集体智慧编程

    背景:购物平台商品推荐算法介绍 数据:影评者对几部影片的打分情况,寻找人们在品味上的相似程度.通过相似度评价值进行推荐.评价值体系:欧几米德距离和皮尔逊相关度 critics = {'Lisa Ros ...

  9. 集体智慧编程——提供推荐

    我们在网站上需要做的第一件事情是提供推荐: critics={'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5,'Jus ...

  10. 《集体智慧编程》笔记(1 / 12):集体智慧导言

    文章目录 什么是集体智慧 什么是机器学习 机器学习的局限性 真实生活中的例子 学习型算法的其他用途 小结 Netflix, Google都适用了先进算法,将来自不同人群的数据加以组合,进而得出新的结论 ...

最新文章

  1. 136. 只出现一次的数字(关于异或的使用)
  2. 基于RDKit探索DrugBank
  3. LINUX下查看CPU、主板、硬盘、内存,网卡信息
  4. ios开发 ajax hook,IOS中的网络拦截总结
  5. spark wordcount完整工程代码(含pom.xml)
  6. SAP UI5 初学者教程之二十四 - 如何使用 OData 数据模型试读版
  7. 博士论文:教你如何给女朋友送礼物
  8. php分布式的锁,laravel分布式并发锁
  9. 2d绘制 c# dx_C# 从零开始写 SharpDx 应用 绘制基础图形
  10. “都是为了生活”小组 选题 Scrum立会报告+燃尽图 01
  11. 多玩网总裁李学凌:在腾讯阴影下
  12. HP Proliant DL360 Gen9服务器开箱
  13. 19 Three.js实现雾化效果
  14. C++写一个CSGO开箱模拟器
  15. m031开发 新唐_基于新唐M031开发的激光测距仪方案
  16. node php聊天室,利用socket.io实现多人聊天室(基于Nodejs)
  17. Matlab向量场可视化
  18. 尝试使用ob的advanced slides插件,发现image显示异常
  19. 计算机为什么找不到摄像头,win7系统摄像头图标不见怎么办?找回win7摄像头图标的两种方法...
  20. Octomap论文解读与ORBSLAM2应用

热门文章

  1. ArcView GIS 应用与开发技术(7)- 空间查询
  2. Windows 配置Java环境变量
  3. WIN10配置JAVA环境变量
  4. 1985高程基准与全球大地水准面(EGM2008)的关系综述
  5. Java实现图片任意角度旋转
  6. BTC源码分析 准备
  7. 51单片机学习笔记_2 LED 模块
  8. python水仙花数的代码_使用python求水仙花数的代码
  9. 360浏览器不能打开CSDN登陆页面
  10. 操作系统概念第九版编程项目:Linux内核模块