有些時候我們需要獲得一些事物的相似度評價值,例如我們可以獲取到大量的資料用以分析人們在品味方面的相似度,為此,我們可以將沒個人與所有其他人進行對比,並計算他們的相似度評價。有很多種方法能夠幫助我們來實現這個目的,而我們今天要提到的則是歐幾里得距離和皮耶爾遜相關度,同時作為引申,簡單地涉及一些曼哈頓距離的演算法。
計算相似度評價值的乙個非常簡單的方法是使用歐幾里德距離的評價方法,因為很多人都用了那個書上的例子,但是如果沒看過這本書的人沒有看前面的介紹可能理解起來也不那麼舒服,因為這個演算法本身很簡單所以在此我使用乙個更簡單的圖來解釋一下這個 演算法。下面這個圖 是對兩種性格的評價,一共有四個人對此作出了評價,a,b,c,d。圖上很明顯的表現出來了。
那麼我們如何判斷這些人對一些性格的相關度呢?這裡的歐幾里得演算法其實質就是乙個簡單粗暴的方法。我們簡單看一下這個演算法的定義:1歐幾里得度量(euclidean metric)(也稱歐氏距離)是乙個通常採用的距離定義,指在m維空間中兩個點之間的真實距離,或者向量的自然長度(即該點到原點的距離)。在二維和三維空間中的歐氏距離就是兩點之間的實際距離。對,其實說白了就是兩個點之間的距離。(當然,這裡我們所說的僅限於二維和三維空間)。
以上就是其公式。使用歐幾里得演算法要注意的有一點的是,在使用歐幾里得距離時需要十分注意不能對不同單位的量度使用,比如常見的容易混淆的身高體重之類。
下面是其實現的**:
from math import sqrt
#需要使用開方
def sim_distance(prefs,person1,person2)
si = {}#準備乙個列表
foritem
in prefs[person1]:
ifitem
in prefs[person2]:
si[item] = 1
iflen(si) == 0: return
0#兩者沒有共同之處,返回0
sum_of_squares = sum([pow(prefs[person1][item]-pow(prefs[person2][item],2) for
item
in prefs[person1] if
item
in prefs[person2]])
return
1/(1+sqrt(sum_of_squares))
這裡可能有些童鞋比較猶豫我的最後一步為什麼要加1求倒數,這是因為我們得到的是距離啊(敲黑板)並不是相似度,而這裡的函式值加一則是因為避免遇到點重合然後除零報錯的問題。同時,由於求導,我們計算出的結果與1相近則相似度較大,與0相近則相似度較小甚至木有。
缺點:會出現較大的誤差,尤其是在處理一些主觀問題上時,相似度的比較誤差會很大,就比如上圖中的d點和a點,在我們使用歐幾里得演算法的時候,直觀上來講,他們的相似度會因為距離遙遠而變得很低,但實際情況是,兩個人的評價可能存在保守與非保守的情況,這就是乙個很大的主觀因素,如果你繼續往下去看會發現,兩人處於同一條直線,用皮爾遜相關度來解釋就會發現兩者的關係其實存在很大的相似度。
critics = ,
'gene seymour': ,
'michael phillips': ,
'claudia puig': ,
'mick lasalle': ,
'jack matthews': ,
'toby': }
from math import sqrt
def sim_pearson(prefs, p1, p2):
# get the list of mutually rated items
si = {}
foritem
in prefs[p1]:
ifitem
in prefs[p2]:
si[item] = 1
# if they are no ratings in common, return 0
iflen(si) == 0:
return
0# sum calculations
n = len(si)
# sums of all the preferences
sum1 = sum([prefs[p1][it] for
itin si])
sum2 = sum([prefs[p2][it] for
itin si])
# sums of the squares
sum1sq = sum([pow(prefs[p1][it], 2) for
itin si])
sum2sq = sum([pow(prefs[p2][it], 2) for
itin si])
# sum of the products
psum = sum([prefs[p1][it] * prefs[p2][it] for
itin si])
# calculate r (pearson score)
num = psum - (sum1 * sum2 / n)
den = sqrt((sum1sq - pow(sum1, 2) / n) * (sum2sq - pow(sum2, 2) / n))
if den == 0:
return
0 r = num / den
return r
所以綜上所述就是簡單的對於皮爾遜相關度的演算法的乙個表示。有興趣的童鞋也可以去看看有關相關度的資料對這裡加強一下理解。
曼哈頓距離的命名原因是從規劃為方型建築區塊的城市(如曼哈頓)間,最短的行車路徑而來(忽略曼哈頓的單向車道以及只存在於3、14大道的斜向車道)。任何往東三區塊、往北六區塊的的路徑一定最少要走九區塊,沒有其他捷徑。
圖中紅線代表曼哈頓距離,綠色代表歐氏距離,也就是直線距離,而藍色和黃色代表等價的曼哈頓距離。曼哈頓距離——兩點在南北方向上的距離加上在東西方向上的距離,即d(i,j)=|xi-xj|+|yi-yj|。對於乙個具有正南正北、正東正西方向規則布局的城鎮街道,從一點到達另一點的距離正是在南北方向上旅行的距離加上在東西方向上旅行的距離,因此,曼哈頓距離又稱為計程車距離。
在早期圖形學中使用曼哈頓距離演算法是因為,歐幾里德演算法浮點數較打且精度較低,所以使用曼哈頓距離演算法。
在計算相似度的時候,我們可以有很多演算法來選擇,但是我們要根據我們的實際情況來進行選擇,歐幾里德演算法適合快速得出相似度的時候,而皮爾遜相關度的演算法則在一定程度上會更加精確。
以上內容經過整理得到 如有問題請及時提出感謝各位大佬。
歐式距離與曼哈頓距離的區別以及曼哈頓距離的應用
歐氏距離就是我們最常用的兩點之間的直線距離。以二維空間為例,兩點 x1,y1 x2,y2 之間的歐式距離為 曼哈頓距離則表示兩個點在標準座標系上的絕對軸距之和。還是以二維空間為例,兩點 x1,y1 x2,y2 之間的曼哈頓距離為 用一張圖來區分一下兩者 圖中綠線是歐氏距離,紅線是曼哈頓距離,藍線和黃...
歐幾里德距離 皮爾遜相關度 Tanimoto
集體智慧型程式設計正式開始了接觸,第一課便是如何尋找想進使用者 也就是兩者的相似程度 正如大多數的推送服務一樣,通過計算你和其他的使用者的相似程度,給你推薦最佳匹配人認為很好的但是你還沒有購買的東西。測試資料如下 就是巢狀字典,共7個人對使用過的商品的評價 critics gene seymour ...
請比較歐式距離與曼哈頓距離?
歐氏距離是最容易直觀理解的距離度量方法,我們小學 初中和高中接觸到的兩個點在空間中的距離一般都是指歐氏距離。顧名思義,在曼哈頓街區要從乙個十字路口開車到另乙個十字路口,駕駛距離顯然不是兩點間的直線距離。這個實際駕駛距離就是 曼哈頓距離 曼哈頓距離也稱為 城市街區距離 city block dista...