使用lapply最大化沿网格的功能

时间:2012-08-22 08:45:24

标签: r

我重写了这个问题,使其具有可重复性。假设我想沿着我自己选择的网格最大化exp(alpha+eta+gamma)的函数alpha,eta,gamma。我使用for循环完成了这个,但我想利用apply-functions来加速程序。这就是我所做的(eta和gamma在这里被固定)。

eta=0.11
gamma=0.06
alpha=0.5    
alpha_vals=seq(0.1,1,by=0.1)
eta_vals=eta
gamma_vals=gamma


ml_temp=-Inf

lapply(alpha_vals,function(alpha_v){
  lapply(eta_vals,function(eta_v){
    lapply(gamma_vals,function(gamma_v){
      temp=exp(alpha_v+eta_v+gamma_v)
      if (temp >= ml_temp) {
        ml_temp=temp
        mle_matrix=c(alpha_v,eta_v,gamma_v)
      }  
    })  
  })    
})

输出mle_matrix我得到0 0 0,因此显然无效。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:5)

最简单的方法是使用expand.grid()和apply()

toTest <- expand.grid(
    alpha = seq(0.1, 1, by = 0.1), 
    eta = seq(0.1, 1, by = 0.1), 
    gamma = seq(0.1, 1, by = 0.1))
ml <- apply(toTest, 1, function(x){
  exp(sum(x))
})
toTest[which.max(ml), ]

答案 1 :(得分:1)

  1. 我假设你的目标函数是矢量化的。如果可能的话,exp也应该尝试编写矢量化的真实目标函数。

  2. 目前,我假设您可以将整个结果保存在内存中。如果没有,您将需要lapply一个或多个参数,但可能不需要遍历所有参数。

  3. 现在这是建议:

    search.pts <- expand.grid (alpha_v = alpha_vals, 
                               gamma_v = gamma_vals, 
                               eta_v   = eta_vals)
    target.val <- exp (search.pts$alpha_v + search.pts$gamma_v + search.pts$eta_v)
    solution <- which.max (target.val)
    
    search.pts [solution,]
    

    或者可能返回

    list (params = search.pts [solution,], value = target.val [solution])
    

    以下是对于具有100个值的三个参数向量中的每一个,向量化计算与apply的基准:

    microbenchmark (
        vectorized = exp (search.pts$alpha_v + search.pts$gamma_v + search.pts$eta_v),
        apply      = apply (search.pts, 1, function (x) exp (sum (x))), 
        times = 10)
    
    ## Unit: milliseconds
    ##         expr        min        lq     median          uq       max
    ## 1      apply 9569.52277 9687.8617 9940.53103 10140.13430 11413.508
    ## 2 vectorized   44.37456   45.3286   46.75505    67.38978   314.196