我正在解决简单的优化问题。该数据集有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)
根本没有发生错误。有人可以解释我哪里可能是问题以及如何对待它。 非常感谢你, 亚历
答案 0 :(得分:18)
将solve
与单个参数一起使用是反转矩阵的请求。错误消息告诉您矩阵是单数的,不能反转。
答案 1 :(得分:10)
我猜你的代码在第二种情况下使用某个奇异矩阵(即不可逆),而求解函数需要将其反转。这与大小无关,但事实上你的一些载体(可能)是共线的。
答案 2 :(得分:6)
Lapack是一个线性代数包,它被solve()
下面的R(实际上它在任何地方使用)使用,当你作为参数传递的矩阵是单数时,dgesv会发出这种错误。
作为附录:dgesv执行LU分解,当使用矩阵时,强制除以0,因为这是错误定义的,它会抛出此错误。这只发生在矩阵是单数或在你的机器上它是单数时(由于近似,你可以将一个非常小的数字视为0)
我建议你检查它的决定因素,你使用的矩阵是否包含大部分整数且不大。如果它很大,请查看this link。