各類類似度指標:https://www.cnblogs.com/arachis/p/Similarity.htmlhtml
基於用戶協同過濾orm
def getRecommendations(prefs,person,similarity=sim_pearson):htm
simSum = {}blog
totals = {}get
for other in prefs:it
if other == person: continueio
sim = similarity(prefs,person,other)form
if sim<=0: continuetransform
for item in prefs[other]:im
#只對本身未看過的電影進行評價
if item not in prefs[person] or prefs[person][item]==0:
# Similarity * Score加權評價值
totals.setdefault(item,0) #由於下面是+=,因此必須初始化
totals[item]+=prefs[other][item]*sim
# Sum of similarities 類似值之和
simSum.setdefault(item,0)
simSum[item]+=sim
rankings = [(totals[item]/simSum[item],item) for item in totals]
#或者 rankings = [(total/simSum[item],item) for item,total in totals.items()]
rankings.sort()
rankings.reverse()
return rankings
def transformPrefs(prefs):
result = {}
for person in prefs:
for item in prefs[person]:
result.setdefault(item, {})
# 將物品和人員對調
result[item][person] = prefs[person][item]
return result
def calculateSimilarItems(prefs,n=10):
result={} # 創建字典,以給出與這些物品最爲相近的其餘物品
itemPrefs=transformPrefs(prefs) # 以物品爲中心對偏好矩陣實施倒置處理
for item in itemPrefs: # 尋找與item最爲相近的n個物品
scores=topMatches(itemPrefs,item,n=n,similarity=sim_distance)
result[item]=scores
return result