协同过滤算法的Python实现
今天要讲的主要内容是协同过滤,即Collaborative Filtering,简称CF。
Contents
1. 协同过滤的简介
2. 协同过滤的核⼼
3. 协同过滤的实现
4. 协同过滤的应⽤
1. 协同过滤的简介
关于协同过滤的⼀个最经典的例⼦就是看电影,有时候不知道哪⼀部电影是我们喜欢的或者评分⽐较⾼的,那 么通常的做法就是问问周围的朋友,看看最近有什么好的电影推荐。在问的时候,都习惯于问跟⾃⼰⼝味差不 多的朋友,这就是协同过滤的核⼼思想。
协同过滤是在海量数据中挖掘出⼩部分与你品味类似的⽤户,在协同过滤中,这些⽤户成为邻居,然后
根据他 们喜欢的东西组织成⼀个排序的⽬录推荐给你。所以就有如下两个核⼼问题
(1)如何确定⼀个⽤户是否与你有相似的品味?
(2)如何将邻居们的喜好组织成⼀个排序⽬录?
协同过滤算法的出现标志着推荐系统的产⽣,协同过滤算法包括基于⽤户和基于物品的协同过滤算法。
2. 协同过滤的核⼼
要实现协同过滤,需要进⾏如下⼏个步骤
(1)收集⽤户偏好
(2)到相似的⽤户或者物品
(3)计算并推荐
收集⽤户偏好
从⽤户的⾏为和偏好中发现规律,并基于此进⾏推荐,所以如何收集⽤户的偏好信息成为系统推荐效果最基础 的决定因素。⽤户有很多种⽅式向系统提供⾃⼰的偏好信息,⽐如:评分,投票,转发,保存书签,购买,点 击流,页⾯停留时间等等。
以上的⽤户⾏为都是通⽤的,在实际推荐引擎设计中可以⾃⼰多添加⼀些特定的⽤户⾏为,并⽤它们表⽰⽤户 对物品的喜好程度。通常情况下,在⼀个推荐系统中,⽤户⾏为都会多于⼀种,那么如何组合这些不同的⽤户 ⾏为呢 ?基本上有如下两种⽅式
(1)将不同的⾏为分组
⼀般可以分为查看和购买,然后基于不同的⽤户⾏为,计算不同⽤户或者物品的相似度。类似与当当⽹或者 亚马逊给出的“购买了该书的⼈还购买了”,“查看了该书的⼈还查看了”等等。
(2)不同⾏为产⽣的⽤户喜好对它们进⾏加权
对不同⾏为产⽣的⽤户喜好进⾏加权,然后求出⽤户对物品的总体喜好。
好了,当我们收集好⽤户的⾏为数据后,还要对数据进⾏预处理,最核⼼的⼯作就是减噪和归⼀化。
减噪: 因为⽤户数据在使⽤过程中可能存在⼤量噪⾳和误操作,所以需要过滤掉这些噪⾳。
归⼀化:不同⾏为数据的取值相差可能很好,例如⽤户的查看数据肯定⽐购买数据⼤得多。通过归⼀化,才能 使数据更加准确。
通过上述步骤的处理,就得到了⼀张⼆维表,其中⼀维是⽤户列表,另⼀维是商品列表,值是⽤户对商品的喜 好。还是以电影推荐为例,如下表
到相似的⽤户或物品
对⽤户的⾏为分析得到⽤户的喜好后,可以根据⽤户的喜好计算相似⽤户和物品,然后可以基于相似⽤户或物 品进⾏推荐。这就是协同过滤中的两个分⽀了,基于⽤户的和基于物品的协同过滤。
关于相似度的计算有很多种⽅法,⽐如常⽤的余弦夹⾓,欧⼏⾥德距离度量,⽪尔逊相关系数等等。⽽如果采 ⽤欧⼏⾥德度量,那么可以⽤如下公式来表⽰相似度
在计算⽤户之间的相似度时,是将⼀个⽤户对所有物品的偏好作为⼀个向量,⽽在计算物品之间的相似度时, 是将所有⽤户对某个物品的偏好作为⼀个向量。求出相似度后,接下来可以求相似邻居了。
计算并推荐
在上⾯,我们求出了相邻⽤户和相邻物品,接下来就应该进⾏推荐了。当然从这⼀步开始,分为两⽅⾯,分别 是基于⽤户的协同过滤和基于物品的协同过滤。我会分别介绍它们的原理
(1)基于⽤户的协同过滤算法
在上⾯求相似邻居的时候,通常是求出TOP K邻居,然后根据邻居的相似度权重以及它们对物品的偏好, 预测当前⽤户没有偏好的未涉及物品,计算得到⼀个排序的物品列表进⾏推荐。
python新手代码userid(2)基于物品的协同过滤算法
跟上述的基于⽤户的协同过滤算法类似,但它从物品本⾝,⽽不是⽤户⾓度。⽐如喜欢物品A的⽤户都喜 欢物品C,那么可以知道物品A与物品C的相似度很⾼,⽽⽤户C喜欢物品A,那么可以推断出⽤户C也可能 喜欢物品C。如下图
上⾯的相似度权重有时候需要加⼊惩罚因⼦,举个例⼦,在⽇常⽣活中,我们每个⼈购买卫⽣纸的的频率⽐ 较⾼,但是不能说明这些⽤户的兴趣点相似,但是如果它们都买了照相机,那么就可以⼤致推出它们都是摄 影爱好者。所以像卫⽣纸这样的物品在计算时,相似度权重需要加上惩罚因⼦或者⼲脆直接去掉这类数据。
适⽤场景
对于⼀个在线⽹站,⽤户的数量往往超过物品的数量,同时物品数据相对稳定,因此计算物品的相似度不但 计算量⼩,同时不必频繁更新。但是这种情况只适⽤于电⼦商务类型的⽹站,像新闻类,博客等这类⽹站的 系统推荐,情况往往是相反的,物品数量是海量的,⽽且频繁更新。所以从算法复杂度⾓度来说,两种算法
3. 协同过滤的实现
上⾯已经介绍了协同过滤的核⼼思想,现在就来实战⼀下吧! 采⽤数据集如下
这个数据集是很多⽤户对各种电影的评分。接下来先采⽤实现基于⽤户的协同过滤算法。
⾸先,我们需要以表格形式读取数据,需要⽤到Texttable第三⽅包。安装包如下链接
⼤致⽤法如下
更多⽅法的使⽤需要参考Textdtable的源⽂件texttable.py。接下来可以实现协同过滤算法了。
代码:
[python]
1. # -*-coding=utf-8 -*-
2.
3. import sys
4. import math
5. from texttable import Texttable
6.
7. #计算余弦距离
8. def getCosDist(user1, user2):
9. sum_x = 0.0
10. sum_y = 0.0
11. sum_xy = 0.0
12. for key1 in user1:
13. for key2 in user2:
14. if key1[0] == key2[0]:
15. sum_x += key1[1] * key1[1]
16. sum_y += key2[1] * key2[1]
17. sum_xy += key1[1] * key2[1]
18. if sum_xy == 0.0:
19. return 0
20. demo = math.sqrt(sum_x * sum_y)
21. return sum_xy / demo
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论