巨大なスパース行列のSVDを計算する方法は?


26

データが非常に少ない非常に大きな正行列(65M x 3.4M)の特異値分解(SVD)を計算する最良の方法は何ですか?

行列の0.1%未満はゼロではありません。次の方法が必要です。

  • メモリに収まります(オンラインメソッドが存在することを知っています)
  • 妥当な時間で計算されます:3,4日
  • 精度は十分に向上しますが、精度は私の主な関心事ではなく、投入するリソースの量を制御できるようにしたいと考えています。

それを実装するHaskell、Python、C#などのライブラリがあれば素晴らしいでしょう。私はmathlabやRを使用していませんが、必要に応じてRを使用できます。


3
どれくらいのメモリがありますか?65M * 3.4Mの0.1%は、まだ221e9の非ゼロ値です。値ごとに4バイトを使用する場合、オーバーヘッドがないと仮定すると、それでも55 GBを超えているため、スパース性はまだ問題を解決しません...セット全体を一度にメモリにロードする必要がありますか?
ビット単位

もっと正確にすべきだった。32ビット整数で250-500mb以下。おそらくはるかに少ないですが、私が理解しているように、次元が問題です。16GBのマシンがあります。
ソニア

これはどう?quora.com/…–
ビット

このWebページは、「高速、インクリメンタル、低メモリ、大行列のSVDアルゴリズム」を実装するPythonライブラリにリンクしています。en.wikipedia.org
wiki

回答:


21

メモリに収まる場合は、Matrixパッケージを使用してRでスパース行列を作成し、SVDでirlbaを試してください。結果に必要な特異ベクトルの数を指定できます。これは、計算を制限するもう1つの方法です。

これは非常に大きなマトリックスですが、過去にはこの方法で非常に良い結果が得られました。 irlbaかなり最先端です。これは、使用して暗黙的に再起動ランチョスバイ対角化アルゴリズムを

Netflixプライズデータセット(480,189行x 17,770列、100,480,507の非ゼロエントリ)をミリ秒単位で噛むことができます。データセットはNetflixデータセットよりも200,000倍大きいため、それよりも大幅に時間がかかります。数日で計算できると期待するのが妥当かもしれません。


データ行列はメモリに収まりますが、irlbaはメモリ効率の良い方法で分解を処理しますか?
ソニア

@Sonia:irlbaはメモリ効率が非常に高く、近似解を計算し、特異ベクトルの数を制限でき、スパース行列で動作するように設計されています。私の知る限り、部分的なSVDを計算するのと同じくらい高速です。
ザック

@ソニア:がんばろう!
ザック

試してみてください-メモリ不足です...実行する前に三角形のブロック形式を計算します。
ソニア

@Soniaスパースとして保存されていますMatrixか?計算する特異値の数を制限してみてください...おそらくトップ10を見てください。
ザック

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.