Pythonで非常に大きくて疎な隣接行列のすべての固有値を計算する最速の方法は何ですか?


12

scipy.sparse.linalg.eigshを使用するよりも非常に大きくて疎な隣接行列のすべての固有値と固有ベクトルを計算するより速い方法があるかどうかを把握しようとしていますマトリックスの対称属性。隣接行列もバイナリであるため、より高速な方法があると思います。

ランダムな1000x1000スパース隣接行列を作成し、x230 ubuntu 13.04ラップトップでいくつかの方法を比較しました。

  • scipy.sparse.linalg.eigs:0.65秒
  • scipy.sparse.linalg.eigsh:0.44秒
  • scipy.linalg.eig:6.09秒
  • scipy.linalg.eigh:1.60秒

スパースeigとeigshで、希望する固有値と固有ベクトルの数であるkを行列のランクに設定します。

問題は、より大きな行列から始まります-9000x9000行列では、scipy.sparse.linalg.eigshに45分かかりました!


1
NB。scipy.sparse.linalg.eigshはARPACK
pvです。

4
フォローアップするには、行列が大きいほど、内部固有値(つまり、最大または最小の固有値)を正確に計算する可能性が低くなります。分解するマトリックスからどのような情報が必要ですか?
ジェフオックスベリー

1
この質問はここにクロスポストされています。クロスポストバージョンを閉じることをお勧めします。
アロンアフマディア

2
A ^ kを計算したい。再考した後、このような行列を使用すると、固有分解を使用するよりも直接乗算(A A A ...)を計算する方がはるかに高速です。もちろん、kに依存します。
ノームPeled

2
はい、直接行います。固有分解の結果はスパースではないため、ストレージの問題が発生します(kが十分に大きい場合は、A ^ kでもありません)。関連stackoverflow.com/a/9495457/424631
dranxo

回答:


6

FILTLANは、スパース対称行列の内部固有値を計算するためのC ++ライブラリです。これだけに専念するパッケージ全体があるという事実は、それが非常に難しい問題であることを教えてくれるでしょう。対称行列の最大または最小の固有値を見つけるには、シフト/反転してLanczosアルゴリズムを使用しますが、スペクトルの中央は別の問題です。これを使用する場合は、SWIGを使用してPythonからC ++プログラムを呼び出すことができます。

最終目標が行列の大きなべき乗を計算することである場合、最大の固有値に対応する固有ベクトルを計算できます。これは、大きなべき乗をとるほど小さなモードはそれほど重要ではないという知識の内容です。

そうは言っても、力を直接計算する方が良いかもしれません。より高いパワーを計算するにつれて、それらはますます少なくなり、より多くのメモリを消費します。高さに応じて、最終的に密行列に切り替えることができます。k

これらが既に明らかな場合はご容赦ください:numpyにfloatではなく整数で構成されていることを伝えることで、たとえば

a = np.zeros(100,dtype=np.uint)

これにより(うまくいけば)スペースを節約できます。行列の乗算をブロックすることにより、時間を節約できます(メモリは節約できません)。を計算するとします。を計算してから、これを乗してを取得し、これを2乗してを取得します。そうすれば、乗算ではなく、行列乗算を実行できます。A16A2A4A8ログ2kk

また、速度が懸念され、NVIDIA GPUを使用している場合、PythonからCUSPやcuSPARSEなどの並列スパース線形代数ライブラリの呼び出しを調べることもできます。


1

Daniel Shaperoの答えについてコメントしたいのですが、SEの評判が十分ではありません。

受け入れられた答えは私をとても混乱させます。シフト反転モードは、内部固有値を計算するために簡単に使用できると思います。参照:https : //docs.scipy.org/doc/scipy/reference/tutorial/arpack.html

元の質問に答えるには、大規模なスパース行列のすべての固有値が必要になることはめったにありません。通常、極値または内部値のクラスターが必要です。その場合、エルミート行列の方eigshが高速です。非エルミート語の場合は、を使用する必要がありますeigs。そして、それらはnumpy eigeigh

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.