密行列が低ランクかどうかを迅速に判断する


13

私が取り組んでいるソフトウェアプロジェクトでは、特定の計算は、高密度の低ランクマトリックスに対して非常に簡単です。いくつかの問題の例には、高密度の低ランクマトリックスが含まれていますが、それらは要因としてではなく、完全に与えられているので、低ランク構造を利用したい場合は、ランクをチェックしてマトリックスを分解する必要があります。

問題のマトリックスは通常、完全にまたはほぼ完全に高密度で、nは100から数千までの範囲です。行列のランクが低い場合(5〜10未満など)、SVDを計算し、それを使用して低ランクの因数分解を行うことは労力に値します。ただし、マトリックスのランクが低い場合、労力は無駄になります。

したがって、完全なSVD分解を行うための労力を投資する前に、ランクが低いかどうかを判断するための高速で合理的に信頼できる方法を見つけたいと思います。ランクがカットオフを超えていることが明らかになった場合、プロセスはすぐに停止できます。手順が誤って低ランクであるとマトリックスを宣言した場合、これは大きな問題ではありません。低ランクを確認して低ランクの因数分解を見つけるために完全なSVDを実行しているからです。

私が検討したオプションには、LU分解またはQR分解を示すランクの後にチェックとして完全なSVDが含まれます。他に考慮すべきアプローチはありますか?

回答:


8

私が最近この論文から学んだきちんとしたトリックがあります。という形式の行列がある場合、ランクを明らかにするQRを開始し、最初のハウスホルダー反射の後に停止します サイズの三角形、及び(我々が最初の後に停止するので、典型的には三角形ではない私達の主ループの反復)。この時点で、:成立する場合、はランク行列から最大で距離にありますk

[R1R120R22],
R1k×kR22kR22εAεk; そうでなければ(数値エラーを除いて)そうではありません。

この手順は、密行列かかります。O(n2k)n×n


これは本質的に、質問で説明したアプローチです。Wolfgang Bangerthの提案した答えはよりも良いと思う。O(n2k)
ブライアン

7

もちろん、問題は、(たとえば、QR分解を介して)真のランクを計算することが、マトリックスの低ランクの表現を計算するよりも実際に安くないことです。

おそらくできる最善の方法は、ランダム化アルゴリズムを使用して低ランクの近似値を見つけることです。これらは、少なくとも理論的には、マトリックス全体を処理するよりも大幅に高速になります。これは、本質的に、ランダムな部分空間へのマトリックスの投影の分解のみを計算するためです。

サイズ行列にそれが価値があるかどうかは良い質問かもしれませんが、問題が本当に大きくなったら、それは報われると思います。100×100


これらのアルゴリズムについて私が知っていることから、それらは与えられたマトリックスにかなり近い標準的な低ランクのマトリックスを生成します。私は非常に近い与えられた行列にある(例えば)ランク10以下の行列がありますかどうかを知る必要があります(1.0E-10以上の相対誤差を言う。)
ブライアンBorchersの

はい。ただし、投影(低次元)行列のQR分解を行うこともできます。その分解によりフルランクが欠落していることが明らかになった場合は、ランク不足の元のマトリックスもあります。元の行列でQR分解を行うために必要な基準ではなかったでしょうか?
ヴォルフガングバンガース

射影された行列のランクが(ランダム行列の行数にAを掛けた値)およびAのランク以下であることがわかります。ランク場合、元の行列はランク以下。ランクが未満の場合、運が悪かったり、のランクが未満だった可能性があります。ランク発見によって行列がで行うことができる時間。ただし、に掛けるランダム行列が密である場合、乗算は取りますkkk1kAkknO(k2n)AO(kn2時間。高い確率でランクを維持するスパース行列はありますか?
ブライアンボーチャーズ

知りません。アルゴリズムが、マトリックスがフルランクでない場合にのみ通知できることに同意します(そして暗示するつもりでした)。すべてのランダムな方向をとらない限り、マトリックスフルランクであるかどうかはわかりません。私の希望は、十分に小さいに対する答えが得られることです。k=nkkn2n3
ヴォルフガングバンガース

1

試す価値のあるもう1つのアプローチは、適応クロス近似(ACA)を使用することです。これは非常に人気のあるアルゴリズムで、多くの実装がオンラインで利用可能です。参考として、元の論文をご覧ください。

ACAとそのバリエーション(たとえば、ACA +、ハイブリッド交差近似HCA)は、さまざまなシナリオで使用できます。必要に応じて残差を正確に計算できるため、すでに密行列全体が計算されていることは好ましいことの1つです。

経験的残差(アルゴリズムを参照)で十分であれば、複雑さはになると思います。ここで、は正方行列のサイズ、はランクです。ランクは、指定された切り捨て許容値関数であることに注意してください。正確で保証されたエラー範囲にはが必要です。O(Nr)Nr(ϵ)rϵON2r


0

行列が対称正定値である単純な場合、その20個の最大固有値を計算し、それらがであるかどうかを確認するか、ノルムを比較します。ARPACKはこのために高速です。さらに重要なことは、関数のみが必要なことです。したがって、一般的なについては、固有値を見てください (インスタンス化せずにLinOpとして)。A0バツAバツAATA

scipy.sparse.linalg.svds はこれを行います:LinOp Arpack、任意のサイズのに対して:(ATA)A

from scipy.sparse.linalg import svds
sing = svds( A, k=20, tol=1e-4, return_singular_vectors=False )  # v0=random
# runtimes on random-normal n x n:
# n = 100, 1k, 2k
#       5, 130, 770 ms
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.