使用Matlab计算各种距离Distance

时间:2024-04-17 11:19:21

计算距离的需求有两种:
  一种是给定一个特征集合X,然后计算Pairwise距离矩阵,那么可使用D=pdist(X,distance)的方式;
  另一种是给定两个对应的特征集合X和Y,然后计算X与Y对应的距离信息,使用D=pdist2(X,Y,distance)的方式;
需注意,2011版本以前的Matlab是没有pdist2.m文件的,而早期的pdist2.m文件中的距离计算方式也比较少,所以建议使用最新的Matlab版本,很重要。

其中,distance的定义有如下几种:
欧几里德距离Euclidean distance(euclidean)
欧氏距离虽然很有用,但也有明显的缺点。
一:它将样品的不同属性(即各指标或各变量)之间的差别等同看待,这一点有时不能满足实际要求。
二:它没有考虑各变量的数量级(量纲),容易犯大数吃小数的毛病。所以,可以先对原始数据进行规范化处理再进行距离计算。

标准欧几里德距离Standardized Euclidean distance(seuclidean)
相比单纯的欧氏距离,标准欧氏距离能够有效的解决上述缺点。注意,这里的V在许多Matlab函数中是可以自己设定的,不一定非得取标准差,可以依据各变量的重要程度设置不同的值,如knnsearch函数中的Scale属性。

马哈拉诺比斯距离Mahalanobis distance(‘mahalanobis’)
where C is the covariance matrix.
马氏距离是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示数据的协方差距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧式距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的)并且是尺度无关的(scale-invariant),即独立于测量尺度。
如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧式距离,如果协方差矩阵为对角阵,则其也可称为正规化的欧氏距离.
马氏优缺点:
  1)马氏距离的计算是建立在总体样本的基础上的,因为C是由总样本计算而来,所以马氏距离的计算是不稳定的;
  2)在计算马氏距离过程中,要求总体样本数大于样本的维数。
  3)协方差矩阵的逆矩阵可能不存在。

曼哈顿距离(城市区块距离)City block metric(cityblock)
Notice that the city block distance is a special case of the Minkowski metric, where p=1.

闵可夫斯基距离Minkowski metric(minkowski)
Notice that for the special case of p = 1, the Minkowski metric gives the city block metric, for the special case of p = 2, the Minkowski metric gives the Euclidean distance, and for the special case of p = ∞, the Minkowski metric gives the Chebychev distance.
闵可夫斯基距离由于是欧氏距离的推广,所以其缺点与欧氏距离大致相同。

切比雪夫距离Chebychev distance(chebychev)
Notice that the Chebychev distance is a special case of the Minkowski metric, where p = ∞.

夹角余弦距离Cosine distance(cosine)
与Jaccard距离相比,Cosine距离不仅忽略0-0匹配,而且能够处理非二元向量,即考虑到变量值的大小。

相关距离Correlation distance(correlation)
Correlation距离主要用来度量两个向量的线性相关程度。

汉明距离Hamming distance(hamming)
两个向量之间的汉明距离的定义为两个向量不同的变量个数所占变量总数的百分比。

杰卡德距离Jaccard distance(jaccard)
Jaccard距离常用来处理仅包含非对称的二元(0-1)属性的对象。很显然,Jaccard距离不关心0-0匹配,而Hamming距离关心0-0匹配。

Spearman distance(‘spearman’)

 

 

matlab中各种距离计算方式

1pdist函数

调用格式:Y=pdist(X,’metric’) 
说明:用 ‘metric’指定的方法计算 X 数据矩阵中对象之间的距离。’ 
X:一个m×n的矩阵,它是由m个对象组成的数据集,每个对象的大小为n。 

metric’取值如下: 
‘euclidean’:欧氏距离(默认);

‘seuclidean’:标准化欧氏距离;

‘mahalanobis’:马氏距离; 

‘cityblock’:布洛克距离;

‘minkowski’:明可夫斯基距离; 

