次のように、X
クラス型big.matrix
を入力として設計行列を取り、応答を予測する関数があります。
注:マトリックスのサイズはX
10 GB を超えています。そのため、メモリにロードできません。以前read.big.matrix()
はバッキング ファイルX.bin
とX.desc
.
myfun <- function(X) {
## do something with X. class(X) == 'big.matrix'
}
私の質問は、この巨大な big.matrix でクロス検証を効率的に行うにはどうすればよいかということです。
私の試み: (動作しますが、時間がかかります。)
- ステップ 1:フォールドごと
idx.train
に、トレーニングとテストのインデックスを取得しますidx.test
。 - ステップ 2: と に分割し
X
ます。とも非常に大きいため、それらを として保存し、各 foldのトレーニング セットとテスト セット用に関連するバッキング ファイル ( 、 ) を作成する必要があります。X.train
X.test
X.train
X.test
big.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()
私の問題を解決するためのより良いアイデアはありますか?? ありがとう。
更新を終了