Mahalonobis距离在R中的应用,出现错误:系统计算奇异。

14

我想计算多元空间中一组点到这些点的质心的距离。对此,马氏距离似乎很合适。但是,我遇到了一个错误(见下文)。

有没有人能告诉我为什么会出现这个错误,以及是否有解决办法?

如果您下载坐标数据相关环境数据,可以运行以下代码。

require(maptools)
occ <- readShapeSpatial('occurrences.shp')
load('envDat.Rdata')

#standardize the data to scale the variables
dat <- as.matrix(scale(dat))
centroid <- dat[1547,]  #let's assume this is the centroid in this case

#Calculate multivariate distance from all points to centroid
mahalanobis(dat,center=centroid,cov=cov(dat))

Error in solve.default(cov, ...) : 
  system is computationally singular: reciprocal condition number = 9.50116e-19

.@Pascal - 将tol=1e-20设置为所有数据集都有效吗?对我来说,输入数据集是随机的,并且它不断抛出新的“倒数条件数”。您知道任何可能的解决方案,以便将其与任何可能的未来“倒数条件数”一起使用吗? - Chetan Arvind Patil
2个回答

27

马氏距离需要计算协方差矩阵的逆。函数mahalanobis内部使用solve来数值计算逆矩阵。然而,如果逆计算中使用的一些数字非常小,solve会认为它们等于零,从而导致假定该矩阵是奇异矩阵。这就是为什么它指定它们是“在计算上”奇异的原因,因为在不同的容忍度下,该矩阵可能不是奇异的。

解决方法是设置它假定数字等于零的容忍度。幸运的是,mahalanobis允许您将此参数(tol)传递给solve

mahalanobis(dat,center=centroid,cov=cov(dat),tol=1e-20)
# [1] 24.215494 28.394913  6.984101 28.004975 11.095357 14.401967 ...

是否有可能使用“StatMatch”包中的“mahalanobis.dist”实现类似的功能呢? - Andrea Ianni
我不知道。此外,那个问题与此不同,你应该真的提出一个新的问题。 - nograpes
@nograpes - 你建议使用什么tol值来处理所有可能的reciprocal condition number?我也遇到了同样的问题,每次设置新的tol()时,都会出现新的reciprocal warning - Chetan Arvind Patil

6
mahalanobis使用协方差矩阵cov(更准确地说是它的逆)来转换坐标系,然后在新坐标系中计算欧几里得距离。一本标准参考书是Duda&Hart的“模式分类与场景识别”。
看起来你的cov矩阵是奇异的。也许“dat”中有线性相关的列是不必要的?如果协方差矩阵确实是奇异的,将容差设置为零是无济于事的。相反,首先要做的是查找可能是其他列的重新缩放或可能只是2个或多个其他列的总和并将其删除。这些列对于mahalanobis距离是冗余的。
顺便说一下,由于mahalanobis距离实际上是重新缩放和旋转,因此调用缩放函数似乎是多余的-您想要这样做的任何原因吗?

我没有意识到马哈拉诺比斯重新缩放,这就是为什么我之前进行了重新缩放。谢谢你指出来! - Pascal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接