7

CSV ファイルに非常に大きなトレーニング セット (~2Gb) があります。ファイルが大きすぎてメモリに直接読み込むことができない (read.csv()コンピュータが停止する) ため、PCA を使用してデータ ファイルのサイズを縮小したいと考えています。問題は、(私が知る限り) PCA アルゴリズム (例: princomp()) を実行するために、ファイルをメモリに読み込む必要があることです。

bigmemoryパッケージでファイルを として読み込もうとしましたbig.matrixが、オブジェクトでprincompは機能せず、 のようなものに変換できるbig.matrixようには見えません。big.matrixdata.frame

princomp不足している大きなデータ ファイルで実行する方法はありますか?

私は R の比較的初心者なので、これのいくつかはより経験豊富なユーザーには明らかかもしれません (前もってお詫びします)。

情報をありがとう。

4

2 に答える 2

10

私がそれを解決した方法は、サンプルの共分散行列を繰り返し計算することでした。このようにして、任意の時点のデータのサブセットのみが必要になります。readLinesファイルへの接続を開いて繰り返し読み取る場所を使用して、データのサブセットのみを読み取ることができます。アルゴリズムは次のようになります (2 段階のアルゴリズムです)。

列ごとの平均値を計算します (それが変数であると仮定します)

  1. ファイル接続を開く ( con = open(...))
  2. 1000行読む ( readLines(con, n = 1000))
  3. 列ごとの平方和を計算する
  4. これらの二乗和を変数に追加します ( sos_column = sos_column + new_sos)
  5. ファイルの終わりまで 2 ~ 4 を繰り返します。
  6. 行数から 1 を引いた数で割り、平均を求めます。

共分散行列を計算します。

  1. ファイル接続を開く ( con = open(...))
  2. 1000行読む ( readLines(con, n = 1000))
  3. を使用してすべての外積を計算しますcrossprod
  4. これらの外積を変数に保存します
  5. ファイルの終わりまで 2 ~ 4 を繰り返します。
  6. 行数から 1 を引いた値で割り、共分散を取得します。

共分散行列がある場合は、princompwithcovmat = your_covmatを呼び出すだけでprincomp、共分散行列自体の計算をスキップします。

このようにして、処理できるデータセットは、使用可能な RAM よりもはるかに大きくなります。反復中のメモリ使用量は、おおよそチャンクが使用するメモリ (たとえば 1000 行) であり、その後のメモリ使用量は共分散行列 (nvar * nvar doubles) に制限されます。

于 2012-10-01T10:09:34.987 に答える