Mahalanobis两个向量之间的距离

时间:2013-05-11 19:53:08

标签: matlab image-processing statistics

我尝试应用mahal来计算27个变量的两个行向量之间的Mahalanobis distance mahal(X, Y),其中XY是两个向量。但是,它出现了一个错误:

  

The number of rows of X must exceed the number of columns.

经过几分钟的研究后,我发现我不能像这样使用它,但我仍然不确定为什么。有人能解释一下吗?

此外,我还有mahal方法的示例:

>> mahal([1.55 5 32],[5.76 43 34; 6.7 32 5; 3 3 5; 34 12 6;])

ans =    
   11.1706

在这种情况下,有人可以澄清MATLAB如何计算答案吗?

修改
我发现这个代码计算马哈拉诺比斯距离:

S = cov(X);
mu = mean(X);
d = (Y-mu)*inv(S)*(Y-mu)'
d = ((Y-mu)/S)*(Y-mu)'; % <-- Mathworks prefers this way

我在[1.55 5 32][5.76 43 34; 6.7 32 5; 3 3 5; 34 12 6;]上对其进行了测试,它给出了与使用mahal函数(11.1706)时相同的结果,并尝试计算距离27个变量的2个向量,它的工作原理。你怎么看待这件事?我可以指望这个解决方案,因为mahal函数无法满足我的需求吗?

1 个答案:

答案 0 :(得分:3)

  

mahal(X,Y) ...给了我这个错误:
  "The number of rows of X must exceed the number of columns."

documentation表示Y必须有多行而不是列(另请注意,文档将X表示为第二个输入参数,而不是第一个)。对您而言,这意味着您向mahal提供的第二个数组的行数多于列数。

为什么这么重要?此限制的目的是确保mahal具有足够的数据来构建用于计算马哈拉诺比斯距离的相关矩阵。如果没有足够的信息,输出将是垃圾。

在您的情况下,您的输入数组是两个输入向量,每个向量具有27个元素。 27个元素是否与不同的观察结果相对应,还是对27个变量进行了观察?如果是前者,只需确保两个向量都是列向量:

mahal(X(:), Y(:))

你很高兴。如果每个向量仅包含一个观测值,则对协方差矩阵的估计将完全不准确。同样,输入的行应该是观察结果!

  

在这种情况下,有人可以澄清MATLAB如何计算答案吗?

两个向量 x y 之间的Mahalanobis distance为:dM(x, y) = sqrt((x-y)TS-1(x-y)),其中 S 是它们的协方差矩阵

在MATLAB中 1 mahal(Y,X)以下列方式有效实施:

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);

您可以通过以下方式验证:

type mahal

请注意,MATLAB以平方单位计算马哈拉诺比斯距离,因此在您的示例中,马哈拉诺比斯距离实际上是11.1706的平方根, 3.3422。

  

我可以依靠这个[我的]解决方案,因为mahal函数无法满足我的需求吗?

你正确地做了一切,所以使用起来很安全。话虽如此,请注意MATLAB确实限制了第二个输入数组的尺寸,这是有充分理由的(如上所述)。

如果X只包含一行,cov会自动将其转换为列向量,这意味着每个值都会被视为不同的观察值。结果S将是不准确的(如果不是垃圾)。


1 检查MATLAB发布版本R2007b。