根據相似性從高到底排序。
def topmatchs(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 getrecommendations(prefs, person, similarity=sim_pearson):totals = #
與指定人(person)的相似度 x 對person未看過電影的評分(加權值)。所有人的總和
simsums = #
所有人的相似度(是對該電影有過評價且對person來說未看過的人)
#for other in
prefs:
if other == person: continue
#肯定不和自己比較
sim = similarity(prefs, person, other) #
返回的是與此人的相似度
#忽略相似度為0或者小於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) #
該方法是dictionary方法,若鍵key不存在於此dictionary中,將會新增該鍵到dictionary中,並設預設值(0)
totals[item] += prefs[other][item] *sim
#相似度之和
simsums.setdefault(item, 0)
simsums[item] +=sim
rankings = [(total/simsums[item], item) for item, total in
totals.items()]
rankings.sort()
rankings.reverse()
return rankings
這個演算法有兩點,第一:未看過的電影,這個好解決。第二:推薦,怎麼個推薦?是否能根據某乙個人和我的相似度很高,所以就將他看過我沒看過的電影推薦給我?當然不行,就算他和我相似度很高,但是還是存在他對某一部電影的評分很低,而我又沒有看過就推薦給我,所以單單從某人和我的相似度高低這乙個因素來進行顯然不可以。同樣存在某乙個人一部電影的評分很高,但他的相似度和我很低,而且其他人對此電影的評分很低,這種情況也不可以。所以引用原文中的話「我們需要通過乙個經過加權的評價值來為影片打分」。我們還是按照上週給出過的例子,小明a對《左耳》、《何以笙簫默》、《速度與激情》的評分分別是3、4、5,小紅對這三部電影的評分是2、5、1,再加上「我」。我們假設這三部電影我沒有看過,根據上面乙個演算法得出a對我的相似度是0.99,b是0.38。現在列出乙個**來進行說明。
下面就貼出所有的**,只需要將以下**直接貼在上章的最後即可。
1#指定一人與其他人的相似度排名
2def topmatchs(prefs, person, n=5, similarity=sim_pearson):
3 scores=[(similarity(prefs, person, other), other) for other in prefs if other!=person]45
scores.sort()
6scores.reverse()
7return
scores[0:n]89
print u"
與toby相似度最高的人"10
print topmatchs(critics, '
toby
', n=3)
1112
#以下方法在topmatchs方法的基礎上直接根據相似度x加權值(對每個電影的評分)推薦電影
13def getrecommendations(prefs, person, similarity=sim_pearson):
14 totals = #
與指定人(person)的相似度 x 對person未看過電影的評分(加權值)。所有人的總和
15 simsums = #
所有人的相似度(是對該電影有過評價且對person來說未看過的人)16#
17for other in
prefs:
18if other == person: continue
#肯定不和自己比較
19 sim = similarity(prefs, person, other) #
返回的是與此人的相似度
2021
#忽略相似度為0或者小於0的情況,
22if sim <= 0: continue
2324
for item in
prefs[other]:25#
只對自己還未看過的電影進行推薦
26if item not
in prefs[person] or prefs[person][item] ==0:27#
28 totals.setdefault(item, 0) #
該方法是dictionary方法,若鍵key不存在於此dictionary中,將會新增該鍵到dictionary中,並設預設值(0)
29 totals[item] += prefs[other][item] *sim30#
相似度之和
31simsums.setdefault(item, 0)
32 simsums[item] +=sim
3334 rankings = [(total/simsums[item], item) for item, total in
totals.items()]
3536
rankings.sort()
37rankings.reverse()
38return
rankings
3940
print u"
推薦給toby的電影"41
print getrecommendations(critics, "
toby
")
初學資料探勘 相似性度量 二
根據相似性從高到底排序。def topmatchs prefs,person,n 5,similarity sim pearson scores similarity prefs,person,other other for other in prefs if other person scores...
相似性度量
二元向量的相似性度量 每一維都少的資訊量,主要是0,1等有 or 沒有屬性 dice 2 x y x y 2保證 0,1 維數不一致時,差別大。jaccard x y x y 交疊程度小時,值較低 交疊係數 x y min 互相之間的包含性,1 cosine x y 根號 x y 對於實值 只有co...
相似性度量
一般而言,定義乙個距離函式d x,y 需要滿足以下幾個準則 1.d x,x 0 到自己的距離為0 2.d x,y 0 距離要非負 3.對稱性,d x,y d y,x 如果a到b距離是a,那麼b到a的距離也應該是a 4.三角形法則 兩個之和大於第三邊 d x,k d k,y d x,y 滿足這4個條件...