非常に大まかに言えば、固有値または特異値分解を計算するための2つのアプローチがあります。1つのアプローチは行列を対角化することであり、これは本質的に全体の固有値/特異値分解(全体の固有値スペクトル)を同時にもたらします。ここでいくつかの概要を参照してください:特異値分解(SVD)を計算する効率的なアルゴリズムは何ですか?別の方法は、一度に1つ(または複数)の固有ベクトルを生成する反復アルゴリズムを使用することです。必要な数の固有ベクトルが計算された後、反復を停止できます。
SVD専用の反復アルゴリズムはないと思います。一つのSVDを計算することができるので、これは行列Bを正方形対称の固有値分解を実行して、(N + M )× (N + M )行列A = (0 B B ⊤ 0)。したがって、代わりのアルゴリズム計算切り捨てSVD、あなたはどのような反復は、アルゴリズム計算固有値分解尋ねるすべきか尋ねるの:切り捨てSVDのためのアルゴリズム≈ 固有値分解のための反復アルゴリズムを。n×mB(n+m)×(n+m)
A=(0B⊤B0).
algorithm for truncated SVD≈iterative algorithm for eigendecomposition.
最も単純な反復アルゴリズムはべき乗反復と呼ばれ、実際非常に単純です。
- ランダム初期化します。x
- 更新します。x←Ax
- ノーマライズ。x←x/∥x∥
- 収束しない限り、手順2に進みます。
より複雑なアルゴリズムはすべて、最終的にべき乗の繰り返しのアイデアに基づいていますが、かなり洗練されています。必要な数学は、クリロフ部分空間によって与えられます。アルゴリズムは、Arnoldi反復(正方非対称行列の場合)、Lanczos反復(正方対称行列の場合)、およびそのバリエーション(「暗黙的に再起動されたLanczos法」など)です。
これは、たとえば次の教科書で説明されています。
- Golub&Van Loan、マトリックス計算
- Trefethen&Bau、数値線形代数
- デメル、応用数値線形代数
- Saad、大規模な固有値問題の数値解法
すべての妥当なプログラミング言語と統計パッケージ(Matlab、R、Python numpy、名前を付ける)は、同じFortranライブラリを使用して固有値/特異値分解を実行します。これらはLAPACKとARPACKです。ARPACKはARnoldi PACKageの略で、Arnoldi / Lanczosの繰り返しに関するものです。たとえば、MatlabにはSVDの2つの関数があります。LAPACKを介してsvd
完全な分解を実行し、svds
ARPACKを介して指定された数の特異ベクトルを計算し、実際eigs
には「正方化」行列の呼び出しの単なるラッパーです。
更新
BAABA
これらのメソッド用のFortranライブラリもあり、PROPACKと呼ばれます。
ソフトウェアパッケージPROPACKには、大規模なスパース行列または構造化行列の特異値分解を計算するための一連の関数が含まれています。SVDルーチンは、部分再直交化(BPRO)を備えたLanczos二重対角化アルゴリズムに基づいています。
ただし、PROPACKはARPACKよりもはるかに標準性が低く、標準のプログラミング言語ではネイティブにサポートされていません。これはRasmus Larsenによって書かれました。彼は、長さ90ページの長い1998年の論文で、部分的に再直交化されたLanczos 2重対角化を持ち、見栄えが良いと思われます。この計算科学SEスレッドを介して@MichaelGrantに感謝します。
より最近の論文の中で、最も人気がサズ&ライヒェル、2005年のようです増補暗黙のうちに再開さランチョスbidiagonalization法の周りに、おそらく最先端技術です。コメントでこのリンクを提供してくれた@Dougalに感謝します。
更新2
実際、あなたが引用した概要論文で詳細に説明されているまったく異なるアプローチがあります。Halkoet al。2009、ランダム性を伴う構造の発見:近似行列分解を構築するための確率的アルゴリズム。コメントするのに十分な知識がありません。