我尝试应用mahal
来计算27个变量的两个行向量之间的Mahalanobis distance,即 mahal(X, Y)
,其中X
和Y
是两个向量。但是,它出现了一个错误:
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
函数无法满足我的需求吗?
答案 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。