25

単純な最適化問題を解いています。データセットには26列と3000行以上があります。ソースコードは次のようになります

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

そして、すべてが完璧に機能しますが、同じことをより短い期間(261行のみ)で実行したいので、solve関数は次のエラーを書き込みます。

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

あなたのコードは、2 番目のケースのどこかで特異行列 (つまり、可逆でない) を使用していると思います。ソルブ関数はそれを逆にする必要があります。これはサイズとは関係ありませんが、ベクトルの一部が(おそらく)同一線上にあるという事実とは関係ありません。

于 2011-07-04T13:29:15.620 に答える
6

Lapack は、R によって使用される線形代数パッケージです (実際にはどこでも使用されています) solve()。パラメーターとして渡した行列が特異な場合、dgesv はこの種のエラーを吐き出します。

補遺として: dgesv は LU 分解を実行します。行列を使用すると、0 による除算が強制されます。これは定義が正しくないため、このエラーがスローされます。これは、行列が特異な場合、またはマシン上で特異な場合にのみ発生します (近似により、非常に小さな数を 0 と見なすことができます)。

使用している行列にほとんど整数が含まれていて大きくない場合は、行列式を確認することをお勧めします。大きい場合は、このリンクを見てください。

于 2014-08-06T10:50:12.167 に答える