一般的な行列の最大固有値を計算する最速の方法は何ですか?


27

編集:固有値の大きさが1以上であるかどうかをテストしています。

大きなスパースな非対称行列の最大の絶対固有値を見つける必要があります。

eigen()EISPACKまたはLAPACKのQRアルゴを使用してすべての固有値を検索し、次にabs()絶対値を取得するために使用するRの関数を使用しています。しかし、私はそれをより速くする必要があります。

また、igraphRパッケージのARPACKインターフェイスを使用してみました。しかし、私の行列の1つでエラーが発生しました。

最終的な実装はRからアクセス可能でなければなりません。

おそらく同じ大きさの複数の固有値があるでしょう。

何か提案はありますか?

編集: 精度はする必要があるだけ1e-11です。「典型的な」行列はこれまででした。QR分解を行うことができました。ただし、より大きなものを使用することもできます。現在、Arnoldiアルゴリズムについて読み始めています。Lanczsosに関連していることを理解しています。386×386

EDIT2:「テスト」している複数のマトリックスがあり、変化しない大きなサブマトリックスがあることがわかっている場合。無視/破棄することは可能ですか?


ここに私の答えを参照してください:scicomp.stackexchange.com/a/1679/979を。これは現在の研究トピックであり、現在の方法はランチョスよりも優れています。特異値を計算する問題は、固有値を計算する問題と同等です。
dranxo

2
400x400マトリックス!=大。また、「おそらく同じ大きさの複数の固有値が存在する」場合、最大の意味は何ですか?numpy land:linalg.eig(random.normal(size =(400,400)))は約0.5秒かかります。これは遅すぎますか?
meawoppl

@meawopplはい0.5秒は遅すぎます。これは、この計算を何度も実行する別のアルゴリズムの一部であるためです。
パワー

1
@power gotcah。固有ベクトルの近似値はありますか?つまり、最後の解決策に似ている可能性が高いのでしょうか、それともその構造について経験に基づいた推測を行うことができますか
meawoppl

回答:


14

これは、マトリックスのサイズ、大規模な場合はスパースかどうか、達成したい精度に大きく依存します。

行列が大きすぎて単一の因数分解を行うことができず、高い精度が必要な場合は、おそらくLanczsosアルゴリズムが最速の方法です。非対称の場合、Arnoldiアルゴリズムが必要であり、これは数値的に不安定であるため、実装ではこれに対処する必要があります(やや厄介です)。

問題に当てはまらない場合は、質問に具体的な情報を記入してください。次に、この回答にコメントを追加して、更新します。

編集:[これは質問の古いバージョンで、最大の固有値を無視していました。]マトリックスが小さく、明らかに密度が高いので、イニシャルを使用してB =(IA)^ {-1}でArnoldiの反復を行いますIAの順列三角分解を使用して、Bを安価に乗算します(または明示的な逆を計算しますが、これには分解の3倍のコストがかかります)。Bが負の固有値を持つかどうかをテストします。Aの代わりにBを使用すると、負の固有値がはるかに良好に分離されるため、固有値が存在する場合、迅速に収束する必要があります。

しかし、私はあなたの問題がどこから来たのか興味があります。非対称行列は通常複雑な固有値を持っているため、「最大」は明確に定義されていません。したがって、問題についてより詳しく知る必要があります。これは、問題をより迅速に、および/またはより確実に解決する方法を提案するのに役立つ場合があります。

Edit2:Arnoldiで特定の対象サブセットを取得するのは困難です。絶対最大値の固有値を確実に取得するには、元の行列を使用して部分空間反復を行います。部分空間のサイズは、大きさが1以上に近いと予想される固有値の数と一致するか、それを超えます。小さな行列では、これはQRアルゴリズムよりも遅くなりますが、大きな行列でははるかに速くなります。


最大の固有値が1より大きいかどうかをテストする必要があります。精度は1e-11である必要があります。「典型的な」マトリックスは、これまで386 x 386でした。QR分解を行うことができました。ただし、より大きなものを使用することもできます。現在、Arnoldiアルゴリズムについて読み始めています。Lanczsosに関連していることを理解しています。
パワー

この情報はあなたの質問に属しています-それを編集し、さらに情報を追加してください(固有値が本当ですか?または最大の意味は?)-私の答えの編集を参照してください。
アーノルドノイマイアー

申し訳ありませんが、私は自分自身を明確に説明しませんでした。また、固有値が複雑であることも明確には説明しませんでした。固有値の大きさが1以上かどうかをテストしています。
パワー

1
これはもっと理にかなっていますが、今では使ったレシピは、貧弱な固有値が実際に1 より大きい場合にのみうまく機能します。一方、新しい情報はおそらく、すべての固有値を計算する以外に選択肢がほとんどないことを意味します。-質問を更新して、追加情報を伝えてください!(IA)1
アーノルドノイマイアー

1
私の答えの編集2を参照してください
アーノルドノイマイアー

7

パワー反復ダンが記述されているもの(または電源方式)、例えば、常にレートではあるが収束しなければならない。|λn1/λn|

場合は近くにある、それが遅くなりますが、あなたは使用することができ、外挿をその周りを取得します。複雑に思えるかもしれませんが、擬似コードでの実装については論文で説明しています。、λ nはλn1λn


1
|λ(n−1)| = |λ(n)| ?
パワー

@powerの場合、通常のPower Iterationは収束しません。外挿法が異なる固有値をどの程度区別するかはわかりません。そのための論文を読む必要があります。
ペドロ

2
@power:場合、すべての事柄が再考されます 、その後、べき乗の反復は正しい固有値に収束します。結果として得られる固有ベクトルは、とにかく興味がないようですが、および対応する固有ベクトルの線形結合になります。λ N λ N - 1|λn1|=|λn|λnλn1
ペドロ

