2012-06-18 51 views
15

scipyのダウンロードとnumpyの、それらの間に与えられた正方行列のための固有ベクトルを見つけるための3つの異なる機能を持って、これらは次のとおりです。Pythonの固有ベクトル:numpy.linalg、scipy.linalgの違いとscipy.sparse.linalg

  1. numpy.linalg.eig(a)
  2. scipy.linalg.eig(a)、およびすべてのオプションの引数I'v状況に特に焦点を当て
  3. scipy.sparse.linalg.eig(A, k)

eは最後の二つはデフォルトのままであり、a/Aが実数値であることをやめ、私は、ドキュメントからの曖昧なこれらの3の違いについて興味があります - 特に:

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

答えて

12

第3の特別な動作は、希薄行列で非常にうまく動作するLanczos algorithmと関係があります。 scipy.sparse.linalg.eigのドキュメントでは、ARPACKのラッパーを使用し、「暗黙的に再起動されたArnoldiメソッド(IRAM)」または対称行列の場合は、Lanczosアルゴリズムの対応する変形を使用しています。 (1)

今、ランチョス法は、(実際には、それが最大の固有値を使用しています)、それは大きな固有値のために良い作品性質を持っています。実際には

、この単純なアルゴリズムは、コンピューティング のために非常にうまく機能しません。何らかの丸め誤差 が、より重要な固有ベクトルのわずかな成分を計算に戻す傾向があり、計算の精度を低下させるので、非常に多くの固有ベクトルを使用します。 (2)

ので、ランチョスアルゴリズムは唯一の近似値であるのに対し、私は他の2つの方法が正確な固有値を見つけるためにALGOSを使用して推測する - と、一見、それらのすべて、おそらくあまりにも、使用されるアルゴリズムに依存します。

6

がここに答えあなたの質問の非日常固有の部分です:原則として

、numpyのscipyのダウンロードとlinalg()ルーチンは、同じである必要があります。どちらもLAPACKルーチンとBLASルーチンを内部的に使用します。 `iscipy.sparse`の実装は、スパース行列(すなわち、ほとんどゼロのエントリを持つ行列)に対してうまく動作する特定のアルゴリズムを使用します。行列が密である場合は、これを使用しないでください。

SciPy/NumPyのeig()は、どちらのパッケージもLapack/BLASのさまざまな実装で構築できるため、実装が異なることに注意してください。一般的な選択肢は、netlibから入手可能な標準のLapack/BLAS、ATLAS、インテルMKLまたはOpenBLASです。

関連する問題