切り捨てられたSVDを計算するための高速アルゴリズムは何ですか?


14

おそらくトピックオフここが、いくつかの(存在する12すでに)関連の質問を。

文献(または切り捨てられたSVDアルゴリズムのgoogle検索)をいじくり回すと、さまざまな方法で切り捨てられたSVD を使用する多くの論文が見つかり、それを計算するための高速なアルゴリズムはあるが、誰もいないと主張しますそれらのアルゴリズムが何であるかを指しているようです。

私が見つけることができる唯一のものは、redSVDライブラリで使用される単一のランダム化アルゴリズムです。

私が見たいのは、システムがどのように動作するかを理解するのに適した、正確で不正確なアルゴリズムのセットです(もちろん実際にそれらを実装する必要はありません!)。

誰かがこの種のことの良いリファレンスを持っていますか?


データを適切に保存したい場合は、ハッシュでbツリー(またはrbツリー)を使用します(ramのようなものです)。データのBツリーがある場合、O(log(n))時間サンプルの分位数などを使用できます。大きなデータの場合、このようなサンプリングを使用して、短時間でsvd行列のまともなスパース近似を計算できると思います。また、極端なデータ圧縮に対する非常に統計的なアプローチである「圧縮センシング」を調べることもできます。
EngrStudent-モニカの復元15年

切り捨てられたSVDとは、すべてではなく、いくつかの主要な特異ベクトル/値を見つけることにのみ関心があるという意味ですか?
アメーバは、Reinstate Monica

@amoebaうん、それがアイデアです。
ジョンドゥセッテ

回答:


16

非常に大まかに言えば、固有値または特異値分解を計算するための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=(0BB0).
algorithm for truncated SVDiterative algorithm for eigendecomposition.

最も単純な反復アルゴリズムはべき乗反復と呼ばれ、実際非常に単純です。

  1. ランダム初期化します。x
  2. 更新します。xAx
  3. ノーマライズxx/x
  4. 収束しない限り、手順2に進みます。

より複雑なアルゴリズムはすべて、最終的にべき乗の繰り返しのアイデアに基づいていますが、かなり洗練されています。必要な数学は、クリロフ部分空間によって与えられます。アルゴリズムは、Arnoldi反復(正方非対称行列の場合)、Lanczos反復(正方対称行列の場合)、およびそのバリエーション(「暗黙的に再起動されたLanczos法」など)です。

これは、たとえば次の教科書で説明されています。

  1. Golub&Van Loan、マトリックス計算
  2. Trefethen&Bau、数値線形代数
  3. デメル、応用数値線形代数
  4. Saad、大規模な固有値問題の数値解法

すべての妥当なプログラミング言語と統計パッケージ(Matlab、R、Python numpy、名前を付ける)は、同じFortranライブラリを使用して固有値/特異値分解を実行します。これらはLAPACKARPACKです。ARPACKはARnoldi PACKageの略で、Arnoldi / Lanczosの繰り返しに関するものです。たとえば、MatlabにはSVDの2つの関数があります。LAPACKを介してsvd完全な分解を実行し、svdsARPACKを介して指定された数の特異ベクトルを計算し、実際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、ランダム性を伴う構造の発見:近似行列分解を構築するための確率的アルゴリズム。コメントするのに十分な知識がありません。


SVD固有の反復メソッドが存在することに注意してください。例えば、暗黙的に再起動されたランチョス双対角化法の拡張、J。バグラマとL.レイチェル、SIAM J. Sci。計算します。2005年(私はちょうどそのメソッドのようなその人を知っている、それはあなたが与えた固有値アプローチとは根本的に違うのかどうかを知るために、紙を読んでいない。)
ドゥーガル

1
@Dougalのリンクをありがとう。私はこれらの方法のどれも本当によく知らないので、それについて本当にコメントすることはできません。もっと知識のある人がさまざまな反復法の関係を説明してくれるといいですね。私の知る限り、バニラランチョス法はSVDではなく正方行列の固有値を計算するためのものです。「拡張された暗黙的に再起動されたLanczos」はそれに密接に関連しているはずですが、あなたは正しいです-それはSVDに直接関係しているようです。すべてがどのように組み合わさるかわからない。よく見ると答えを更新します。
アメーバは、モニカを復活させる

1
@Dougal、私は大まかな読書をして、更新しました。
アメーバは、モニカを復活させる

@amoebaは、正規化された最小二乗のコンテキストで「切り捨てられたSVD」は、本質的に「主成分回帰」と同じですか?
GeoMatt22

1
@amoebaあなたはFacebookの上でコメントすることができ、ランダム化SVDの実装、一部の人々が言うように見える、それが今、最速の可能な解決策の一つであること。これについてもコメントできるように編集できたら素晴らしいと思います。
ティム

4

私はグーグル高速SVDを介してスレッドにつまずいたので、私は自分で物事を理解しようとしていますが、適応クロス近似(ACA)を検討する必要があります。

MM=i=0kUiViTN×NO(N)

繰り返しますが、それが機能するかどうかはあなたの問題に依存します。私が個人的に遭遇する多くの場合、ACAは非常に便利な数値ツールです。

注:これをコメントとして書きたかったのですが、このアカウントを作成したばかりなので、コメントに対する評判が十分ではありません...しかし、投稿は機能します。


2

これは、(Netflixデータセット上で)切り捨てられたSVDを計算するために過去に成功して使用したテクニックです。これはこの論文から引用しました。協調フィルタリング設定では、ほとんどの値が欠落しており、ポイントはそれらを予測することであることに注意する必要があります。そのため、切り捨てられたSVDを使用してこのような問題を解決するには、その条件下で機能する手法を使用する必要があります。短い説明:

  1. 何かを行う前に、単純なモデル(たとえば、グローバル平均+列と行の定数値)を当てはめ、それを行った後にのみ、切り捨てられたSVDを使用して残差を当てはめます。
  2. 各行と列(Netflixの場合は各映画とユーザー)に対して、長さk(切り捨てるランク)のランダムなベクトルを初期化します。
  3. 行ベクトルを固定し、列ベクトルを更新して、行列内の既知のエントリの誤差を最小化します。手順は、本書のmatlabコードに記載されています。
  4. 列ベクトルを固定し、同様の方法で行ベクトルを更新します。
  5. 収束するか、十分な結果が得られるまで、3と4を繰り返します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.