2011-12-05 12 views
5

私はpcaで解析するデータを含む非常に大きな行列(約500000 * 20000)を持っています。これを行うには、ParallelColtライブラリを使用していますが、共分散行列の固有ベクトルと固有値を得るために特異値分解と固有値分解を使用しています。しかし、これらのメソッドは、ヒープを浪費し、私は "OutOfMemory"エラーを取得します...大きな行列上でjavaでPCAを実行する

また、SparseDoubleMatrix2Dを使用して(データは非常にまばらです)、エラーは依然として残っているので、私はこの問題を解決できますか?

ライブラリを変更しますか?

+0

Javaはみなさ言語のみですが、私は......この行列はめちゃくちゃ大きい想像できますか? – Beginner

+0

別の言語に切り替えると何が変わるのかわかりません。 – duffymo

答えて

2

PCAをOjaのルールで計算することができます。反復アルゴリズムであり、PCAの見積もりを1つのベクトルに改善します。これは通常のPCAよりも遅いですが、1つのベクトルだけをメモリに格納する必要があります。それは私が変更ライブラリが役立つことをわからないんだけど、非常に数値的に安定

http://en.wikipedia.org/wiki/Oja%27s_rule

0

です。ダブルス(8バイト/ 1つ)が必要になります。この場合、共分散行列の次元がどんなものか分かりませんが、ライブラリを切り替えることで基礎となる計算が大幅に変更されることはありません。

実行時に-Xmx設定は何ですか? perm genのサイズはどうですか?おそらくあなたはそれらを増やすことができます。

アルゴリズムはすぐに停止するのですか、しばらく実行されますか?後者の場合は、Visual VM 1.3.3(すべてのプラグインをダウンロードしてインストールする)を使用してプロセスにアタッチできます。ヒープ、スレッドなどで何が起きているのかを見せてくれます。根本的な原因を見つけ出すのに役立ちます。

Google search「Javaの大きな固有名詞」はGoogleからthis libraryとなっています。コメントをスクロールすると、ブロックのLanczos固有値分析が役立つかもしれません。固有値の部分集合を得ることができれば十分かもしれません。

これらSVMの実装では、大規模なデータセットのために有用であると主張する:

http://www.support-vector-machines.org/SVM_soft.html

私はあなたがJVM用に2GB以上を求めることができるとは思わない:

http://www.theserverside.com/discussions/thread.tss?thread_id=26347

よりますオラクルには、64ビットOS上で動作する64ビットJVMが必要です。

http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit

+0

結果の淡色は500000x500000になります。 – Beginner

+0

これについてはどうですか? 20K x 20Kでない? – duffymo

+0

これは共分散行列です。 (Xが入力されている)http://upload.wikimedia.org/wikipedia/en/math/6/7/6/67616c643a158c1e00a8e4d5ec3d0b1a.png – Beginner

0

私は、この種の問題のためにいくつかの疎なインクリメンタルアルゴリズムを構築しました。都合の良いことに、それはコルトの上に建てられています。

下記のtrickl-clusterライブラリのHallMarshalMartinクラスを参照してください。あなたは一度に行の塊を供給することができますので、あなたの記憶の問題を解決する必要があります。

コードはGPLで入手できます。私はちょうどそれをリリースしたので恐れているので、ドキュメンテーションでは不足しています、うまくいけばそれはかなり自明です。使い方に役立つJUnitテストがあります。

http://open.trickl.com/trickl-pca/index.html

関連する問題