1. 程式人生 > >常用距離和相似度度量

常用距離和相似度度量

在資料分析和資料探勘的過程中,我們經常需要知道個體間差異的大小,進而評價個體的相似性和類別。最常見的是資料分析中的相關分析,資料探勘中的分類和聚類演算法,如K最近鄰(KNN)和K均值(K-Means)。當然衡量個體差異的方法有很多,最近查閱了相關的資料,這裡整理羅列下。

我們先來看看距離的定義:

1)  d(x,y) >= 0                        正定性

2) d(x,y) = d(y,x)                        對稱性

3) d(x,k)+ d(k,y) >= d(x,y)       三角不等式

為了方便下面的解釋和舉例,先設定我們要比較X個體和Y個體間的差異,它們都包含了N個維的特徵,即X=(x1, x2, x3, … xn),Y=(y1, y2, y3, … yn)。下面來看看主要可以用哪些方法來衡量兩者的差異,主要分為距離度量和相似度度量。

一、距離度量

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

1、歐氏距離(Euclidean Distance)

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

                                                              Euclidean Distance

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

2、閔可夫斯基距離(Minkowski Distance)

明氏距離是歐氏距離的推廣,是對多個距離度量公式的概括性的表述。公式如下:

                                                                Minkowski Distance

這裡的p值是一個變數,當p=1時,就是下面的曼哈頓距離;當p=2的時候就得到了上面的歐氏距離;當p→∞時,就是下面的切比雪夫距離。

我們知道平面上到原點歐幾里得距離(p = 2)為 1 的點所組成的形狀是一個圓,當 p 取其他數值的時候呢?


注意,當 p < 1 時,閔可夫斯基距離不再符合三角形法則,舉個例子:當 p < 1, (0,0) 到 (1,1) 的距離等於 (1+1)^{1/p} 

> 2, 而 (0,1) 到這兩個點的距離都是 1。

閔可夫斯基距離比較直觀,但是它與資料的分佈無關,具有一定的侷限性,如果 x 方向的幅值遠遠大於 y 方向的值,這個距離公式就會過度放大 x 維度的作用。所以,在計算距離之前,我們可能還需要對資料進行 z-transform 處理,即減去均值,除以標準差:

                                                                    

其中, \mu : 該維度上的均值,  \delta : 該維度上的標準差

可以看到,上述處理開始體現資料的統計特性了。這種方法在假設資料各個維度不相關情況下利用資料分佈的特性計算出不同的距離。如果維度相互之間資料相關(例如:身高較高的資訊很有可能會帶來體重較重的資訊,因為兩者是有關聯的),這時候就要用到馬氏距離(Mahalanobis distance)了。


閔氏距離(包括曼哈頓距離、歐氏距離和切比雪夫距離)存在明顯的缺點。   舉個例子:二維樣本(身高,體重),其中身高範圍是150~190,體重範圍是50~60,有三個樣本:a(180,50),b(190,50),c(180,60)。那麼a與b之間的閔氏距離(無論是曼哈頓距離、歐氏距離或切比雪夫距離)等於a與c之間的閔氏距離,但是身高的10cm真的等價於體重的10kg麼?因此用閔氏距離來衡量這些樣本間的相似度很有問題。 


       簡單說來,閔氏距離的缺點主要有兩個:

(1)將各個分量的量綱(scale),也就是“單位”當作相同的看待了。

(2)沒有考慮各個分量的分佈(期望,方差等)可能是不同的。

3、曼哈頓距離(Manhattan Distance)

曼哈頓距離來源於城市區塊距離,是將多個維度上的距離進行求和後的結果,即當上面的明氏距離中p=1時得到的距離度量公式,如下:   

                                                                Manhattan Distance

假設在曼哈頓街區乘坐計程車從 P 點到 Q 點,白色表示高樓大廈,灰色表示街道:

                                                                         

綠色的斜線表示歐幾里得距離,在現實中是不可能的。其他三條折線表示了曼哈頓距離,這三條折線的長度是相等的


4、切比雪夫距離(Chebyshev Distance)

切比雪夫距離起源於國際象棋中國王的走法,我們知道國際象棋國王每次只能往周圍的8格中走一步,那麼如果要從棋盤中A格(x1, y1)走到B格(x2, y2)最少需要走幾步?擴充套件到多維空間,其實切比雪夫距離就是當p趨向於無窮大時的明氏距離:

Chebyshev Distance

其實上面的曼哈頓距離、歐氏距離和切比雪夫距離都是明可夫斯基距離在特殊條件下的應用。

5、馬哈拉諾比斯距離(Mahalanobis Distance)

既然歐幾里得距離無法忽略指標度量的差異,所以在使用歐氏距離之前需要對底層指標進行資料的標準化,而基於各指標維度進行標準化後再使用歐氏距離就衍生出來另外一個距離度量——馬哈拉諾比斯距離(Mahalanobis Distance),簡稱馬氏距離。

馬氏距離(Mahalanobis distance)是由印度統計學家馬哈拉諾比斯(P. C. Mahalanobis)提出的,表示資料的協方差距離。它是一種有效的計算兩個未知樣本集的相似度的方法。與歐氏距離不同的是它考慮到各種特性之間的聯絡(例如:一條關於身高的資訊會帶來一條關於體重的資訊,因為兩者是有關聯的)並且是尺度無關的(scale-invariant),即獨立於測量尺度。對於一個均值為μ,協方差矩陣為Σ的多變數向量,其馬氏距離為

                                                                  

而其中向量X與Y之間的馬氏距離定義為:

                                                                

若協方差陣是單位陣(各個樣本向量之間獨立同分布),則馬氏距離就是歐式距離。

