初學資料探勘 相似性度量 二

2021-09-06 23:18:09 字數 3354 閱讀 1844

根據相似性從高到底排序。

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個條件...