我需要測量兩個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。
那麼我怎麼能使用馬哈拉諾比斯距離測量,當我甚至不能計算協方差矩陣?
我目前使用歐幾里德距離aka平方差的總和。但我想比較結果與其他距離度量,看看什麼最適合我的程序。 – reox
當然,沒關係。一些距離度量(歐幾里得(ssd是歐幾里德平方),L1範數等)可以用於兩個任意矢量,但Mahalabonis距離是統計推導的,需要從一組數據點中學習協方差矩陣。歐幾里德距離可以被看作是馬哈拉博尼斯距離的一個特例,當你沒有做或者做不到時(即在沒有數據的情況下)任何有關分佈x和y的假設可能來自於。你可以使用任意的spd矩陣,但這不會有意義。 – YXD
沒問題,所以更好的方法:首先用歐幾里得距離找到所有數據點之間的距離,然後通過一些算法進行聚類,例如,基於鄰接矩陣,現在我有簇,並且可以用mahalanobis決定新數據點是否屬於任何簇? – reox