考慮下面這張圖,橢圓表示等高線,從歐幾里得的距離來算,綠黑距離大於紅黑距離,但是從馬氏距離,結果恰好相反:

                                                                

馬氏距離實際上是利用 Cholesky transformation 來消除不同維度之間的相關性和尺度不同的性質。假設樣本點(列向量)之間的協方差對稱矩陣是 , 通過 Cholesky Decomposition(實際上是對稱矩陣 LU 分解的一種特殊形式,可參考之前的部落格)可以轉化為下三角矩陣和上三角矩陣的乘積: 。消除不同維度之間的相關性和尺度不同,只需要對樣本點 做如下處理: 。處理之後的歐幾里得距離就是原樣本的馬氏距離:為了書寫方便,這裡求馬氏距離的平方):

下圖藍色表示原樣本點的分佈,兩顆紅星座標分別是(3, 3),(2, -2:

由於 x, 方向的尺度不同,不能單純用歐幾里得的方法測量它們到原點的距離。並且,由於 和 是相關的(大致可以看出斜向右上),也不能簡單地在 和 方向上分別減去均值,除以標準差。最恰當的方法是對原始資料進行 Cholesky 變換,即求馬氏距離(可以看到,右邊的紅星離原點較近):

將上面兩個圖的繪製程式碼和求馬氏距離的程式碼貼在這裡,以備以後查閱:

# -*- coding=utf-8 -*-

# code related at: http://www.cnblogs.com/daniel-D/

import numpy as np

import pylab as pl

import scipy.spatial.distance as dist

def plotSamples(x, y, z=None):

    stars = np.matrix([[3., -2., 0.], [3., 2., 0.]])

    if z is not None:

        x, y = z * np.matrix([x, y])

        stars = z * stars

    pl.scatter(x, y, s=10)    

畫 gaussian 隨機點

    pl.scatter(np.array(stars[0]), np.array(stars[1]), s=200, marker='*', color='r')  

畫三個指定點

    pl.axhline(linewidth=2, color='g') 

畫 

    pl.axvline(linewidth=2, color='g')  

畫 

    pl.axis('equal')

    pl.axis([-5, 5, -5, 5])

    pl.show()

產生高斯分佈的隨機點

mean = [0, 0]      

平均值

cov = [[2, 1], [1, 2]]   

協方差

x, y = np.random.multivariate_normal(mean, cov, 1000).T

plotSamples(x, y)

covMat = np.matrix(np.cov(x, y))    

求 與 的協方差矩陣

Z = np.linalg.cholesky(covMat).I  

仿射矩陣

plotSamples(x, y, Z)

求馬氏距離 

print '\n到原點的馬氏距離分別是:'

print dist.mahalanobis([0,0], [3,3], covMat.I), dist.mahalanobis([0,0], [-2,2], covMat.I)

求變換後的歐幾里得距離

dots = (Z * np.matrix([[3, -2, 0], [3, 2, 0]])).T

print '\n變換後到原點的歐幾里得距離分別是:'

print dist.minkowski([0, 0], np.array(dots[0]), 2), dist.minkowski([0, 0], np.array(dots[1]), 2)

馬氏距離的變換和 PCA 分解的白化處理頗 有異曲同工之妙,不同之處在於:就二維來看,PCA 是將資料主成分旋轉到 軸(正交矩陣的酉變換),再在尺度上縮放(對角矩陣),實現尺度相同。而馬氏距離的 L逆矩陣是一個下三角,先在 和 方向進行縮放,再在 方向進行錯切(想象矩形變平行四邊形),總體來說是一個沒有旋轉的仿射變換。


6、漢明距離

漢明距離的定義 :兩個等長字串s1與s2之間的漢明距離定義為將其中一個變為另外一個所需要作的最小替換次數。例如字串“1111”與“1001”之間的漢明距離為2。 
       應用:資訊編碼(為了增強容錯性,應使得編碼間的最小漢明距離儘可能大)。

二、相似度度量

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

1、向量空間餘弦相似度(Cosine Similarity)

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

Cosine Similarity

2、皮爾森相關係數(Pearson Correlation Coefficient)

即相關分析中的相關係數r,分別對X和Y基於自身總體標準化後計算空間向量的餘弦夾角。公式如下:

Pearson Correlation Coefficient

3、Jaccard相似係數(Jaccard Coefficient)

Jaccard係數主要用於計算符號度量或布林值度量的個體間的相似度,因為個體的特徵屬性都是由符號度量或者布林值標識,因此無法衡量差異具體值的大小,只能獲得“是否相同”這個結果,所以Jaccard係數只關心個體間共同具有的特徵是否一致這個問題。如果比較X與Y的Jaccard相似係數,只比較xn和yn中相同的個數,公式如下:

Jaccard Coefficient

4、調整餘弦相似度(Adjusted Cosine Similarity)

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

5、歐氏距離與餘弦相似度

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

藉助三維座標系來看下歐氏距離和餘弦相似度的區別:

distance and similarity

從圖上可以看出距離度量衡量的是空間各點間的絕對距離,跟各個點所在的位置座標(即個體特徵維度的數值)直接相關;而餘弦相似度衡量的是空間向量的夾角,更加的是體現在方向上的差異,而不是位置。如果保持A點的位置不變,B點朝原方向遠離座標軸原點,那麼這個時候餘弦相似cosθ

是保持不變的,因為夾角不變,而A、B兩點的距離顯然在發生改變,這就是歐氏距離和餘弦相似度的不同之處。

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

上面都是對距離度量和相似度度量的一些整理和彙總,在現實的使用中選擇合適的距離度量或相似度度量可以完成很多的資料分析和資料探勘的建模,後續會有相關的介紹。