歐幾里德距離 皮爾遜相關度 Tanimoto

2021-10-04 13:42:26 字數 3466 閱讀 4162

集體智慧型程式設計正式開始了接觸,第一課便是如何尋找想進使用者(也就是兩者的相似程度),正如大多數的推送服務一樣,通過計算你和其他的使用者的相似程度,給你推薦最佳匹配人認為很好的但是你還沒有購買的東西。

測試資料如下:(就是巢狀字典,共7個人對使用過的商品的評價)

critics=,

'gene seymour': ,

'michael phillips': ,

'claudia puig': ,

'mick lasalle': ,

'jack matthews': ,

'toby': }

一:歐幾里德距離原理很簡單,降維理解:已知直角三角形的兩直角邊,求斜邊長度。

通過兩者曾共同使用、評價過的東西來計算。例如:以人們一致評價過的物品為座標軸,將參與評價的人繪製到圖上,以此來考查他們的遠近關係。簡單的二維圖如下:

toby(1,4.5),若兩者在「偏好空間」越相近,則兩者越相似。由於這是二維圖,所以同一時間只能看到兩項評分。可以看下面**,仔細理解一下,在多維情況下依舊適用。(每個共有物品都會做比較)

#歐幾里德距離

from math

import sqrt

defsim_distance

(prefs,person1,person2):

si = {}

for item

in prefs[person1]:

if(item

in prefs[person2]):

si[item] =

1if(len(si) ==

0):return

0#上面的**應該可以省略

sum_of_squares = sum([pow(prefs[person1][item]-prefs[person2][item],

2) for item

in prefs[person1]

if item

in prefs[person2]])

return (

1/(1+sqrt(sum_of_squares)))    

#下面解釋一下

sim = sim_distance(critics,

'lisa rose',

'gene seymour')

print(sim)

解釋:上面的sum_of_squares越小,兩者距離越近,越相似。但我們需要乙個函式對偏好越近的情況給出越大值,所以我們對開方後的值加1(防止分母為0),再取倒數。

適合於特徵資料量較小的情況

這個相對於歐幾里德距離要複雜一點。它的乙個好處是,當兩者對一件物品的評分差距較大時,並不一定兩者不想近,如果他兩對於其他的物品評價也有差距,但是都是正相關,那兩者的相似度還是相近的。這個比歐幾里德距離準確。

#皮爾遜相關度

from math

import sqrt

defsim_pearson

(prefs,person1,person2):

si = {}

for item

in prefs[person1]:

if(item

in prefs[person2]):

si[item] =

1n = len(si)

if(n ==

0):return

0

#求和sum1 = sum(prefs[person1][item]

for item

in si)

sum2 = sum(prefs[person2][item]

for item

in si)

#求平方和

sum1_sq = sum(pow(prefs[person1][item],

2) for item

in si)

sum2_sq = sum(pow(prefs[person2][item],

2) for item

in si)

#求乘積和

asum = sum(prefs[person1][item]*prefs[person2][item]

for item

in si)

#計算皮爾遜評價值

num = asum-(sum1*sum2/n)

den = sqrt((sum1_sq-pow(sum1,

2)/n)*(sum2_sq-pow(sum2,

2)/n))

if(den ==

0):return

0

return (num/den)

sim = sim_pearson(critics,

'lisa rose',

'gene seymour')

print(sim)

適合於特徵資料量較大的情況(效果較好)

三:tanimoto

tanimoto感覺比較簡單:

交集/並集

這是乙個計算交集和並集的比率的方法

度量兩個集合之間的相似程度的方法。 

a=[1,2,3,4]                 列表長度:4

b=[1,2,7]                     列表長度:3

c = a & b = [1,2]        列表長度:2

t = nc / ( na + nb -nc) = len(c) / ( len(a) + len(b) - len(c)) = 2 / (4+3-2) = 0.4 

def

tanimoto

(p,q):

c = [v

for v

in p

if v

in q]

return float(len(c)) / ((len(p) + len(q) - len(c)))

可以使用者計算使用者之間的相似程度,這種方法適用於:資料表示為0、1這種二值化,而非有數量大小的情況

以上為全部內容,在查詢物品、人物相似程度上都是比較簡單的演算法,各自都有適用於的場景。

集體智慧型程式設計正式開始了接觸,第一課便是如何尋找想進使用者(也就是兩者的相似程度),正如大多數的推送服務一樣,通過計算你和其他的使用者的相似程度,給你推薦最佳匹配人認為很好的但是你還沒有購買的東西。

皮爾遜相關度歐式距離以及曼哈頓距離

有些時候我們需要獲得一些事物的相似度評價值,例如我們可以獲取到大量的資料用以分析人們在品味方面的相似度,為此,我們可以將沒個人與所有其他人進行對比,並計算他們的相似度評價。有很多種方法能夠幫助我們來實現這個目的,而我們今天要提到的則是歐幾里得距離和皮耶爾遜相關度,同時作為引申,簡單地涉及一些曼哈頓距...

皮爾遜相關度

在進行影片相似度計算的時候,有的人對於影片的評分習慣偏低,有的人習慣偏高,皮爾遜方法可以修正 誇大分值 的情況。如果某人總是傾向於給出比另乙個人更高的分值,而二者的分值又始終保持一致,則他們也會存在很高的相關性。recommendations.py 返回p1和p2的相關係數 def sim pear...

計算相似度評價值體系 歐幾里德距離和皮爾遜相關度

本文參考學習集體智慧型程式設計內容記錄。歐幾里德距離評價 計算相似度評價值的乙個非常簡單的方式是使用歐幾里德距離評價方法。它以經過人們一直評價的物品為座標軸,然後將參與評價的人繪製到圖上,並考察它們彼此間的距離遠近,如圖所示 該圖顯示了處於偏好空間的人們的分布狀況,toby在snakes軸線和dup...