250x250 后 R 错误中的大矩阵求逆
Large matrix inversion in R error after 250x250
尝试对大于 250x250 的矩阵执行矩阵求逆时收到以下错误。如果矩阵的大小超过此大小,我只会收到错误。
Error in solve.default(S) :
system is computationally singular: reciprocal condition number = 2.10729e-20
我已经尝试过其他比这更大的矩阵进行反转。我已经检查了矩阵中的多重共线性并且有 none。什么可能导致此错误?
编辑:更改公差确实可以防止错误。但是为什么只有当矩阵大于 250x250 时才会抛出错误?
计算大小大于250的矩阵没有问题:
set.seed(12345)
N = 300
m <- matrix(rnorm(N*N), nrow = N)
str(m)
# num [1:300, 1:300] 0.586 0.709 -0.109 -0.453 0.606 ...
m.inv <- solve(m)
str(m.inv)
# num [1:300, 1:300] 0.0274 -0.0164 0.0384 -0.0936 -0.1086 ...
但是如果矩阵的行列式为0(或者几乎为0),那么显然求逆会出错:
p <- matrix(7, nrow = N, ncol=N)
str(p)
# num [1:300, 1:300] 7 7 7 7 7 7 7 7 7 7 ...
p.inv <- solve(p)
#Error in solve.default(p) :
# Lapack routine dgesv: system is exactly singular: U[2,2] = 0
在您的情况下,您似乎在使用非常小的值进行操作。尝试指定更小的公差:
solve(..., tol = 1e-17)
# You can check the current tollerance on your system:
.Machine$double.eps
#[1] 2.220446e-16
一个更好的方法可能是先计算行列式,然后处理它非常小的情况:
det(p)
#[1] 0
为了回答您的问题为什么只有当您的矩阵大于 250 个元素时才会出现错误,我建议您计算 250x250 矩阵的行列式,然后计算更大矩阵的行列式并比较值。第二个值可能小于公差,而第一个不是。
尝试对大于 250x250 的矩阵执行矩阵求逆时收到以下错误。如果矩阵的大小超过此大小,我只会收到错误。
Error in solve.default(S) :
system is computationally singular: reciprocal condition number = 2.10729e-20
我已经尝试过其他比这更大的矩阵进行反转。我已经检查了矩阵中的多重共线性并且有 none。什么可能导致此错误?
编辑:更改公差确实可以防止错误。但是为什么只有当矩阵大于 250x250 时才会抛出错误?
计算大小大于250的矩阵没有问题:
set.seed(12345)
N = 300
m <- matrix(rnorm(N*N), nrow = N)
str(m)
# num [1:300, 1:300] 0.586 0.709 -0.109 -0.453 0.606 ...
m.inv <- solve(m)
str(m.inv)
# num [1:300, 1:300] 0.0274 -0.0164 0.0384 -0.0936 -0.1086 ...
但是如果矩阵的行列式为0(或者几乎为0),那么显然求逆会出错:
p <- matrix(7, nrow = N, ncol=N)
str(p)
# num [1:300, 1:300] 7 7 7 7 7 7 7 7 7 7 ...
p.inv <- solve(p)
#Error in solve.default(p) :
# Lapack routine dgesv: system is exactly singular: U[2,2] = 0
在您的情况下,您似乎在使用非常小的值进行操作。尝试指定更小的公差:
solve(..., tol = 1e-17)
# You can check the current tollerance on your system:
.Machine$double.eps
#[1] 2.220446e-16
一个更好的方法可能是先计算行列式,然后处理它非常小的情况:
det(p)
#[1] 0
为了回答您的问题为什么只有当您的矩阵大于 250 个元素时才会出现错误,我建议您计算 250x250 矩阵的行列式,然后计算更大矩阵的行列式并比较值。第二个值可能小于公差,而第一个不是。