1. 程式人生 > >機器學習基礎(三十四)—— 協同過濾(之獲得推薦)

機器學習基礎(三十四)—— 協同過濾(之獲得推薦)

為未被某人評分的電影的進行打分,我們當然可以查詢品味與此人最為接近(依據相似性度量)的人的相應評分,但是這樣做過於簡單和隨意(permissive)。這種做法的問題在於:我們會找到一個熱衷某部電影的古怪評論者,而根據 topMatch 的結果,所有其他的評論者都不看好這部電影。也即將評分完完全全依賴於一個未知可信度的人的評分是有風險的。所以一種穩妥的做法即是根據使用者之間的相似度對打分進行加權平均(weighted average)。

def getRecommendations(prefs, p0, similarity=sim_pearson):

    totalSum, simSum = {}, {}

    for
p in prefs: if p == p0: continue sim = similarity(p0, p) if sim <= 0: continue for item in prefs[p]: if item not in prefs[p0] or prefs[p0][item] == 0: simSum.setdefault(item, 0) simSum[item] += sim totalSum.setdeault(item, 0
) totalSum[item] += prefs[p][item]*sim rankings = [(item, totalSum[item]/simSum[item]) for item in totalSum] return sorted(rankings, key=operator.itemgetter(1), reverse=True)