R中的马氏距离,误差:系统在计算上是奇异的

R中的马氏距离,误差:系统在计算上是奇异的,r,distance,similarity,mahalanobis,R,Distance,Similarity,Mahalanobis,我想计算从一组点到这些点的质心的多元距离。马哈拉诺比距离似乎适合这种情况。但是,我得到一个错误(见下文) 有人能告诉我为什么我会犯这个错误吗?有没有办法解决这个问题 如果下载和,则可以运行以下代码 require(maptools) occ <- readShapeSpatial('occurrences.shp') load('envDat.Rdata') #standardize the data to scale the variables dat <- as.matrix(

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

有人能告诉我为什么我会犯这个错误吗?有没有办法解决这个问题

如果下载和,则可以运行以下代码

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
require(映射工具)

occ马氏体使用协方差矩阵cov(更精确地说是它的逆矩阵)变换坐标系,然后计算新坐标系中的欧几里德距离。标准参考是Duda&Hart的“模式分类和场景识别”

看起来你的cov矩阵是单数的。也许“dat”中有一些线性相关列是不必要的?如果出现以下情况,将公差设置为零将无济于事: 协方差矩阵是真正奇异的。相反,要做的第一件事是查找可能是某个其他列的重缩放的列,或者可能只是2个或更多其他列的总和,然后删除它们。这样的柱对于马氏距离来说是多余的


顺便说一句,由于马氏距离实际上是一种重缩放和旋转,调用缩放函数看起来是多余的-有什么原因需要这样做吗?

马氏距离需要计算协方差矩阵的逆。函数
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 ...

我没有意识到马哈拉诺比斯会重新缩放,这就是为什么我事先会重新缩放。谢谢你指出这一点!是否也有可能对“mahalanobis.dist”(包“StatMatch”)做类似的事情?我不知道。同样,这个问题也非常不同,你真的应该做一个新的。@nograps-为了处理所有可能的
互惠条件数
,你会建议什么
tol
值?。我面临着同样的问题,每次我设置一个新的
tol()
,我都会得到新的
交互警告
@Pascal-设置
tol=1e-20
是否适用于所有数据集?对我来说,输入数据集是随机的,它不断抛出新的
倒数条件数
。您是否知道任何可能的解决方案,以便在将来的任何可能的条件编号下实现此功能?