1

次のように、Xクラス型big.matrixを入力として設計行列を取り、応答を予測する関数があります。

注:マトリックスのサイズはX10 GB を超えています。そのため、メモリにロードできません。以前read.big.matrix()はバッキング ファイルX.binX.desc.

myfun <- function(X) {
## do something with X. class(X) == 'big.matrix'
}

私の質問は、この巨大な big.matrix でクロス検証を効率的に行うにはどうすればよいかということです。

私の試み: (動作しますが、時間がかかります。)

  • ステップ 1:フォールドごとidx.trainに、トレーニングとテストのインデックスを取得しますidx.test
  • ステップ 2: と に分割しXます。とも非常に大きいため、それらを として保存し、各 foldのトレーニング セットとテスト セット用に関連するバッキング ファイル ( 、 ) を作成する必要があります。X.trainX.testX.trainX.testbig.matrix.bin.desc
  • ステップ 3: をフィードしX.trainてモデルを構築し、 の応答を予測しX.testます。

時間のかかる部分はステップ 2で、トレーニングとテスト用のバッキング ファイルを何度も作成する必要があります (元の大きな行列をコピーして貼り付けるのとほとんど同じです)。たとえば、10 分割の交差検証を行うとします。ステップ 2 では、10 個のフォールドすべてのバッキング ファイルを作成するのに 30 分以上かかります。

ステップ 2 でこの問題を解決するには、元の行列を (クラス type の) 10 個の部分行列に一度だけ分割できると思いますbig.matrix。次に、フォールドごとに 1 つの部分をテスト用に使用し、残りの 9 つの部分をトレーニング用の 1 つの大きなマトリックスとして結合します。しかし、新しい問題は、big.matrixコピー/貼り付けなしで小さいものをより大きなものに効率的に結合する方法がないことです。

もちろん、この相互検証手順のために分散コンピューティングを実行できます。しかし、単一のコアを使用するだけで、手順を高速化するより良い方法があるかどうか疑問に思っています.

何か案は?前もって感謝します。

アップデート:

Xが非常に大きい場合、@cdeterman の回答は機能しないことが判明しました。その理由は、mpermute()関数が本質的にコピー/貼り付けを行うことによって行を並べ替えるためです。C++ でmpermute()呼び出し、次に関数を呼び出します。この関数は、すべての列と行をループしてコピー/貼り付けを行うことにより、マトリックスを並べ替えます。ソースコードはこちらをご覧ください。ReorderRNumericMatrix()reorder_matrix()

私の問題を解決するためのより良いアイデアはありますか?? ありがとう。

更新を終了

4

1 に答える 1

3

機能を使いたくなりsub.big.matrixます。これにより、それ以上のコピーが回避され、同じ元のデータが参照されます。ただし、現在のところ、連続する行のみをサブセット化できます。したがって、最初に行を並べ替える必要があります。

# Step 1 - generate random indices
idx <- sample(nrow(X), nrow(X))
mpermute(X, idx)

# Step 2 - create your folds
max <- nrow(bm)/10 # assuming 10 folds
idx_list <- split(seq(nrow(bm)), ceiling(seq(nrow(bm))/max))

# Step 3 - list of sub.big.matrix objects
sm_list <- lapply(idx_list, function(x) sub.big.matrix(bm, firstRow = x[1], lastRow = x[length(x)]))

これで、オリジナルbig.matrixが 10 の異なるマトリックスに分割され、好きなように使用できるようになりました。

于 2015-11-09T18:30:00.730 に答える