May*_*tro 4 statistics matlab image-processing
我尝试mahal计算27 个变量的 2 个行向量之间的马哈拉诺比斯距离,即 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
Run Code Online (Sandbox Code Playgroud)
有人能解释一下 MATLAB 在这种情况下如何计算答案吗?
编辑:
我找到了计算马哈拉诺比斯距离的代码:
S = cov(X);
mu = mean(X);
d = (Y-mu)*inv(S)*(Y-mu)'
d = ((Y-mu)/S)*(Y-mu)'; % <-- Mathworks prefers this way
Run Code Online (Sandbox Code Playgroud)
我在 上测试了它[1.55 5 32],[5.76 43 34; 6.7 32 5; 3 3 5; 34 12 6;]它给出了与使用mahal函数 (11.1706) 相同的结果,并且我尝试计算 27 个变量的 2 个向量之间的距离,并且它有效。你怎么看待这件事?mahal由于该功能无法满足我的需要,我可以依靠这个解决方案吗?
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(:))
Run Code Online (Sandbox Code Playgroud)
现在就可以走了。如果每个向量仅包含一个观测值,则您对协方差矩阵的估计将完全不准确。同样,输入的行应该是观察结果!
有人能解释一下 MATLAB 在这种情况下是如何计算答案的吗?
两个向量x和y之间的马氏距离为:,其中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);
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式验证:
type mahal
Run Code Online (Sandbox Code Playgroud)
请注意,MATLAB 以平方单位计算马氏距离,因此在您的示例中,马氏距离实际上是 11.1706 的平方根,即3.3422。
mahal由于该功能无法满足我的需要,我可以依靠这个[我的]解决方案吗?
您所做的一切都是正确的,因此可以安全使用。话虽如此,请注意 MATLAB 限制第二个输入数组的维度是有充分理由的(如上所述)。
如果X仅包含一行,则cov自动将其转换为列向量,这意味着每个值将被视为不同的观察值。结果S将是不准确的(如果不是垃圾的话)。
1检查 MATLAB 发行版本 R2007b。