R中的Mahalonobis距离,误差:系统在计算上是单数的

Pas*_*cal 11 r distance similarity mahalanobis

我想计算从一组点到这些点的质心的多元距离.马哈拉诺比斯距离似乎适合这一点.但是,我收到一个错误(见下文).

任何人都可以告诉我为什么我会收到此错误,如果有办法解决它?

如果下载坐标数据关联的环境数据,则可以运行以下代码.

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
Run Code Online (Sandbox Code Playgroud)

nog*_*pes 21

马哈拉诺比斯距离要求您计算协方差矩阵的逆.函数mahalanobis内部使用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 ...
Run Code Online (Sandbox Code Playgroud)


Joh*_*ark 6

mahalanobis使用协方差矩阵,cov(更确切地说是它的倒数)来变换坐标系,然后在新坐标中计算欧几里德距离.标准参考是Duda&Hart"模式分类和场景识别"

看起来你的cov矩阵是单数的.也许"dat"中存在线性相关的列是不必要的?如果协方差矩阵是真正的单数,则将容差设置为零将无济于事.相反,要做的第一件事是查找可能是其他列的重新缩放的列,或者可能只是2个或更多其他列的总和并删除它们.这些列对于马哈拉诺比斯距离是多余的.

顺便说一下,由于马哈拉诺比斯距离实际上是重新缩放和旋转,调用缩放功能看起来多余 - 你想要的任何理由?