密で不良な条件付き行列の対角化


10

いくつかの密で悪条件の行列を対角化しようとしています。マシン精度では、結果は不正確です(負の固有値を返す、固有ベクトルには期待される対称性がありません)。MathematicaのEigensystem []関数に切り替えて、任意の精度を利用しましたが、計算が非常に遅くなっています。私はいくつもの解決策を受け入れます。悪条件の問題に適したパッケージ/アルゴリズムはありますか?私はプレコンディショニングの専門家ではないので、これがどれだけ役立つかわかりません。それ以外の場合は、並列化された任意精度の固有値ソルバーしか考えられませんが、Mathematica、MATLAB、およびC ++以外には何も知りません。

問題の背景を説明するために、行列は大きくはありますが、巨大ではありません(最大で4096x4096〜32768x32768)。それらは実数で対称であり、固有値は0から1(排他的)の範囲にあり、多くの固有値は0に非常に近く、1に近いものはありません。行列は本質的に畳み込み演算子です。すべての行列を対角化する必要はありませんが、大きくできるほど良いです。多くのプロセッサと分散コンピューティング機能を備えたコンピューティングクラスタにアクセスできます。

ありがとうございました


2
実際の対称行列を対角化するためにどのルーチンを使用していますか?そして、どのような意味で固有値分解は不正確ですか?
Jack Poulson

アーノルドの答えに関連するアイデアは次のとおりです。SPD行列のコレスキー分解を実行し、精度を維持するためにdqdタイプのアルゴリズムを使用して、取得したコレスキー三角形の特異値を見つけます。
JM

1
@JM:負のピボットに遭遇する可能性が高いため、通常の方法では、数値的に特異な正定行列のコレスキー分解を形成することは、数値的に不安定です。(例えば、Matlabのchol(A)は通常失敗します。)それらをゼロに設定し、因子の対応する行を全滅させる必要があります。これを行うと、数値のヌルスペースを確実に取得する方法が得られます。
Arnold Neumaier

@Arnold、メモリが機能する場合、行列が正の定値(またはそれに近い)の場合に対称ピボットを使用するコレスキーの適応があります。多分それらが使用される可能性があります...
JM

@JM:半確定のケースを解決するためにピボットする必要はありません。私が与えたレシピで十分です。標準の缶詰プログラムは使用できないが、自分で修正する必要があることを指摘したかっただけだ。
Arnold Neumaier

回答:


7

スペクトル分解の代わりにSVDを計算します。行列は対称正定であるので、正確な演算でも結果は同じですが、有限精度の演算では、はるかに高い精度で小さな固有値が得られます。

編集:Demmel&Kahan、双対角行列の正確な特異値、SIAM J. Sciを参照してください。統計 計算。11(1990)、873-912。
ftp://netlib2.cs.utk.edu/lapack/lawnspdf/lawn03.pdf

Edit2; 単一のエントリを1 ulpだけ変更すると、すでに小さな固有値がこれだけ変更されている可能性があるため、使用されるマシン精度の約ノルムの約1倍より小さい固有値を解決できるメソッドはないことに注意してください。したがって、非常に小さな値の代わりにゼロの固有値を取得することが適切であり、対応する固有ベクトルのもつれを解く方法はありません(より高い精度で作業することを除く)が、一般的な数値ヌル空間の基準を返すだけです。


[0,BT;B,0]

2
@JackPoulson:ポイントは、双対角形が小さな特異値をより適切に決定することです。関連する対称三重対角形の対角線上にゼロがあり、対角線への2重対角縮約によって保持されますが、3重対角に適用されたQRでは保持されません。
アーノルドノイマイヤー

1
参照?ヤコビの方法は非常に正確であることが知られています(遅いですが)。
Jack Poulson、2012

@JackPoulson:試してみてください。Demmel&Kahan、双対角行列の正確な特異値、202.38.126.65 / oldmirrors / ftp.netlib.org / lapack / lawnspdf /
Arnold Neumaier

私はあなたが何をしているのか分かります:置換の対角線がゼロであるため、双対角SVDのQRアルゴリズムは比較的正確にできます [0,BT;B,0]

1

この提案をありがとう。MathematicaのSVDコマンドを試しましたが、目立った改善はありません(まだ適切な対称性が欠けており、「固有値」は以前に誤って負になっていた場所で誤ってゼロになっています)。たぶん、組み込み関数の代わりに、上で説明したアルゴリズムの1つを実装する必要がありますか?大幅な改善が見込めるという事前の確信がない限り、このような特定の方法を使用する手間を省きたいです。

@JackPoulson、私はあなたが参照したJacobiの方法について紙をざっと見ました、そしてそれは有望に見えます。あなたや誰かが固有システムを見つけるためのヤコビの方法を実装する良い方法をお勧めできますか?自分で(MATLABで)コード化すると、非常に遅くなると思います。


私はそれをテストしていませんが、ここにMATLAB実装があります:groups.google.com/forum/?fromgroups#!msg
ジャックポールソン

単一のエントリを1 ulpだけ変更すると、すでに小さな固有値がこれだけ変更されている可能性があるため、使用されるマシン精度の約ノルムの約1倍より小さい固有値を解決できるメソッドはないことに注意してください。したがって、非常に小さな値の代わりにゼロの固有値を取得することが適切であり、対応する固有ベクトルのもつれを解く方法はありません(より高い精度で作業することを除く)が、一般的な数値ヌル空間の基準を返すだけです。何のために固有値が必要ですか?
アーノルドノイマイヤー2012

@ArnoldNeumaier:[0,1]の範囲の固有値を使用して、MATLABでいくつかのテストを実行し、1つの固有値を6.3e-16などの値に手動で設定し、OctaveのSVDルーチン(dgesvdに基づいて、双方向および次にQR)は、Octaveのeigよりもはるかに正確にこれらの値を取得します。リンクされたJacobiコードは、適度なサイズの行列であっても使用するには遅すぎるようです。
ジャックポールソン

@JackPoulson:はい。しかし、リーは複数について不平を言うようです非常に小さな固有値持っているようであり、それらの固有ベクトルが設計されたものであることはめったにありませんが、どの方法を使用しても自由に混合されます。そして、正の非常に小さい正の値(1e-16未満)は、もちろんゼロであることがわかります。
Arnold Neumaier

@ArnoldNeumaierは、複数の非常に小さな固有値を見つけていることは間違いありません。これは問題を悪化させると思います。(振り返ってみると明らかですが)1e-16未満の固有値は浮動小数点でゼロになることを知りませんでした。数値は保存できますが、それよりも大きい数値に加算すると丸め誤差が発生します。固有ベクトルは、特定の問題が解決可能かどうかを教えてくれます。固有ベクトルを使用すると、問題を解ける部分と解けない部分に分解できます。基本的に精度によって制限されている場合、より高速なソリューションのためのパッケージをお勧めできますか?
リー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.