嵌套循环:多个模型参数

时间:2016-03-14 15:35:43

标签: r performance loops for-loop time

我正在研究一个代码,它将计算一个包含多个参数的统计模型,我想在途中进行更改。然后,根据模型的性能,我会选择最好的一个。

我写了一些伪代码,说明了问题:

## 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中最有效的编程方式。有没有办法缩短处理时间(并且可能保存代码的易读性)?

2 个答案:

答案 0 :(得分:2)

您可以使用lapply语句为您的伪代码

矢量化您的操作
model <- function(x,y,z){x+y+z}

lapply(const1,function(x){
  lapply(const2,function(y){
    lapply(const3,function(z){model(x,y,z)})})})

答案 1 :(得分:1)

RR循环的速度。

for中,使用嵌套vector() - 循环的主要问题是可读性(也许还有内存分配)。因此,如果您事先知道输出的长度,请使用lapply创建此长度的存储对象,或者只需调用vapplyforR循环本身的速度不是expand.grid中的严重问题。

可读性

对于您的示例,您可以通过在三个向量上调用for来创建您想要使用的所有可能组合,对于这三个向量,您使用三个不同的嵌套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

并行化

如果您有多个核心可供使用,则可以使用parallel软件包中的mclapply轻松将任何mc.cores“循环”转换为并行版本。然后,您可以通过{{1}}参数指定核心数。这使您可以轻松地并行化循环。