集体智慧编程——推荐系统(2)
步骤三:为评论者打分
既然我们已经有了对两个人进行比较的函数,下面就可以编写程序,根据指定人员对每个人进行打分,并找出最接近的匹配结果了。在本例中,我们对找寻对与自己相似评委的影评者感兴趣,这样我们就知道在选择影片时应该采纳谁的建议了。
def topMatches(prefs,person,n=5,similarity=sim_pearson): scores=[(similarity(prefs,person,other),other) for other in prefs if other!=person] scores.sort() scores.reverse() return scores[0:n]
该函数利用了列表推导式,将自身和字典中的其他每一个用户进行了比较。返回排序结果的前N项。
>>>reload(recommendations) >>> recommendations.topMatches(recommendations.critics,'Toby',n=3) [(0.9912407071619299, 'Lisa Rose'), (0.9244734516419049, 'Mick LaSalle'), (0.8934051474415647, 'Claudia Puig')]
步骤四:推荐物品
我们通过一个经过加权的评价值来为影片打分,评论者的评分结果因此形成了先后的排名。为此,我们必须取得所有其他的评论者的评价结果,借此得到相似度后,再乘以他们为每部影片所给的评价值。
def getRecommendations(prefs,person,similarity=sim_pearson): totals={} simSums={} for other in prefs: if other==person:continue #do not compare with self sim=similarity(prefs,person,other) #ignore the value <=0 if sim<=0 :continue for item in prefs[other]: if item not in prefs[person] or prefs[person][item]==0: totals.setdefault(item,0) totals[item]+=prefs[other][item]*sim simSums.setdefault(item,0) simSums[item]+=sim ranking=[(total/simSums[item],item)for item,total in totals.items() ] ranking.sort() ranking.reverse() return ranking
这样,我们就可以找到自己接下来应该看得电影了。
参考:集体智慧编程