歐氏距離和余弦相似度

2021-07-28 07:03:14 字數 2898 閱讀 4669

參考自:

歐氏距離與余弦相似度

歐氏距離和余弦相似度

在資料分析和資料探勘的過程中,我們經常需要知道個體間差異的大小,進而評價個體的相似性和類別。最常見的是資料分析中的相關分析,資料探勘中的分類和聚類演算法,如k最近鄰(knn)和k均值(k-means)。

來衡量兩者的差異的方法,主要分為距離度量和相似度度量。

距離度量(distance)用於衡量個體在空間上存在的距離,距離越遠說明個體間的差異越大。

歐幾里得距離(euclidean distance)

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

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

其他距離度量還有:明可夫斯基距離(minkowski distance)曼哈頓距離(manhattan distance)切比雪夫距離(chebyshev distance)馬哈拉諾比斯距離(mahalanobis distance)等。

相似度度量(similarity),即計算個體間的相似程度,與距離度量相反,相似度度量的值越小,說明個體間相似度越小,差異越大。

向量空間余弦相似度(cosine similarity)

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

其他相似度度量還有:皮爾森相關係數(pearson correlation coefficient)jaccard相似係數(jaccard coefficient)等。

調整余弦相似度(adjusted cosine similarity)

雖然余弦相似度對個體間存在的偏見可以進行一定的修正,但是因為只能分辨個體在維之間的差異,沒法衡量每個維數值的差異,會導致這樣乙個情況:比如使用者對內容評分,5分制,x和y兩個使用者對兩個內容的評分分別為(1,2)和(4,5),使用余弦相似度得出的結果是0.98,兩者極為相似,但從評分上看x似乎不喜歡這2個內容,而y比較喜歡,余弦相似度對數值的不敏感導致了結果的誤差,需要修正這種不合理性,就出現了調整余弦相似度,即所有維度上的數值都減去乙個均值,比如x和y的評分均值都是3,那麼調整後為(-2,-1)和(1,2),再用余弦相似度計算,得到-0.8,相似度為負值並且差異不小,但顯然更加符合現實。

歐氏距離是最常見的距離度量,而余弦相似度則是最常見的相似度度量,很多的距離度量和相似度度量都是基於這兩者的變形和衍生,所以下面重點比較下兩者在衡量個體差異時實現方式和應用環境上的區別。

兩者相同的地方,就是在機器學習中都可以用來計算相似度,但是兩者的含義有很大差別,以我的理解就是:

前者是看成座標系中兩個點,來計算兩點之間的距離;

後者是看成座標系中兩個向量,來計算兩向量之間的夾角。

前者因為是點,所以一般指位置上的差別,即距離;

後者因為是向量,所以一般指方向上的差別,即所成夾角。

從圖上可以看出距離度量衡量的是空間各點間的絕對距離,跟各個點所在的位置座標(即個體特徵維度的數值)直接相關;而余弦相似度衡量的是空間向量的夾角,更加的是體現在方向上的差異,而不是位置。如果保持a點的位置不變,b點朝原方向遠離座標軸原點,那麼這個時候余弦相似度cosθ是保持不變的,因為夾角不變,而a、b兩點的距離顯然在發生改變,這就是歐氏距離和余弦相似度的不同之處。

根據歐氏距離和余弦相似度各自的計算方式和衡量特徵,分別適用於不同的資料分析模型:歐氏距離能夠體現個體數值特徵的絕對差異,所以更多的用於需要從維度的數值大小中體現差異的分析,如使用使用者行為指標分析使用者價值的相似度或差異;而余弦相似度更多的是從方向上區分差異,而對絕對的數值不敏感,更多的用於使用使用者對內容評分來區分使用者興趣的相似度和差異,同時修正了使用者間可能存在的度量標準不統一的問題(因為余弦相似度對絕對數值不敏感)。

假設||a||、||b||表示向量a、b的2範數,例如向量[1,2,3]的2範數為:

√(1²+2²+3²) = √14

numpy中提供了範數的計算工具:linalg.norm()

所以計算cosθ起來非常方便(假定a、b均為列向量):

num = float(a.t * b) #若為行向量則 a * b.t  

denom = linalg.norm(a) * linalg.norm(b)

cos = num / denom #余弦值

sim = 0.5 + 0.5 * cos #歸一化

因為有了linalg.norm(),歐氏距離公式實現起來更為方便:

dist = linalg.norm(a - b)  

sim = 1.0 / (1.0 + dist) #歸一化

關於歸一化:

因為余弦值的範圍是 [-1,+1] ,相似度計算時一般需要把值歸一化到 [0,1],一般通過如下方式:

sim = 0.5 + 0.5 * cosθ

若在歐氏距離公式中,取值範圍會很大,一般通過如下方式歸一化:

sim = 1 / (1 + dist(x,y))

歐氏距離和余弦相似度

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

歐氏距離和余弦相似度

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

相似度計算 歐氏距離 漢明距離 余弦相似度

計算影象間的相似性可以使用歐氏距離 余弦相似度 作為度量,前者強調點的思想,後者注重線的思想。歐氏距離 歐式距離 euclidean distance即n維空間中兩個點之間的實際距離。已知兩個點a a1,a2,an b b1,b2,b n a a1,a 2,an b b1,b 2,bn 則ab間的距...