2016-09-24 22 views
1

疎行列がscipy.sparse.randで生成された場合、それは特異である可能性があります。実際、以下のコードではエラー"RuntimeError: superlu failure (singular matrix?) at line 100 in file scipy/sparse/linalg/dsolve/SuperLU/SRC/dsnode_bmod.c"が発生します。Pythonで特異でない疎行列を生成

dim = 20000 
ratio = 0.000133 

A = scipy.sparse.rand(dim,dim,ratio) 
inv_sparse = scipy.sparse.linalg.inv(A) 

非単数スパース行列を生成する方法はありますか?

私が実際にやりたいことは、パフォーマンス(処理時間)をscipy.sparse.linalg.invnp.linalg.invと比較することです。だから、私は単数ではないランダムな疎な行列を生成する必要があります。

+1

コメントはこちらhttp://math.stackexchange.com/questions/449396/getting-non-singular-invertible-matrix-from-a-singular-oneあなたは行列式をチェックして反転...またはそれらを生成して例外を処理する...多分非特異的であることが知られている事前に事例を生成するかもしれない – tenCupMaximum

+1

2つ以上の行または列がすべてゼロであるため特異であるか?密度が十分に低い場合は可能です。 – hpaulj

+2

'sparse.eye(A.shape [0])'を追加してみてください。 – hpaulj

答えて

2

あなたのマトリックスの密度ratio = 0.000133は非常に低いです。つまり、7518のうち約1つの項目がnullでないことを意味します。従って、各項がヌルである確率は約7517/7518である。

各行は20000の独立した用語で構成されています。行がヌルになる確率は(7517/7518)^ 20000 = 6.99%です。従って、行が非ヌルである確率は1-(7517/7518)^ 20000 = 93.0%である。

次に、マトリックスは20000行から成ります。行は独立していると見なすことができます。したがって、行列がヌル行を含まない確率は、(1-(7517/7518)^ 20000)^ 20000 =(93.0%)^ 20000です。この確率は非常に低い。

マトリックスにはヌル行が含まれる可能性が高いため、しばしば特異です。

さらに、浮動小数点数の精度が限られているため、プログラムでは、条件付きでない行列を単数型として扱うことがよくあります。実際、そのような場合、計算された逆は、非常に不正確で無意味である。

最後に、逆関数を比較するには、反転可能であることが知られている行列を使用する方が良いかもしれません...少なくとも、ヌル行の確率が非常に低くなるように密度を増やそうとする可能性があります。

関連する問題