【问题标题】:Mahalonobis distance in R, error: system is computationally singularR中的马氏距离,错误:系统在计算上是奇异的
【发布时间】:2014-03-02 22:21:57
【问题描述】:

我想计算从一组点到这些点的质心的多元距离。 Mahalanobis 距离似乎适合于此。但是,我收到一个错误(见下文)。

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

如果你下载了coordinate dataassociated environmental data,你可以运行下面的代码。

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 是否适用于所有数据集?对我来说,输入数据集是随机的,并且不断抛出新的reciprocal condition number。你知道任何可能的解决方案来让它与任何可能的未来reciprocal condition number一起工作吗?

标签: r distance similarity mahalanobis


【解决方案1】:

马氏距离要求您计算协方差矩阵的逆矩阵。函数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”)做类似的事情?
  • 我不知道。此外,这个问题已经足够不同了,你真的应该提出一个新问题。
  • @nograpes - 为了照顾所有可能的reciprocal condition number,您会建议什么tol 值?我面临同样的问题,每次我设置一个新的tol(),我都会得到新的reciprocal warning
【解决方案2】:

mahalanobis 使用协方差矩阵 cov(更准确地说是它的逆矩阵)来变换坐标系,然后在新坐标中计算欧几里得距离。标准参考是 Duda & Hart “Pattern Classification and Scene Recognition”

看起来你的 cov 矩阵是奇异的。也许“dat”中有不必要的线性相关列?将容差设置为零将无济于事,如果 协方差矩阵是真正奇异的。相反,首先要做的是查找可能是其他列的重新缩放的列,或者可能只是 2 个或更多其他列的总和并将它们删除。这样的列对于马氏距离是多余的。

顺便说一句,由于马哈拉诺比斯距离实际上是重新缩放和旋转,调用缩放函数看起来是多余的 - 你为什么要这样做?

【讨论】:

  • 我没有意识到马哈拉诺比斯会重新缩放,这就是我事先重新缩放的原因。感谢您指出这一点!
猜你喜欢
  • 1970-01-01
  • 2018-06-20
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2019-08-01
  • 1970-01-01
  • 2015-06-25
相关资源
最近更新 更多