MATLAB求馬氏距離(Mahalanobis distance)


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個樣例之間的馬氏距離。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM