1. 程式人生 > >演算法之常用的距離和相似度度量

演算法之常用的距離和相似度度量

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

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

距離度量

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

歐幾里得距離(Euclidean Distance)

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

 

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

明可夫斯基距離(Minkowski Distance)

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

 

  這裡的p值是一個變數,當p=2的時候就得到了上面的歐氏距離。

曼哈頓距離(Manhattan Distance)

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

 

切比雪夫距離(Chebyshev Distance)

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

 

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

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

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

相似度度量

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

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

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

 

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

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

 

Jaccard相似係數(Jaccard Coefficient)

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

 

廣義Jaccard係數

  廣義Jaccard係數可以用於文件資料,並在二元屬性情況下Jaccard係數。廣義Jaccard係數又稱Tanimoto係數。該係數用EJ表示,由下式定義: 

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

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