1

我有一个函数,如下所示,它将一个X具有类类型的设计矩阵big.matrix作为输入并预测响应。

注意:矩阵大小X超过 10 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分为X.trainX.test。由于X.trainX.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()函数。此函数通过遍历所有列和行并进行复制/粘贴来重新排序矩阵。请参阅此处的源代码。

有没有更好的想法来解决我的问题?谢谢。

结束更新

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 回答