R求解:系统完全是单数

Ale*_*lex 21 optimization r solver

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

Means   <- colMeans(Returns)
Sigma   <- cov(Returns)
invSigma1 <- solve(Sigma)
Run Code Online (Sandbox Code Playgroud)

一切都很完美 - 但是我想在更短的时间内(只有261行)做同样的事情,而solve函数会写出以下错误:

solve(Sigma)
Error in solve.default(Sigma) : 
  Lapack routine dgesv: system is exactly singular 
Run Code Online (Sandbox Code Playgroud)

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

Returns<-matrix(runif(6786,-1,1), nrow=261)
Means   <- colMeans(Returns)
Sigma   <- cov(Returns)
invSigma <- solve(Sigma)
Run Code Online (Sandbox Code Playgroud)

完全没有错误.有人可以解释我哪里可能是问题以及如何对待它.非常感谢,Alex

bor*_*ble 19

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

  • 靠近底部的以下页面帮助我理解了反演和奇点问题的概念:[链接](https://www.mathsisfun.com/algebra/matrix-inverse.html) (2认同)

dro*_*lex 10

我猜你的代码在第二种情况下使用某个奇异矩阵(即不可逆),而求解函数需要将其反转.这与尺寸无关,但事实上你的一些矢量(可能)是共线的.

  • @Alex检查`det(Sigma)`:如果它为零则无法反转. (4认同)
  • @Alex要么你刚刚不幸的数字,或者你已经减少了太多的数据,以确保线性独立性.以下链接可能有用:http://www.m-hikari.com/imf-2010/45-48-2010/kaimakamisIMF45-48-2010.pdf http://arxiv.org/abs/1010.0601 (2认同)

小智 6

Lapack是一个线性代数包,它被R(实际上它在任何地方使用)下面使用solve(),当你作为参数传递的矩阵是单数时,dgesv会发出这种错误.

作为附录:dgesv执行LU分解,当使用矩阵时,强制除以0,因为这是错误定义的,它会抛出此错误.这只发生在矩阵是单数或在你的机器上是单数时(由于近似,你可以将一个非常小的数字视为0)

我建议你检查它的决定因素,你使用的矩阵是否包含大多数整数并且不大.如果它很大,那么看看这个链接.