【问题标题】:Parallel processing in RR中的并行处理
【发布时间】:2013-01-27 08:26:22
【问题描述】:

我正在使用自定义随机森林函数,该函数需要一组基因组数据(大约 56k 列)中的起点和终点。

我想将列号拆分为子组,并允许单独处理每个子组以加快处理速度。我用以下代码尝试了这个(不成功):

library(foreach)
library(doMC)
foreach(startMrk=(markers$start), endMrk=(markers$end)) %dopar% 
    rfFunction(genoA,genoB,0.8,ntree=100,startMrk=startMrk,endMrk=endMrk)

其中 startMrk 是数值变量数组:1 4 8 12 16,endMrk 是另一个数组:3 7 11 15 19

对于这个例子,我希望一个核心以 1:3 运行样本,另一个以 4:7 运行,等等。我对 R 中的并行处理概念不熟悉,所以我非常愿意研究任何可用的文件。有人对我在并行处理或上述代码中缺少的东西有什么建议吗?

【问题讨论】:

    标签: r foreach parallel-processing random-forest


    【解决方案1】:

    这里的基本点是您将列拆分为块,对。首先,最好在每次迭代时适当地对数据集进行分块并将这些块馈送到 RF 中。此外,foreach 在某些方面的工作方式与 for 类似,因此代码可以

    rfs=vector('list',4)
    foreach(i=1:4) %dopar% {
      ind <- markers$start[i]:markers$end[i]
      rfs[[i]] <- randomForest(genoA[,ind],genoB[,ind], 0.8, ntree=100)
    }
    

    我在常规 randomForest 中给出了这个,但您可以直接将其封装到您的自定义代码中。

    【讨论】:

    • 这并不完全正确,但是当我使用类似的东西时:r &lt;- foreach(i=1:5, .combine="cbind") %dopar%{ RandomForest(genoA,genoB,0.8,ntree=100,startMrk=markers$start[i],endMrk=markers$end[i])} 我得到了我想要的东西。最后一个问题:我正在使用的自定义函数返回一个列表。有没有办法选择性地组合列表中的元素?感谢您的帮助!
    • 有点晚了,但要回答您的“最后一个问题”:与其“选择性地组合列表中的元素”,不如直接提取您感兴趣的列表元素?而不是:foreach(...) %dopar% {return(list(A = ..., B = ...))};试试:foreach(...) %dopar% {res &lt;- list(A = ..., B = ...); return(res$A)}。或者,定义您自己的 .combine 函数来做同样的事情。 (不过,第一个选项会导致更少的数据移动;如果 res$B 很大,这很重要!)
    猜你喜欢
    • 2021-06-04
    • 2016-10-08
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多