切り捨てられたSVDの計算、一度に1つの特異値/ベクトル


11

特異値を1つずつ計算する切り捨てSVDアルゴリズムはありますか?

私の問題:大きな密行列の最初の特異値(および特異ベクトル)を計算したいのですが、適切な値がわかりません。は大きいため、効率上の理由から、後で最小のSVを切り捨てるためだけに完全なSVDを評価するのではなく、kMkM

理想的には、特異値を最大()から最小()まで連続的に計算する方法があるでしょう。そうすれば、があるしきい値を下回った場合に、番目の特異値を計算した後で計算を停止することができます。σ1,σ2,σ1σnkσk/σ1

そのようなアルゴリズムは存在しますか(できればPython実装で)?私のグーグル検索では、kをパラメーターとして使用する切り捨てられたSVD関数のみを見つけたので、アプリオリに推測する必要があります。


Mは正方形ですか、長方形ですか?長方形の場合、長い特異ベクトルと短い特異ベクトルのどちらが必要ですか?つまり、Mが(mxn)でm> nの場合、(mxk)または(kxn)のどちらが必要ですか?
Max Hutchinson

Mは長方形であり、列よりも行数が多くなります。短い特異ベクトルが必要です(つまり、V、M = U S V ^ T)。
SuperElectric 2014年

回答:


6

おおよそのランクk因数分解が必要な場合は、いくつかのオプションを使用できます。

  1. 強力にランクを明らかにするQR分解
  2. 補間分解(ID)およびその他のランダム化された手法。

AMNTfactor×σk+1(A):=ϵ

上記の形式のおおよその因数分解は、標準的な手法を使用して、QRやSVDなどの標準的な分解に変換できます。Halko、Martinsson、およびTroppによる論文「ランダム性を備えた構造の検出:近似行列分解を構築するための確率的アルゴリズム」の優れたレビューが利用可能です。

ソフトウェアの観点から、IDアルゴリズムへのインターフェースはscipy(scipy.linalg.interpolative)http://docs.scipy.org/doc/scipy-dev/reference/linalg.interpolative.htmlで利用でき、ユーザーが指定できます。。ϵ


2

(編集、私は最初に質問を誤って読んだので、あなたはすでに最初の特異値を計算するために利用できるルーチンがあることを知っています。)k

SVD全体を計算するアプローチを除外すると、部分的なSVDアルゴリズムは、関連するエルミート固有値問題を解くために反復法を使用することになります。したがって、取れる戦略の1つは、この種のことを自分で手動でコーディングし、シフトアンドインバート戦略などを使用して、停止するまで、解決されていない最大の特異値を解決し続けることです。SLEPcのような洗練されたパッケージでこの種のことを行うエレガントな方法があるかもしれません。

別の戦略は次のようになります:

  • 最大の特異値計算します。s1
  • スパースSVDルーチンの絶対許容誤差をに設定します。ここで、はしきい値であり、は、必要な余分な特異値の数を決定するための安全係数です計算する。τs1fτ0<f1
  • スパースSVDルーチンを呼び出します。

スパースSVDルーチンが薄いSVDを計算する(そして、なぜそうならないのかわからない)場合、この方法では、必要なすべての特異値(およびいくつかの追加の値)が得られます。ゼロとして扱われます。その場合、scipy.sparse.linalg.svdsを使用できますはオプションのパラメーターであり、事前に指定する必要がないことに注意してください。k


scipy.sparse.linalg.svdsで「k」を指定しない場合、「tol」パラメーターに関係なく、デフォルトでk = 6になります。これがバグなのか、それとも「tol」が(サイズではなく)計算された特異値の精度を参照することになっているのかは不明です
Nick Alger
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.