1. 程式人生 > >歐氏距離詳解及在matlab中的實現

歐氏距離詳解及在matlab中的實現

360百科:

二維公式

  d = sqrt((x1-x2)^2+(y1-y2)^2)

三維公式

d=sqrt((x1-x2)^2+(y1-y2)^2+(z1-z2)^2)

推廣到n維空間

歐氏距離的公式 :d=sqrt( ∑(xi1-xi2)^2 ) 這裡i=1,2n,xi1表示第一個點的第i維座標,xi2表示第二個點的第i維座標

n維歐氏空間是一個點集,它的每個點可以表示為(x(1),x(2),…x(n)),其中x(i)(i=1,2…n)是實數,稱為x的第i個座標,兩個點x和y=(y(1),y(2)…y(n))之間的距離d(x,y)定義為上面的公式。

在matlab中實現時,將d=sqrt( ∑(xi1-xi2)^2 )

展開 d=sqrt( ∑(xi1^2-2xi1*xi2+xi2^2))

例:

輸入樣本集a,xi1^2表示在第一個樣本點的每一維進行平方並求和,aa = sum(a.*a,2);xi2^2也是如此,xi1*xi2實際上就是a*a',xi1*xi2表示兩個樣本點的對應維數上的值相乘並求和

>> a=[1 2 3;4 5 6;7 8 9;10 11 12];   %a為3維空間中的4個樣本

>> aa = sum(a.*a,2);  %xi^2,aa為4*1,每個元素代表一個樣本的每維的平方和

>> ab = a*a';   %ab是4*4的,每個元素表示兩個樣本點的對應維數上的值相乘並求和


>>  D = bsxfun(@plus,aa,aa') - 2*ab; %按照公式d=sqrt( ∑(xi1^2-2xi1*xi2+xi2^2)),將aa複製4列,aa'複製4行,最後的都的                                                             %D是4*4,每個元素表示兩個樣本點的歐氏距離

>> D = sqrt(D);


對於更多的樣本數也是如此的方法。

還有一種簡單的求法,可以得到相同的結果,但效率較低,不適用於樣本數多的時候。


當輸入兩個資料集時:

>> aa = sum(a.*a,2);
>> bb = sum(b.*b,2);

>> ab = a*b';

>> D = bsxfun(@plus,aa,bb') - 2*ab;

>> D = sqrt(D);