系统在计算上是奇异的:R 中的倒数条件数

System is computationally singular: reciprocal condition number in R

x <- matrix(rnorm(80, mean = 0, sd = 0.1), 8, 8)
c <- cov(x)
solve(c)

我收到错误消息:

Error in solve.default(c) : system is computationally singular: reciprocal condition number = 6.57889e-18

我一直在试图找出问题背后的原因,Stack Overflow 上的其他线程建议问题可能是由于奇异矩阵、高度相关的变量、线性组合等引起的。但是,我认为rnorm 会避免上述问题。

对于我正在使用 det() 的另一个矩阵给出 8.313969e-95,但它仍然是可逆的 solve()

两个基本的线性代数性质:

  1. 奇异(方)矩阵是不可逆的(方)矩阵。
  2. 如果行列式为零,则矩阵不可逆。

如果你勾选

set.seed(2018);
x <- matrix(rnorm(80, mean = 0, sd = 0.1), 8, 8)
c <- cov(x)
det(c)
#[1] -3.109158e-38

所以确实,det(c) 是零(在机器精度内);因此 c 是不可逆的,这正是 solve(c) 想要做的。

PS 1:看一下 ?solve 可以看到 solve(a) 将 return 与 a 相反。
PS 2:数学上存在nice post对协方差矩阵的行列式的解释。看一看以了解为什么你看到了你所看到的。