これをサポートする学術論文または本への参照はありますか?また、\ lambda_ {n}が複雑な場合はどうなりますか?
電源

5
最大モジュラスの異なる固有値がいくつかある場合、べき乗の反復は例外的な状況下でのみ収束します。一般に、やや予測不可能な方法で振動します。
アーノルドノイマイアー

5

最近、これに関するいくつかの良い研究がありました。新しいアプローチでは、最大の固有値で優れた精度を得るために、マトリックスの読み取りを数回行うだけで済む「ランダム化アルゴリズム」を使用します。これは、高精度を達成するために複数の行列ベクトル乗算を必要とする累乗反復とは対照的です。

新しい研究の詳細については、こちらをご覧ください。

http://math.berkeley.edu/~strain/273.F10/martinsson.tygert.rokhlin.randomized.decomposition.pdf

http://arxiv.org/abs/0909.4061

このコードはあなたのためにそれを行います:

http://cims.nyu.edu/~tygert/software.html

https://bitbucket.org/rcompton/pca_hgdp/raw/be45a1d9a7077b60219f7017af0130c7f43d7b52/pca.m

http://code.google.com/p/redsvd/

https://cwiki.apache.org/MAHOUT/stochastic-singular-value-decomposition.html

選択した言語がそこにない場合は、独自のランダム化されたSVDを簡単に展開できます。行列ベクトルの乗算に続いて市販のSVDを呼び出すだけで済みます。


4

ここでは、最大固有値を計算するJacobi-Davidsonアルゴリズムのアルゴリズムの紹介があります。

この論文では、数学的側面について検討します。JDでは、一般的な(実数または複素数)行列を使用でき、固有値の範囲を計算するために使用できます。

ここには、JDQRおよびJDQZ(RからリンクできるCインターフェイスを含む)のさまざまなライブラリ実装があります。


私は、Jacobi-Davidson法が実際の一般的な行列に対して機能すると明示的に述べている文献を見つけることができませんでした。
パワー

すべての記事で明示的に制限が示されていない限り、収束の議論は重要ではない制限に依存しています。
デスブレス

JDの別の説明を次に示します。考慮される行列は完全に一般的です。特別な構造は利用されず、エルミート行列に固有の結果が比較および対比されます。たとえば、一般的な行列の収束は2次ですが、エルミート行列の場合は3次です。
デスブレス

これをありがとう。一般的な行列のCコードが見つからないため、独自のコードを作成する必要があります。アルゴリズムへのリンクは、エルメシアン行列専用です。
パワー

1
また、文献では、標準のQR実装が実際の一般的な行列に収束することを示す結果を見つけることはありません-これは未解決の問題であり、実際、LAPACKのQRコードに反例が見つかりました。
フェデリコポロニ14年

2

元の投稿で次のように言います:

「igraph RパッケージでARPACKインターフェイスを使用しようとしましたが、マトリックスの1つでエラーが発生しました。」

エラーについてもっと知りたいです。このマトリックスをどこかで一般公開することができれば、ARPACKを試してみたいと思います。

上記で読んだことに基づいて、ARPACKはスパース行列の最大(または最大数個)の固有値を抽出する非常に良い仕事をすると期待しています。より具体的には、この場合にArnoldiのメソッドがうまく機能することを期待します。もちろん、それがARPACKのベースとなっています。

関心領域に狭い間隔の固有値がある場合のべき乗法の収束が遅いことは上記で言及されました。Arnoldiは、ベキ乗法の代わりに複数のベクトルを反復処理することでこれを改善します。


当時から自分の作品を見つけることができるかどうかを確認します。私は1年前にこれに取り組みました。
パワー

0

これは最速の方法ではありませんが、合理的に迅速な方法は、(最初​​はランダムな)ベクトルを行列で繰り返しヒットし、数ステップごとに正規化することです。最終的には最大の固有ベクトルに収束し、単一ステップのノルムのゲインは関連する固有値になります。

これは、最大の固有値が他の固有値よりも大幅に大きい場合に最適に機能します。別の固有値の大きさが最大値に近い場合、収束するまでに時間がかかり、収束したかどうかを判断するの困難です。


1
しかし、ダンに感謝します。私のマトリックスでは、他の固有値のいくつかは、最大のものと同じ(同じではないにしても)大きさを持ちます。あなたの方法は、Power IterationとRayleigh Quotient Iterationに似ていますか?Batterson and Smillie(1990)は、一部の非対称行列では、レイリー商の反復が収束しないことを記述しています。バターソン、S.、Smillie、J(1990)「非対称行列のレイリー商の反復」、計算の数学、vol 55、num 191、P 169-178
power

他の固有値が最大値と同じ大きさである場合...それらの値も「最大値」ではありませんか?
エリー

@EMS:それらは「最大の固有値」のままですが、複数の最大値が存在する場合でも収束は停止します。
ダン

どの固有値に収束させたいのかと思っています。レイリー商/パワー法のようなものは、明確な最大固有値がある場合を意味します。あなたの質問は最大の固有値を見つけることを求めますが、それはあなたの問題に対して実際にはうまく定義されていないように聞こえます。私は投稿のタイトルに惑わされています。
エリー

-1

RパッケージrARPACKは私のために機能します。また、スパース線形代数の標準パッケージであるARPACK(いくつかの固有値と固有ベクトルの計算を意味する)の単なるインターフェイスであるため、非常に高速に見えます。


SciCompへようこそ!質問が述べているように、ARPACKはOPに対して機能しないため、この回答はあまり役に立ちません。
クリスチャンクラソン14年

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