如何找到使矩阵奇异的因素

机器算法验证 r 矩阵 逆矩阵
2022-04-05 03:42:39

我有一个 300 多列的 data.frame,无论我如何分解它,我每次都会收到这个错误:

Error in solve.default(cv) : 
Lapack routine dgesv: system is exactly singular: U[107,107] = 0

我尝试打破数据框并在其上运行vlf(),然后删除结果为无穷大的因素,但我已经多次这样做(每次都有一个较小的数据集)并且没有运气。有没有更好的方法来判断哪些因素导致了问题?

1个回答

您可以使用特征分解来查找消失的列的线性组合,然后删除参与这些线性组合的足够多的列。

这是一个具有消失列线性组合的矩阵:

> M <- matrix(c(0, 0, 0, 1, 0, 1, 0, 1, 1, 1, -1, 0), nrow=4,  byrow=TRUE)
> M
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    1    0    1
[3,]    0    1    1
[4,]    1   -1    0

如果列的线性组合消失,那么如果我切断矩阵的底部使其成为正方形,情况也是如此:

> sM <- M[1:3, ]
> sM
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    1    0    1
[3,]    0    1    1

现在计算特征值和特征向量:

> eigen(sM)
$values
[1]  1.618034 -0.618034  0.000000

$vectors
          [,1]       [,2]       [,3]
[1,] 0.0000000  0.0000000  0.5773503
[2,] 0.5257311  0.8506508  0.5773503
[3,] 0.8506508 -0.5257311 -0.5773503

所以有一个零特征值,这是我们预期的,它对应于列线性组合:

.57C1+.57C2.57C3=0

因此,删除其中一列将产生一个完整的列秩矩阵。