2013-06-19 77 views
3

我需要測量兩個n維向量之間的距離。看來,馬哈拉諾比斯距離是一個很好的選擇,所以我想試試看。Mahalanobis距離測量的工作示例

我的代碼看起來是這樣的:

import numpy as np 
import scipy.spatial.distance.mahalanobis 

x = [19, 8, 0, 0, 2, 1, 0, 0, 18, 0, 1673, 9, 218] 
y = [17, 6, 0, 0, 1, 2, 0, 0, 8, 0, 984, 9, 30] 
scipy.spatial.distance.mahalanobis(x,y,np.linalg.inv(np.cov(x,y))) 

但我收到此錯誤信息:

/usr/lib/python2.7/dist-packages/scipy/spatial/distance.pyc in mahalanobis(u, v, VI) 
    498  v = np.asarray(v, order='c') 
    499  VI = np.asarray(VI, order='c') 
--> 500  return np.sqrt(np.dot(np.dot((u-v),VI),(u-v).T).sum()) 
    501 
    502 def chebyshev(u, v): 

ValueError: matrices are not aligned 

的SciPy的醫生說,這VI是協方差矩陣的逆,我覺得np.cov是協方差矩陣,np.linalg.inv是矩陣的逆...

但我看到這裏有什麼問題(矩陣不是對齊):Matrix VI具有錯誤的尺寸(2x2而不是13x13)。 所以可行的辦法是這樣做:

VI = np.linalg.inv(np.cov(np.vstack((x,y)).T)) 

但unfortuanly的np.cov(np.vstack((x,y)).T)的DET是0,這意味着,一個逆矩陣不exsists。

那麼我怎麼能使用馬哈拉諾比斯距離測量,當我甚至不能計算協方差矩陣?

回答

1

您沒有用於計算協方差的樣本集。你可能只需要這裏的歐幾里得距離(np.linalg.norm(x-y))。你試圖達成什麼樣的大局觀?

+0

我目前使用歐幾里德距離aka平方差的總和。但我想比較結果與其他距離度量,看看什麼最適合我的程序。 – reox

+0

當然,沒關係。一些距離度量(歐幾里得(ssd是歐幾里德平方),L1範數等)可以用於兩個任意矢量,但Mahalabonis距離是統計推導的,需要從一組數據點中學習協方差矩陣。歐幾里德距離可以被看作是馬哈拉博尼斯距離的一個特例,當你沒有做或者做不到時(即在沒有數據的情況下)任何有關分佈x和y的假設可能來自於。你可以使用任意的spd矩陣,但這不會有意義。 – YXD

+0

沒問題,所以更好的方法:首先用歐幾里得距離找到所有數據點之間的距離,然後通過一些算法進行聚類,例如,基於鄰接矩陣,現在我有簇,並且可以用mahalanobis決定新數據點是否屬於任何簇? – reox

3

您確定Mahalanobis Distance適合您?根據Wikipedia,您需要一組點來生成協方差矩陣,而不僅僅是兩個向量。然後,您可以計算集合中心向量的距離。

+0

當我讀到wp時,我看到:爲了使用Mahalanobis距離將測試點分類爲屬於N個類別之一,首先估計每個類別的協方差矩陣,通常基於已知屬於每個類別的樣本類。然後,給定一個測試樣本,計算每個類的Mahalanobis距離,並將測試點歸類爲Mahalanobis距離最小的類。 所以問題是我需要更多的載體來比較?所以讓我說我有他們喜歡x = [a,b,...,n]; a = [0,...,z];那麼它會工作? – reox