使用Matlab pdist2函数结合Mahalanobis度量报错,求解决方案
解决pdist2使用Mahalanobis度量时的正定矩阵报错问题
嘿,我来帮你搞定这个报错!咱们先拆解下问题出在哪,再给你对应的解决办法。
为什么会报错?
你提到covu是对称且元素全正的矩阵,但正定矩阵的要求不止这两点——它需要所有特征值都严格大于0,而你的covu矩阵(全9的3x3矩阵)秩只有1,特征值是[27, 0, 0],有两个0特征值,属于奇异矩阵,完全不符合pdist2对Mahalanobis度量的协方差矩阵要求。
而根源是你的输入矩阵u本身:u的三行[1 2 3]、[4 5 6]、[7 8 9]是完全线性相关的(每一行都是前一行加3),这样的数据没有足够的方差维度,用nancov计算出来的协方差矩阵必然是奇异的。
两种可行的解决办法
1. 用伪逆矩阵替代奇异协方差矩阵(适用于数据确实线性相关的场景)
如果你的真实数据就是这种线性相关的情况(比如降维后只剩1个有效维度),可以用矩阵的伪逆pinv()来替代原协方差矩阵,这是一种近似处理方式:
u=[1 2 3; 4 5 6; 7 8 9]; n=[1 2 5;2 5 7;5 7 9]; covu=nancov(u); % 使用伪逆矩阵作为协方差参数 Z=pdist2(u,u,'mahalanobis',pinv(covu));
2. 调整输入数据,让协方差矩阵正定(适用于测试/数据可修改的场景)
如果这只是测试数据,那你只需要修改u,让它的行向量线性无关,这样nancov计算出的协方差矩阵就会是正定的。比如给u的第三列加一点变化:
% 修改后的u,行向量不再线性相关 u=[1 2 3; 4 5 7; 7 8 10]; covu=nancov(u); % 现在可以正常计算Mahalanobis距离了 Z=pdist2(u,u,'mahalanobis',covu);
验证矩阵是否正定的小技巧
你可以用eig(covu)来查看协方差矩阵的特征值,如果所有特征值都严格大于0,那它就是正定的;如果有0或者负数,就会触发pdist2的报错。
内容的提问来源于stack exchange,提问作者anna martin
相关产品推荐
相关产品推荐

