25

Pythonで疎な対称行列と実行列の行列式を見つけるための最速の方法を見つけようとしています。scipysparseモジュールを使用していますが、決定関数がないことに本当に驚きました。scipy.sparse.linalg.spluLU 因数分解を使用して行列式を計算できることは承知していますが、戻り値がオブジェクトであり、密な L および U 行列をインスタンス化する価値がないため、それを行う簡単な方法がわかりませsp.linalg.det(A.todense())A。 scipy スパース行列。

また、他の人が scipy 内での効率的な行列式計算の問題に直面していない理由にも少し驚いています。splu行列式を計算するためにどのように使用しますか?

pySparseとを調べましたscikits.sparse.chlmod。後者は現在私にとって実用的ではありません-パッケージのインストールが必要であり、すべての問題に入る前にコードがどれほど速いかわかりません. 解決策はありますか?前もって感謝します。

4

4 に答える 4

7

回答の一部として提供したいくつかの参考文献をここに示します。あなたが解決しようとしている実際の問題に対処していると思います:

将軍の手記からの引用:

尤度式の対数行列式項を計算する通常の手法は、行列のコレスキー分解、つまり Σ=LLT (L は下三角コレスキー係数) に依存し、次に係数の対角要素を使用して log(det (Σ))=2∑ni=1log(Lii). ただし、共分散行列が通常そうであるように、スパース行列の場合、コレスキー因子はしばしばフィルイン現象に悩まされます - それら自体はそれほどスパースではないことが判明します。したがって、次元が大きい場合、因子のこれらの無関係な非対角係数をすべて格納するために大量のメモリが必要になるため、この手法は実行不可能になります。フィルインを減らすために、事前に行と列を並べ替える順序付け手法が開発されていますが、たとえば、近似最小次数 (AMD) の並べ替え、

最近の研究では、複雑な解析、数値線形代数、貪欲なグラフ彩色などの多くの手法を使用して、任意の精度まで対数行列式を近似できることが示されています [Aune et. ら、2012]。主な秘訣は、log(det(Σ)) を trace(log(Σ)) として記述できるという観測にあります。ここで、log(Σ) は行列対数です。

于 2014-02-19T06:11:32.040 に答える
6

この問題を解決する「標準的な」方法は、コレスキー分解を使用することですが、新しくコンパイルされたコードを使用することに慣れていない場合は、うまくいきません。最高のスパース コレスキー実装は Tim Davis の CHOLMOD です。これは LGPL の下でライセンスされているため、適切な scipy では利用できません (scipy は BSD です)。

于 2013-10-27T10:23:00.567 に答える