Collaborative Filtering
1.协同过滤CF
最近你想看电影了,但是不知道看什么好,想要了解电影的推荐信息,通过什么途径呢?
比如向问朋友,问老师,问亲友,但是毕竟每个人的品味不同,而且现在可选择的商品或电影太多太多了,不肯得到很好的推荐效果,知道你确实想要什么。
协同过滤推荐(Collaborative Filtering recommendation)是在信息过滤和信息系统中正迅速成为一项很受欢迎的技术。与传统的基于内容过滤直接分析内容进行推荐不同,协同过滤分析用户兴趣,在用户群中找到指定用户的相似(兴趣)用户,综合这些相似用户对某一信息的评价,形成系统对该指定用户对此信息的喜好程度预测。
一个协作型过滤算法通常的做法是对一大群人进行搜索, 并从中找出与我们品味相近的一小群入。算法会对这些人所偏爱的其他内容进行考查,并将它们组合起来构造出一个经过排名的推荐列表。有许多不同的方法可以帮助我们确定哪些人与自己的品味相近,并将他们的选择组合成列表。
2. 协同过滤种类
user-based cf 是基于用户的协同过滤,通过不同用户对item的评分来评测用户之间的相似性,基于用户之间的相似性做出推荐;
item-based cf 是基于物品的协同过滤,通过用户对不同item的评分来评测item之间的相似性,基于item之间的相似性做出推荐;
3.user-based CF 基于用户的协同过滤
实现思想:
1. 获取偏好:获取不同用户对item的评分列表。key是用户,value是用户对每个item的评分(item1:3, item2 : 5 ...etc)
2. 相似度评价:找出相似的用户。(欧式距离评价,皮尔逊相关系数评价...etc)
3. 依据相似度评价,寻找topMatch,找出某个人最相似的前N个人。
4. 推荐物品,即找出相似的人,如何推荐,推荐哪些item。
每个步骤都是要再三思考的:
比如相似度评价,就要很多方法,欧式距离在空间上的绝对距离来评价,需要量纲一致才能出现比较好的效果。而皮尔逊相关系数是在方向上,余弦相似度,以向量的夹角来判断相似性,不要求量纲的绝对一致就能出现比较好的效果。还有找出相似的用户,如何推荐商品,是直接推荐它没看过的商品,还是根据大家对某个item的评分来决定是否要推荐。
3.1 为用户推荐电影
下面用一个例子来说明:
1. 获取偏好:
这个属于数据源的收集,每个用户对某样商品的评分,经过etl形成类似如下的格式,里面包含了每个用户,对它所评价过的电影的评分列表。
# A dictionary of movie critics and their ratings of a small
# set of movies
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 Luc