马氏距离Mahalanobis Distance实例

简介

如果按照欧氏距离去理解马氏距离,一定会迷惑一段时间。因为欧氏距离可以计算两个点之间的距离,而马氏距离是计算一个点距离一个聚类的距离。如果想通过马氏距离去计算某两个点之间的距离是行不通的。下面按照一般的套路介绍一下欧氏距离与马氏距离的定义,从定义上可以发现二者之间的差异。

欧氏距离

p和q两个点之间的欧氏距离,p和q都由n个维度构成。
在这里插入图片描述
对于维度尺度相同的情况,欧氏距离表现良好。如计算平面(二维)或三维空间中点之间的距离。但是对于有其它尺度的维度信息表现就不尽人意。下面两张表分别列举了面积和价格的关系,但是单位不同,这样子欧氏距离计算的表中任意两行之间的距离就差别巨大。
在这里插入图片描述
从技术上讲,可以通过归一化或者(x-mean)/std来克服这个问题,但是还有另一个主要缺点。也就是说,如果维度(数据集中的列)相关,(实际数据集中通常是这种情况),则点与点中心(分布)之间的欧氏距离所给出的信息很少或具有误导性关于一个点实际距离聚类的距离。下图左图X与Y两个维度(数据集的两列)不相关,欧氏距离可以很好的判别Point1和Point2距离聚类的远近。如右图所示,X与Y相关时欧氏距离就无法很好的表征Point1和Point2谁是异常点(离群点)了。因为,两个点与中心的距离相等(欧氏距离)。但是,即使两点之间的欧氏距离相等,但实际上只有蓝色点更接近该聚类。
在这里插入图片描述

出现这个问题的原因是因为,欧氏距离仅是两点之间的距离。它不考虑数据集中的其余点如何变化。因此,它不能用来真正判断一个点实际上与点的分布(聚类)的接近程度。马氏距离在很多应用场合可以很好的解决这一问题。

马氏距离

马氏距离是一种有效的多元距离计算方法,用于计算点与聚类(分布)之间的距离。其在多维数据集异常检测,高维数据集分类应用中表现出色。马氏距离是由Mahalanobis教授于1936年提出的,此后一直在各种统计应用中使用。
马氏距离的定义公式如下(定义如此简单,理解方式需要转变):
在这里插入图片描述
这里就不翻译了,英文更有助于理解,看到这里想必已经理解了马氏距离为什么是点到聚类的距离而不是点到点的距离了。

其中, 
 - D^2        is the square of the Mahalanobis distance. 
 - x          is the vector of the observation (row in a dataset), 
 - m          is the vector of mean values of independent variables (mean of each column), 
 - C^(-1)     is the inverse covariance matrix of independent variables. 

那么,如何理解以上公式呢?

让我们来看看 ( x − m ) T ∗ C − 1 (x-m)^T*C^{-1} (xm)TC1,x-m本质上是向量与平均值的距离。然后,将其除以协方差矩阵(或乘以协方差矩阵的逆),这实际上是常规的标准化公式 ( z = ( x – m u ) / s i g m a ) (z =(x – mu)/ sigma) z=xmu/sigma。除以协方差的作用是,如果数据集中的变量高度相关,则协方差将很高。除以较大的协方差将有效缩短距离。同样,如果X不相关,则协方差也不高,距离也不会减少太多。

基于Matlab计算马氏距离

假设有五个人的数据,每个人的数据为一个向量,包括身高、分数和年龄:

X       Y       Z
Height  Score   Age
64.0    580.0   29.0
66.0    570.0   33.0
68.0    590.0   37.0
69.0    660.0   46.0
73.0    600.0   55.0
			
m =68.0 600.0   40.0
			
n=5		

平均值m= (68.0, 600.0, 40.0)。现在假设另一个人的数据为v = (66, 640, 44), 通过马氏距离计算这个人与上面这一组人的马氏距离为5.33,下面基于Matlab 实现马氏距离的计算。
方法1:基于mahal函数

