24

Scipy と Numpy には、特定の正方行列の固有ベクトルを見つけるための 3 つの異なる関数があります。これらは次のとおりです。

  1. numpy.linalg.eig(a)
  2. scipy.linalg.eig(a)、 と
  3. scipy.sparse.linalg.eig(A, k)

a最後の 2 つを省略したすべてのオプション引数がデフォルトのままであり、 /が実数値であるという状況に特に焦点を当ててA、ドキュメントから曖昧なこれら 3 つの違いに興味があります-特に:

  • (3) にすべての固有ベクトルを見つけることができないという注記があるのはなぜですか?
  • なぜ他の 2 つはすべての解を計算しなければならないkのですか? なぜ引数を取らないのですか?
  • (1) 固有値が特定の順序で返されないというメモがあります。(3) には、順序を制御するオプションの引数があります。(2)はこれについて何らかの保証をしますか?
  • A(3)はそれがまばらだと仮定していますか?(数学的に言えば、scipy sparse 行列として表されるのではなく)この仮定が成り立たない場合、非効率になるか、間違った結果をもたらすことさえありますか?
  • これらの中から選択する際に考慮すべき他の要素はありますか?
4

2 に答える 2

12

3番目の特別な動作は、スパース行列で非常にうまく機能するランチョスアルゴリズムと関係があります。のドキュメントにscipy.sparse.linalg.eigは、ARPACKのラッパーが使用されていると記載されています。このラッパーは、「暗黙的に再起動されたアーノルディ法(IRAM)、または対称行列の場合は、対応するランチョスアルゴリズムの変形」を使用します。(1)

現在、ランチョスアルゴリズムには、大きな固有値に対してより適切に機能するという特性があります(実際、最大固有値を使用します)。

実際には、この単純なアルゴリズムは、非常に多くの固有ベクトルを計算する場合にはうまく機能しません。丸め誤差があると、より重要な固有ベクトルのわずかな成分が計算に戻され、計算の精度が低下する傾向があるためです。(2)

したがって、ランチョスアルゴリズムは単なる近似値ですが、他の2つの方法では、アルゴリズムを使用して正確な固有値を見つけていると思います。これらはすべて、使用されているアルゴリズムにも依存しているようです。

于 2012-06-18T13:43:20.037 に答える
8

これは、質問の非ルーチン固有の部分に対する回答です。

原則として、NumPy と SciPy のlinalg()ルーチンは同じでなければなりません。どちらも内部で LAPACK および BLAS ルーチンを使用します。の実装でscipy.sparseは、スパース行列 (つまり、エントリがほとんどない行列) に適した特定のアルゴリズムを使用します。マトリックスが密集している場合は、これを使用しないでください。

技術的にはeig()、SciPy/NumPy の は、Lapack/BLAS の異なる実装で両方のパッケージをビルドできるという事実により、異なる実装になることに注意してください。ここでの一般的な選択肢は、netlib、 ATLAS、Intel MKL、またはOpenBLASから入手できる標準の Lapack/BLAS です。

于 2012-06-18T13:58:33.553 に答える