25

我正在解决简单的优化问题。该数据集有 26 列和 3000 多行。源代码看起来像

Means   <- colMeans(Returns)
Sigma   <- cov(Returns)
invSigma1 <- solve(Sigma)

一切都很完美 - 但我想在更短的时间内做同样的事情(只有 261 行),并且求解函数写入以下错误:

solve(Sigma)
Error in solve.default(Sigma) : 
  Lapack routine dgesv: system is exactly singular 

这很奇怪,因为当我对一些随机数做同样的事情时:

Returns<-matrix(runif(6786,-1,1), nrow=261)
Means   <- colMeans(Returns)
Sigma   <- cov(Returns)
invSigma <- solve(Sigma)

根本没有发生错误。有人可以解释一下问题出在哪里以及如何治疗。非常感谢,亚历克斯

4

4 回答 4

21

使用solve单个参数是一个反转矩阵的请求。错误消息告诉您,您的矩阵是单数的,不能倒置。

于 2011-07-04T13:29:51.610 回答
11

我猜你的代码在第二种情况下使用了奇异矩阵(即不可逆),并且求解函数需要将其反转。这与大小无关,而是与您的某些向量(可能)共线的事实有关。

于 2011-07-04T13:29:15.620 回答
6

Lapack 是 R 使用的线性代数包(实际上它无处不在)solve(),当您作为参数传递的矩阵是奇异的时,dgesv 会吐出这种错误。

作为附录: dgesv 执行 LU 分解,当使用您的矩阵时,它会强制除以 0,因为这是不明确的,它会引发此错误。这只发生在矩阵是奇异的或者它在你的机器上是奇异的时候(由于近似,你可以有一个非常小的数字被认为是 0)

如果您使用的矩阵主要包含整数并且不大,我建议您检查其行列式。如果它很大,那么看看这个链接

于 2014-08-06T10:50:12.167 回答
0

我能理解你的问题。问题是你的矩阵是垂直的。您可以看到您的第一个数字和矩阵的最后一个数字是相同的。

于 2021-10-27T18:19:33.933 回答