集体智慧编程——推荐系统(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

这样,我们就可以找到自己接下来应该看得电影了。

参考:集体智慧编程

原文地址:https://www.cnblogs.com/itdyb/p/5011445.html