摘要:按照《集体》一书的介绍这一章主要解决的问题是:如何根据群体偏好来为人们提供推荐以及怎样制作一个简单的推荐系统。主要涉及的技术为:协作型过滤。
1、何为协作性过滤
协作性过滤也叫做协同过滤(Collaborative Filtering)。协作型过滤是基于假设的:和我兴趣相投的人喜欢的东西我也应该喜欢(User-base);喜欢想撕物品的人应该和我有一样的兴趣(item-base)。
协作性过滤的类型主要有:
①基于用户(User-based)
用相似统计的方法得到具有相似爱好或者兴趣的相邻使用者。
算法步骤:
step1:搜集使用者信息/资讯
step2:最近邻搜索(通过相似度算法分别计算两个用户的相似度,得出两个用户的“兴趣距离”)
step3:产生推荐结果(对“兴趣距离”进行一定的排序)
②基于物品(Item-based)
提出的背景:以用户为基础的推荐算法随着使用者数量的增多,计算的时间就会变长
基于这样一个假设:能够引起使用者兴趣的项目,必定与之前评分较高的项目相似
算法步骤:
step1:收集用户信息
step2:针对项目的最近邻搜索
step3:产生推荐结果
*③基于内容(无泛化能力)
*④基于模型(尚未碰到)
2、协作型过滤的优缺点
优点:
①能够自动过滤机器难以识别分析的内容
②根据真实用户评分,解决了计算难以表述的概念的问题
③有推荐新资讯的能力
④推荐个性化、自动化高,加快个性化学习的速度
缺点:
①新使用者问题(没有用户的行为信息)
②新项目问题 (算法基础就是根据历史资料表)
③稀疏性问题
④系统延伸性问题
3、一个简单推荐系统的构建流程(Demo)
Step1:搜集偏好
该Demo基于一个假设的数据,就可以省略去信息采集的步骤。现在要解决的一个问题是:该怎样表达不同人的偏好(评分)。书中提供的方法是利用Python中的嵌套字典。当然作为一个示范性质的Demo,这样做是较为方便的,况且在实际项目中也可以很简单的将其存储转换为SQL型数据库(eg.MySQL)或NoSQL型数据库(eg.MongoDB)存储,只是要简单的设计数据表或页面集合而已。
Well,现在用Python代码构建一个数据集,代码如下:
Tips:不管偏好是如何表达的,我们需要一种方法将它们对应到数字。如下表:从用户行为到相应评价值的可能转换关系
音乐会门票 在线购物 网站推荐者 已购买 1 已购买 2 喜欢 1 未购买 0 已浏览 1 未投票 0 未购买 0 不喜欢 -1
Step2:寻找相近的用户
这一步我们就要通过一定的相似度算法(相似度距离)来计算他们的相似度评价值。在这里我们使用两个计算相似度评价值的体系——①欧几里得距离②皮尔逊相似度。
①欧几里得距离计算公式:
欧几里得距离就是中学数学中常见的空间距离,假设对弈X\Y两个属性,在二维坐标中甲乙丙三个用户的距离位置就如下图所示:
在二维的用户空间中,两两之间的距离就是两个坐标点的距离,如果再添加其它的属性(兴趣啊、评分啊什么的),只不过是维度的上升,在纬度原理上是一样的,只不过不能吐过图形显示出来而已。 《-》欧几里德距离简单明了,却难以解决高位灾难,且不说高维度计算的复杂,在高维度上,个点之间的距离将会很难分辨开,难以做到化类区分的目的。
为利用欧几里得距离,建立一个函数
sim_distance(prefs,person1,person2) return 1/(d+1)
prefs:字典,如刚刚创建的数据字典critics
person、person2:作比较的两个用户名字
1/d:欧几里得距离加1的倒数
小技巧:可以将函数值+1,用以避免遇到被零整除的错误,并取其倒数。这样新的“距离值”就会介于0——1之间。1表示两人具有一样的偏好。
②皮尔逊相关系数相似度计算公式:
皮尔逊相关系数的相似计算值是为了解决不同用户评分或评级不同的标准不同 的问题,判断两组数据在某一直线你和程度的一种度量。如一个用户对所有的物品评分都较高,而另一个用户评分都较低,如果用欧几里德距离的话,将会出现很大的差错。而皮尔逊系数正好能够解决。如下图所示:
虽然甲乙两用户的评价标准不同,但却能很大程度上拟合在一起。
为获得皮尔逊相似值,建立函数
sim_pearson(prefs,p1,p2) return r
参数同欧几里得
r:介于-1到1之间。值1表明两个人完全相同的评价,
Tips:
①如果数据密集(所有数据几乎都有属性值,属性值量级重要),就用欧几里得
②数据受级别膨胀影响(不同用户使用不同的评分标准),就用皮尔逊相关系数
③数据稀疏性强,就考虑用余弦距离(在文后介绍)
Step3:为评论者打分
现在就可以给定一个人,比较它和其他人呢之间的相似性,根据相似值大小排序,获得与给定的人相似的人的排行。就可以给这个人推荐排在前面的用户。
Step4:推荐物品
在这个实例中,目的是推荐一部影片,而不是人。所以接下来进行加权归一化处理。【不知道该怎么组织语言了,先留着,稍后填上】
Step5:结语
这样,一个简单的基于用户的推荐系统就完成了。可以给用户推荐影片、推荐好友用户。它适用于任何类型的商品或网络连接。我们唯一要做的就是:建立一个涉及人员、物品和评价值的字典。
Step6:唉唉,咋又有了呢
是啊,咋又有了呢?还有一部分,怎么知道哪些物品最相近呢?答案就是把数据字典中的人和影片调换一下,代码如下:
4、结语
自己写到这里发现越写越不清楚,有点累了,
附:
[1]各种用以计量相似性的距离公式
1. 欧氏距离
2. 曼哈顿距离
3. 切比雪夫距离
4. 闵可夫斯基距离
5. 标准化欧氏距离
6. 马氏距离
7. 夹角余弦
8. 汉明距离
9. 杰卡德距离 & 杰卡德相似系数
10. 相关系数 & 相关距离
11. 信息熵
详见:http://www.cnblogs.com/heaad/archive/2011/03/08/1977733.html
http://my.oschina.net/airship/blog/384488
[2]练习
①利用MovieLens数据集做电影评价
②用Tanimoto分值建立一个新的相似度函数
③访问http://www.audiosrcobbler.net,利用网站提供的API获取一组数据,并以此来构造一个音乐推荐系统
④访问delicious.com,构建url推荐系统
[3]关于推荐系统的一些阅读材料
①论文《Item-based Collaborative Filtering Recommendation Algorithms 》http://www.ra.ethz.ch/cdstore/www10/papers/pdf/p519.pdf
笔记:http://www.tuicool.com/articles/qeQZb2
②推荐系统中的常用算法:http://blog.jobbole.com/72373/