MATLAB求馬氏距離(Mahalanobis distance)
作者:凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/
1.馬氏距離計算公式
d2(xi, xj)=(xi-xj)TS-1(xi-xj)
其中,S是總體的協方差矩陣,而不是樣本的協方差矩陣。
2.matlab中現有的函數
>> x=[155 66;180 71;190 73;160 60;190 68;150 58;170 75] x = 155 66 180 71 190 73 160 60 190 68 150 58 170 75 >> Y = pdist(x,'mahal') Y = Columns 1 through 5 1.572816369474562 2.201942917264386 1.635800793960578 2.695107559788053 1.478413355546874 Columns 6 through 10 1.404831102709996 0.629126547789825 1.713111078598705 1.391260434780810 2.103238561272744 Columns 11 through 15 1.590313263839551 2.103238561272744 1.090736759616727 2.589223001191582 2.033867095735081 Columns 16 through 20 1.825496244926879 0.629126547789825 2.743712945526665 2.441925172889290 2.980237487501595 Column 21 2.793761753017197
其中,X每一行代表一個樣例,X是個二維的。Y的第一個數表示x1與x2之間的馬氏距離。
3.求x1與x2之間的馬氏距離
>> x=[155 66;180 71;190 73;160 60;190 68;150 58;170 75] x = 155 66 180 71 190 73 160 60 190 68 150 58 170 75 >> cov=cov(x) cov = 1.0e+02 * 2.702380952380953 0.739285714285714 0.739285714285714 0.412380952380952 >> s=inv(cov) s = 0.007261927639280 -0.013018640484967 -0.013018640484967 0.047588267151168 >> a=[-25 -5]*s*[-25;-5] a = 2.473751332087140 >> sqrt(a) ans = 1.572816369474561
4.注意
計算兩兩馬氏距離時,中間的協方差矩陣永遠是總體的,而不是這兩個的。所以,馬氏距離很容易受總體的影響,總體一變化,兩個樣例之間的馬氏距離就會變化。
以下敘述來自:歐氏距離 vs 馬氏距離 - bluenight專欄 - CSDN博客 https://blog.csdn.net/chl033/article/details/5526337
1)馬氏距離的計算是建立在總體樣本的基礎上的,這一點可以從上述協方差矩陣的解釋中可以得出,也就是說,如果拿同樣的兩個樣本,放入兩個不同的總體中,最后計算得出的兩個樣本間的馬氏距離通常是不相同的,除非這兩個總體的協方差矩陣碰巧相同;
2)在計算馬氏距離過程中,要求總體樣本數大於樣本的維數,否則得到的總體樣本協方差矩陣逆矩陣不存在,這種情況下,用歐式距離來代替馬氏距離,也可以理解為,如果樣本數小於樣本的維數,這種情況下求其中兩個樣本的距離,采用歐式距離計算即可。
3)還有一種情況,滿足了條件總體樣本數大於樣本的維數,但是協方差矩陣的逆矩陣仍然不存在,比如A(3,4),B(5,6);C(7,8),這種情況是因為這三個樣本在其所處的二維空間平面內共線(如果是大於二維的話,比較復雜???)。這種情況下,也采用歐式距離計算。
4)在實際應用中“總體樣本數大於樣本的維數”這個條件是很容易滿足的,而所有樣本點出現3)中所描述的情況是很少出現的,所以在絕大多數情況下,馬氏距離是可以順利計算的,但是馬氏距離的計算是不穩定的,不穩定的來源是協方差矩陣,這也是馬氏距離與歐式距離的最大差異之處。
我們熟悉的歐氏距離雖然很有用,但也有明顯的缺點。它將樣品的不同屬性(即各指標或各變量)之間的差別等同看待,這一點有時不能滿足實際要求。馬氏距離有很多優點。它不受量綱的影響,兩點之間的馬氏距離與原始數據的測量單位無關;由標准化數據和中心化數據(即原始數據與均值之差)計算出的二點之間的馬氏距離相同。馬氏距離還可以排除變量之間的相關性的干擾。它的缺點是誇大了變化微小的變量的作用。
5. MATLAB求兩個矩陣之間的馬氏距離,使用pdist2()函數
>> x=rand(4,3) x = 0.792207329559554 0.849129305868777 0.743132468124916 0.959492426392903 0.933993247757551 0.392227019534168 0.655740699156587 0.678735154857773 0.655477890177557 0.035711678574190 0.757740130578333 0.171186687811562 >> y=rand(2,3) y = 0.706046088019609 0.276922984960890 0.097131781235848 0.031832846377421 0.046171390631154 0.823457828327293 >> z=pdist2(x, y, 'mahal') z = 11.881392154588022 8.912492295829436 10.377530870286948 8.703763775002274 9.513297701500704 6.612259802538707 10.858334218503852 8.268677052674791
其中,數據X是n*d的,數據Y是m*d的,則馬氏距離是n*m的矩陣,代表數據X的第i個樣例與數據Y的第j個樣例之間的馬氏距離。
