5

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

また、SparseDoubleMatrix2D (データは非常にまばらです) を使用してもエラーが残るので、どうすればこの問題を解決できますか?

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

4

3 に答える 3

2

Oja のルールを使用して PCA を計算できます。これは反復アルゴリズムであり、PCA の推定値を一度に 1 つのベクトルで改善します。通常の PCA よりも低速ですが、メモリに格納する必要があるベクトルは 1 つだけです。数値的にも安定している

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

于 2011-12-05T23:50:14.937 に答える
0

この種の問題のために、スパースでインクリメンタルなアルゴリズムをいくつか構築しました。便利なことに、それはコルトの上に構築されています。

以下のtrickle-clusterライブラリのHallMarshalMartinクラスを参照してください。一度に行のチャンクをフィードできるので、メモリの問題を解決するはずです。

コードはGPLの下で利用可能です。リリースしたばかりなので、ドキュメントが不足しています。かなり自明であるといいのですが。使用に役立つJUnitテストがあります。

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

于 2011-12-07T17:09:18.283 に答える
0

ライブラリの変更が役立つかどうかはわかりません。double (8 バイトあたり) が必要になります。この場合、共分散行列の次元がどうなるかはわかりませんが、ライブラリを切り替えても基礎となる計算はあまり変わりません。

実行時の -Xmx 設定は何ですか? パーマのジェネサイズは?おそらく、それらを増やすことができます。

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

「大きな行列の Java 固有値」をGoogle で検索すると、Google からこのライブラリが見つかりました。コメントを下にスクロールすると、ランチョスの固有値分析が役立つブロックがあるのではないかと思います。固有値のサブセットを取得できれば十分かもしれません。

これらの SVM 実装は、大規模なデータセットに役立つと主張しています。

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

JVM に 2GB 以上を要求することはできないと思います。

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

Oracle によると、64 ビット OS で実行されている 64 ビット JVM が必要です。

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

于 2011-12-05T23:51:27.267 に答える