#一个涉及影评者及其对几部影片评分情况的字典
critics={'Lisa Rose':{'Lady in the Water':2.5,'Snakes on a plane':3.5,
'Just My Luck':3.0,'Superman Returns':3.5,'The Night Listener':3.0,
'You,Me and Dupree':2.5},
'Gene Seymour':{'Lady in the Water':3.0,'Snakes on a plane':3.5,
'Just My Luck':1.5,'Superman Returns':5.0,'You,Me and Dupree':3.5,
'The Night Listener':3.0},
'Michael Phillips':{'Lady in the Water':2.5,'Snakes on a plane':3.0,
'Superman Returns':3.5,'The Night Listener':4.0},
'Claudis 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 Luck':2.0,'Superman Returns':3.0,'The Night Listener':3.0,
'You,Me and Dupree':2.0},
'Jack Matthews':{'Lady in the Water':3.0,'Snakes on a plane':4.0,
'The Night Listener':3.0,'Superman Returns':5.0,'You,Me and Dupree':3.5},
'Toby':{'Snakes on a plane':4.5,'You,Me and Dupree':1.0,'Superman Returns':4.0}}
from math import sqrt
#返回一个有关person1和person2的基于距离的相似度评价defsim_distance(prefs,person1,person2):#得到shared_item列表
si={}
for item in prefs[person1]:
if item in prefs[person2]:
si[item]=1#如果两者没有共同之处,则返回0if len(si)==0:return0#计算所有差值的平方和
sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)
for item in prefs[person1] if item in prefs[person2]])
return1/(1+sqrt(sum_of_squares))
#从反映偏好的字典中返回最为匹配者#返回结果的个数和相似度函数均为可选参数deftopMatches(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]
#利用所有他人评价值的加权平均,为某人提供建议
def getRecommendation2(prefs,person,similarity=sim_pearson):
totals={}
simsums={}
for other in prefs:
#不要和自己比较if other==person:continue
sim=similarity(prefs,person,other)
#忽略评价值为零或者小于零的情况if sim<=0:continueforitemin prefs[other]:
#只对自己还未曾看过的影片进行评价ifitemnotin prefs[person] or prefs[person][item]==0:
#相似度*评价值
totals.setdefault(item,0)
totals[item]+=prefs[other][item]*sim
#相似度之和
simsums.setdefault(item,0)
simsums[item]+=sim
#建立一个归一化的列表
rankings=[(totals[item]/simsums[item],item)foritem,total in totals.items()]
#返回经过排序的列表
rankings.sort()
rankings.reverse()
return rankings
deftransformPrefs(prefs):
result={}
for person in prefs:
for item in prefs[person]:
result.setdefault(item,{})
#将物品和人员对调
result[item][person]=prefs[person][item]
return result
#一个涉及影评者及其对几部影片评分情况的字典critics={'Lisa Rose':{'Lady in the Water':2.5,'Snakes on a plane':3.5, 'Just My Luck':3.0,'Superman Returns':3.5,'The Night Listener':3.0,