Python 歐氏距離和余弦距離

2021-08-07 07:58:57 字數 1840 閱讀 1029

一、歐幾里得距離(euclidean distance)

歐氏距離是最常見的距離度量,衡量的是多維空間中各個點之間的絕對距離。公式如下:

因為計算是基於各維度特徵的絕對數值,所以歐氏度量需要保證各維度指標在相同的刻度級別,比如對身高(cm)和體重(kg)兩個單位不同的指標使用歐式距離可能使結果失效。

python實現如下:

import numpy as np

x=np.random.random(10)

y=np.random.random(10)

# solution1

dist1 = np.linalg.norm( x - y )

# solution2

dist2 = np.sqrt(np.sum(np.square(x - y)))

print('x',x)

print('y',y)

print('dist1',dist1)

print('dist2',dist2)

執行結果:

二、余弦距離

余弦相似度用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小。相比距離度量,余弦相似度更加注重兩個向量在方向上的差異,而非距離或長度上。公式如下:

python實現如下:

import numpy as np

from scipy.spatial.distance import pdist

x=np.random.random(10)

y=np.random.random(10)

# solution1

dist1 = 1 - np.dot(x,y)/(np.linalg.norm(x)*np.linalg.norm(y))

# solution2

dist2 = pdist(np.vstack([x,y]),'cosine')

print('x',x)

print('y',y)

print('dist1',dist1)

print('dist2',dist2)

執行結果:

三、歐氏距離和余弦距離的區別

余弦距離使用兩個向量夾角的余弦值作為衡量兩個個體間差異的大小。相比歐氏距離,余弦距離更加注重兩個向量在方向上的差異。

借助三維座標系來看下歐氏距離和余弦距離的區別:

從上圖可以看出,歐氏距離衡量的是空間各點的絕對距離,跟各個點所在的位置座標直接相關;而余弦距離衡量的是空間向量的夾角,更加體現在方向上的差異,而不是位置。如果保持a點位置不變,b點朝原方向遠離座標軸原點,那麼這個時候余弦距離 

歐氏距離和余弦距離各自有不同的計算方式和衡量特徵,因此它們適用於不同的資料分析模型:

歐氏距離能夠體現個體數值特徵的絕對差異,所以更多的用於需要從維度的數值大小中體現差異的分析,如使用使用者行為指標分析使用者價值的相似度或差異。

余弦距離更多的是從方向上區分差異,而對絕對的數值不敏感,更多的用於使用使用者對內容評分來區分興趣的相似度和差異,同時修正了使用者間可能存在的度量標準不統一的問題(因為余弦距離對絕對數值不敏感)。

歐氏距離和余弦距離

一 歐幾里得距離 euclidean distance 歐氏距離是最常見的距離度量,衡量的是多維空間中各個點之間的絕對距離。公式如下 因為計算是基於各維度特徵的絕對數值,所以歐氏度量需要保證各維度指標在相同的刻度級別。eg 在深度學習中,提取cnns倒數的第二層fc作為最後的特徵向量,來進行人臉比對...

歐氏距離和余弦相似度

兩者相同的地方,就是在機器學習中都可以用來計算相似度,但是兩者的含義有很大差別,以我的理解就是 前者是看成座標系中兩個點,來計算兩點之間的距離 後者是看成座標系中兩個向量,來計算兩向量之間的夾角。前者因為是點,所以一般指位置上的差別,即距離 後者因為是向量,所以一般指方向上的差別,即所成夾角。如下圖...

歐氏距離和余弦相似度

參考自 歐氏距離與余弦相似度 歐氏距離和余弦相似度 在資料分析和資料探勘的過程中,我們經常需要知道個體間差異的大小,進而評價個體的相似性和類別。最常見的是資料分析中的相關分析,資料探勘中的分類和聚類演算法,如k最近鄰 knn 和k均值 k means 來衡量兩者的差異的方法,主要分為距離度量和相似度...