奇异数据上的马氏距离

机器算法验证 r 矩阵 距离
2022-03-27 05:45:20

我有一个无法解决的问题,尽管我尝试过并且在R论坛上得到了一些帮助。

我正在尝试计算Mahalanobisa 上的距离data.frame,其中我有数百个组和数百个变量。无论我做什么,我都会得到system is computationally singular: reciprocal condition number错误。

很明显它是单数的,但是有什么办法可以摆脱它并运行Mahalanobis我应该忘记用另一种方法解决这个问题吗?如果是,那还有什么用?

我已将数据文件上传到我的FTP:它是一个制表符分隔的 txt 文件,没有标题。

我正在使用R StatMatch Mahalanobis(也尝试过 stats Mahalanobis)功能。我有这个项目的截止日期(不是家庭作业!),我总是可以使用这个功能,所以我想我可以让计算保持简短,但现在我迷路了。

从堆栈溢出迁移

3个回答

为什么你认为矩阵不可能是奇异的?

一个 QR 分解表明这个 380 x 372 矩阵的秩只有 300。换句话说,它是高度奇异的:

url <- "http://mkk.szie.hu/dep/talt/lv/CentInpDuplNoHeader.txt"
df <- read.table(file = url, header = FALSE)
m <- as.matrix(df)

dim(m)
# [1] 380 372
qr(m)$rank
# [1] 300

检查矩阵的奇异值是查看相同内容的另一种方法:

head(table(svd(df)$d))

# 5.76661502353373e-13 2.57650568058543e-12  0.00929562094651422 
#                   71                    1                    1 
#   0.0277990885015625   0.0398152894712022   0.0469713341003743 
#                    1                    1                    1 

奇异矩阵意味着一些向量是其他向量的线性组合。因此,一些向量不会为马氏距离计算添加任何有用的信息。广义逆或伪逆有效地计算了一个“类似逆”的矩阵,它忽略了一些这种非信息性信息。这优于其他有效添加少量不正确信息的方法(即向所有数据添加一个小常数)。伪逆协方差矩阵已成功用于马氏距离,请参见http://www.sciencedirect.com/science/article/pii/0146664X79900522

我建议的解决方案是惩罚马氏距离。有关详细信息,您可以查看此博客文章http://stefansavev.com/blog/better-euclidean-distance-with-the-svd-penalized-mahalanobis-distance/您还可以查看 Hastie 等人的“统计学习要素”。特别是关于岭回归的部分(它是相关的)并在索引 Mahalanobis Distance 中查找