我有一个函数,如下所示,它将一个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
分为X.train
和X.test
。由于X.train
和X.test
也非常大,我必须将它们存储为,并为每个折叠的训练和测试集big.matrix
创建关联的支持文件 (.bin
, ) 。.desc
- 第 3 步:输入
X.train
以构建模型,并预测 的响应X.test
。
耗时的部分是第 2 步,我必须多次创建用于训练和测试的支持文件(几乎就像复制/粘贴原始大矩阵一样)。例如,假设我进行 10 倍交叉验证。第 2 步将花费 30 多分钟来为所有 10 个折叠创建备份文件!
为了在步骤 2 中解决这个问题,我想也许我可以将原始矩阵分成 10 个子矩阵(类类型big.matrix
)一次。然后对于每一折,我使用一个部分进行测试,并将剩余的 9 个部分组合为一个大矩阵进行训练。但是新的问题是,big.matrix
没有复制/粘贴就没有办法有效地将小的组合成一个大的。
当然,我可以为这个交叉验证过程进行分布式计算。但我只是想知道如果仅使用单核是否有更好的方法来加快该过程。
有任何想法吗?提前致谢。
更新:
X
事实证明,@cdeterman 的答案在很大时不起作用。原因是该mpermute()
函数本质上是通过复制/粘贴来置换行。mpermute()
在 C++ 中调用ReorderRNumericMatrix()
,然后调用reorder_matrix()
函数。此函数通过遍历所有列和行并进行复制/粘贴来重新排序矩阵。请参阅此处的源代码。
有没有更好的想法来解决我的问题?谢谢。
结束更新