3

我试图申请mahal计算27 个变量的 2 个行向量之间的马氏距离 和是两个向量。但是,它出现了一个错误: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由于该功能无法满足我的需求,我可以指望这个解决方案吗?

4

1 回答 1

4

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

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

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

在您的情况下,您的输入数组是两个输入向量,每个向量都有 27 个元素。这 27 个元素是对应于不同的观察,还是它们是 27 个变量的一个观察?如果是前者,只需确保两个向量都是列向量:

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

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

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

两个向量xy之间的马氏距离是:,其中S是它们的协方差矩阵。dM(x, y) = sqrt((x-y)TS-1(x-y))

在 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。

于 2013-05-11T23:04:05.603 回答