obs = [64.0    580.0   29.0; 66.0    570.0   33.0; 68.0    590.0   37.0; 69.0    660.0   46.0; 73.0    600.0   55.0];
per = [66, 640, 44];
mdi = sqrt(mahal(per,obs))

mahal返回的是马氏距离的平方,需要开根号得到马氏距离。

mdi =

    5.3345

mahal函数是Matlab自带函数,无需自己定义。从定义可以清楚的看到范围的是距离的平方,X为样本数据,也就是提前已知的一个聚类数据,Y是观测数据,也就是要计算Y中的每一个观测距离样本数据集的距离,如果Y有n个观测(n行数据),将会计算出来n个距离,如果Y只有一个观测将会计算出一个距离。从mahal的实现来看D2(I) = (Y(I,:)-MU) * SIGMA^(-1) * (Y(I,:)-MU)'转置是放在后面的,与马氏距离的定义有所不同。如果是自己实现马氏距离的时候,这一点要注意,否则会一直出错。

function d = mahal(Y,X);
%MAHAL Mahalanobis distance.
%   D2 = MAHAL(Y,X) returns the Mahalanobis distance (in squared units) of
%   each observation (point) in Y from the sample data in X, i.e.,
%
%      D2(I) = (Y(I,:)-MU) * SIGMA^(-1) * (Y(I,:)-MU)',
%
%   where MU and SIGMA are the sample mean and covariance of the data in X.
%   Rows of Y and X correspond to observations, and columns to variables.  X
%   and Y must have the same number of columns, but can have different numbers
%   of rows.  X must have more rows than columns.
%
%   Example:  Generate some highly correlated bivariate data in X.  The
%   observations in Y with equal coordinate values are much closer to X as
%   defined by Mahalanobis distance, compared to the observations with opposite
%   coordinate values, even though they are all approximately equidistant from
%   the mean using Euclidean distance.
%
%      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')
%
%   See also PDIST.

%   Copyright 1993-2007 The MathWorks, Inc. 


[rx,cx] = size(X);
[ry,cy] = size(Y);

if cx ~= cy
   error(message('stats:mahal:InputSizeMismatch'));
end

if rx < cx
   error(message('stats:mahal:TooFewRows'));
end
if any(imag(X(:))) | any(imag(Y(:)))
   error(message('stats:mahal:NoComplex'));
end

m = mean(X,1);
M = m(ones(ry,1),:);
C = X - m(ones(rx,1),:);
[Q,R] = qr(C,0);

ri = R'\(Y-M)';
d = sum(ri.*ri,1)'*(rx-1);


方法2:根据定义实现

obs = [64.0    580.0   29.0; 66.0    570.0   33.0; 68.0    590.0   37.0; 69.0    660.0   46.0; 73.0    600.0   55.0];
per = [66, 640, 44];

mea = mean(obs);
icv = inv(cov(obs));

mdi = sqrt(((per - mea)*icv)*(per - mea)')
mdi =

    5.3345

方法3:excel实现

在这里插入图片描述
从v中减去平均值:(66,640,44)–(68.0,600.0,40.0)得到v-m =(-2,40,4)。然后将1×3向量乘以3×3逆协方差矩阵,得到中间1×3结果tmp =(-9.9964,-0.1325,3.4413)。然后,将1×3中间结果乘以(-2、40、4)的转置1x3,以得到1×1马氏距离的平方= 28.4573。最后一步是取平方根,得到最终的马氏距离= 5.33。

总结

马氏距离不同于欧氏距离,马氏距离是对一组数据的距离,而不是像欧氏距离针对点与点的距离。明白了这一点就会发现很简单了。看资料还是要看英文版的,下面是博客内容出处的连篇文章。

参考
https://www.machinelearningplus.com/statistics/mahalanobis-distance/
https://jamesmccaffrey.wordpress.com/2017/11/09/example-of-calculating-the-mahalanobis-distance/

  • 16
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值