首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套循环:多模型参数

嵌套循环:多模型参数
EN

Stack Overflow用户
提问于 2016-03-14 15:35:43
回答 2查看 261关注 0票数 0

我正在编写一个代码,它将计算一个包含多个参数的统计模型,我希望在此过程中更改该模型。然后,根据模型的性能,选择最优的模型。

我写了这么一堆伪代码,说明了这个问题:

代码语言:javascript
复制
## vectors with values of parameters

const1 <- c(300, 500)
const2 <-  c(1, 2, 3, 4, 5)
const3 <- c(30, 50, 70, 90, 110, 130)

## loop counter

i = 1

for (j in 1:length(const1)){
  for (k in 1:length(const2)){
    for (l in 1:length(const3)){

      ## i-th model

      model <- stat.model(x = train,
                          y = target,
                          param1 = const1,
                          param2 = const2,
                          param3 = const3)

      ## ... outputing model results to a data table

      ## printing the number of iteration

      cat("iteration =", i)
      i <- i+1

      ## calling garbage collector to assure free space in RAM

      gc()
    }
  }
}

正如您所看到的,我使用嵌套的"for“循环,这可能不是R中最有效的编程方法,有什么方法可以缩短处理时间(并可能节省代码的可读性)吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-14 16:00:01

for循环在R中的速度。

R中,使用嵌套for-loops的主要问题是可读性(可能还有内存分配)。因此,如果预先知道输出的长度,可以使用vector()创建这样长的存储对象,或者直接调用lapplyvapplyfor-loop本身的速度在R中不是一个严重的问题。

可读性

对于您的示例,您可以通过在三个向量上调用expand.grid来创建您想要预先使用的所有可能的组合,为此您使用了三个不同的嵌套for-loops,如下所示:

代码语言:javascript
复制
combis <- expand.grid(const1 = const1,
                      const2 = const2,
                      const3 = const3)

combis <- combis[order(combis$const1, combis$const2, combis$const3), ]

lapply(seq_len(nrow(combis)), FUN = function(i) {
  model <- stat.model(x = train,
                      y = target,
                      param1 = combis[i, "const1"],
                      param2 = combis[i, "const2"],
                      param3 = combis[i, "const3"])
  model
})

并行化

如果您有多个核可供使用,则可以通过使用来自lapply包的mclapply轻松地将任何平行“循环”转换为并行版本。然后,您可以通过mc.cores参数指定核心的数量。这允许您用很少的额外工作来并行您的循环。

票数 1
EN

Stack Overflow用户

发布于 2016-03-14 15:59:16

您可以使用lapply语句向向量表示您的伪代码。

代码语言:javascript
复制
model <- function(x,y,z){x+y+z}

lapply(const1,function(x){
  lapply(const2,function(y){
    lapply(const3,function(z){model(x,y,z)})})})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35991790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档