‘cosine’: 夹角余弦

‘correlation’:  相关距离

‘spearman\'             

‘hamming’: 汉明距离

‘jaccard’:    杰卡德距离& 杰卡德相似系数               

‘chebychev’:Chebychev距离

 

2pdist2函数

D = pdist2(X,Y)
D = pdist2(X,Y,distance)
D = pdist2(X,Y,\'minkowski\',P)
D = pdist2(X,Y,\'mahalanobis\',C)
D = pdist2(X,Y,distance,\'Smallest\',K)
D = pdist2(X,Y,distance,\'Largest\',K)
[D,I] = pdist2(X,Y,distance,\'Smallest\',K)
[D,I] = pdist2(X,Y,distance,\'Largest\',K)

 

clc;clear;
x = rand(4,3)
y = rand(1,3)

md1 = pdist2(x,y,\'Euclidean\');

md2 = pdist2(x,y,\'seuclidean\');

md3 = pdist2(x,y,\'mahalanobis\');

md4 = pdist2(x,y,\'cityblock\');

md5 = pdist2(x,y,\'minkowski\',p);

md6 = pdist2(x,y,\'chebychev\');

md7 = pdist2(x,y,\'cosine\');

md8 = pdist2(x,y,\'correlation\');

md9 = pdist2(x,y,\'hamming\');

md10 = pdist2(x,y,\'jaccard\');
md11 = pdist2(x,y,\'spearman\');

D1=[d1,md1],D2=[d2,md2],D3=[d3,md3]

D4=[d4,md4],D5=[d5,md5],D6=[d6,md6]

D7=[d7,md7],D8=[d8,md8]

md9,md10,md11

运行结果如下:

x =

    0.5225    0.6382    0.6837
    0.3972    0.5454    0.2888
    0.8135    0.0440    0.0690
    0.6608    0.5943    0.8384

y =

    0.5898    0.7848    0.4977

D1 =

    0.2462    0.2462
    0.3716    0.3716
    0.8848    0.8848
    0.3967    0.3967

D2 =

    0.8355    0.8355
    1.5003    1.5003
    3.1915    3.1915
    1.2483    1.2483

D3 =

  439.5074  439.5074
  437.5606  437.5606
  438.3339  438.3339
  437.2702  437.2702

D4 =

    0.3999    0.3999
    0.6410    0.6410
    1.3934    1.3934
    0.6021    0.6021

D5 =

    0.2147    0.2147
    0.3107    0.3107
    0.7919    0.7919
    0.3603    0.3603

D6 =

    0.1860    0.1860
    0.2395    0.2395
    0.7409    0.7409
    0.3406    0.3406

D7 =

    0.0253    0.0253
    0.0022    0.0022
    0.3904    0.3904
    0.0531    0.0531

D8 =

    1.0731    1.0731
    0.0066    0.0066
    1.2308    1.2308
    1.8954    1.8954

md9 =

     1
     1
     1
     1

md10 =

     1
     1
     1
     1

md11 =

    1.5000
    0.0000
    1.5000
    2.0000



3mahal函数

 调用格式:D2=mahal(Y,X)

 D2(I) = (Y(I,:)-MU) * SIGMA^(-1) * (Y(I,:)-MU)\',

例子: 

       x = mvnrnd([0;0], [1 .9;.9 1], 100);
       y = [1 1;1 -1;-1 1;-1 -1];
       MahalDist = mahal(y,x)
       sqEuclidDist = sum((y - repmat(mean(x),4,1)).^2, 2)
       plot(x(:,1),x(:,2),\'b.\',y(:,1),y(:,2),\'ro\')

 

4、squareform函数

计算上三角矩阵和方形矩阵之间的距离矩阵

调用格式:

 Z = squareform(Y)如果Y是由pdist函数得到的向量,翻转Y为一个对称方矩格式,

则Z(i,j)表示为原数据上i和j间的距离。

详见 matlab  help squareform