我试图应用mahal
来计算27个变量的两个行向量之间的Mahalanobis distance,其中mahal(X, Y)
和X
是两个向量但是,它会出现一个错误:Y
经过几分钟的研究,我知道我不能像这样使用它,但我仍然不确定为什么有人能给我解释一下吗?
下面还有一个The number of rows of X must exceed the number of columns.
方法的例子:
>> 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
我在
mahal
和[1.55 5 32]
上进行了测试,得到的结果与使用[5.76 43 34; 6.7 32 5; 3 3 5; 34 12 6;]
函数(11.1706)得到的结果相同,我试图计算27个变量的2个向量之间的距离,结果正常你觉得怎么样既然mahal
函数不能满足我的需要,我能指望这个解决方案吗? 最佳答案
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是:
d(x, y) = sqrt((x-y)S(x-y))
,其中S是它们的协方差矩阵。在MATLAB1中,以以下方式有效地实现了
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检查是否有版本为R2007b的MATLAB版本。