推荐算法在当下使用场景较多,亚马逊书籍推荐,商品推荐等等。《集体智慧编程》第二单元“提供推荐”构造简单的推荐系统,从而实现用户电影推荐的功能。
·
01数据介绍
登陆网页下载电影评分数据。
原始数据由movies和ratings两个文件组成。组合两个文件,读入数据如下所示影评人ID{电影1,给与的评分;电影2,给与的评分;···}
·
02 相似度定义
影评人之间的相似度可以通过欧几里得计算,也可以通过皮尔逊相关系数的方法计算。
- 欧几里得距离
1、影评人A和影评人B共同评分过的电影数为 n
2、共同评过分的电影(A的评分-B的评分)^2 求和,再开方
(2)皮尔逊相关系数
1、影评人A和影评人B共同评分过的电影数为 n
2、共同评过分的电影(A的评分-B的评分)做以下函数处理计算相似度
·
03 寻找与你相似的人
根据距离寻找和你有相似电影喜好的人。原理很简单:就是根据距离排序,距离最近的人就是最相似的人。以下使用皮尔逊相关系数计算距离。
def topMatches(prefs, person, n=5, similarity=sim_pearson):
scores = [(similarity(prefs, person, other), other)
for other in prefs if other != person]#other是除目标外的其他人
scores.sort()#得分排序
scores.reverse()
return scores[0:n]#返回得分前n的人(默认返回前5相关的人)
例如寻找与2号相似的影评人,按相似度排序,6416号影评人与2号最相似。
topMatches(prefs,"2")
相似度 影评人编号
[(1.0000000000000213, '6416'),
(1.000000000000004, '7791'),
(1.000000000000004, '7788'),
(1.000000000000004, '6846'),
(1.000000000000004, '6552')]
·
04 向你推荐电影
根据与你相似人的喜好,给你推荐他看过且好评的电影。
- 推荐评分设置
假如和2号相关的5个影评人,Rose与2号最相似,相似度为99%。分别有三部电影Night、Lady、Luck向2号做推荐备选。
1、影评人相似度 * 电影评分 S.x
2、看过这部电影的影评人相似度求和
3、做除法
以2号影评人为例,选取电影推荐评分最高的前5场电影:1996年的'Sweet Nothing '作为首选推荐。
getRecommendations(prefs,'2')[0:5]
[(5.000000000000001, 'Sweet Nothing (1996)'),
(5.000000000000001, 'Seven Chances (1925)'),
(5.0, 'Zero for Conduct (Zéro de conduite) (1933)'),
(5.0, 'Yol (1982)'),
(5.0, 'Woman of Paris\t A (1923)')]
·
05 相似的电影、合理的影评
电影那么多,想知道哪些电影是相似的。只要把数据做一下转换,还是同样的算法,返回最相似的电影,已经采用哪些影评人的评论。
def transformPrefs(prefs):
result = {}
for person in prefs:
for item in prefs[person]:
result.setdefault(item, {})#初始化结构
# Flip item and person
result[item][person] = prefs[person][item]
return result
转换数据格式后,就可以计算相似的电影了。以Superman Returns为例,You, Me and Dupree是最相似的电影,相似度为65.7%。
topMatches(movies,'Superman Returns')
[(0.6579516949597695, 'You, Me and Dupree'),
(0.4879500364742689, 'Lady in the Water'),
(0.11180339887498941, 'Snakes on a Plane')
向人推荐电影,反过来向电影推荐人。
推荐合适的影评人选,显示影评在电影评价首页。以电影Just My Luck为例,建议把Michael Phillips的影评放在首页。
getRecommendations(movies,'Just My Luck')
[(4.0, 'Michael Phillips'),
(3.0, 'Jack Matthews')]
网友评论