2

我重写了问题以使其可重现。假设我想沿着我自己选择的网格最大化函数exp(alpha+eta+gamma)alpha,eta,gamma我已经使用 for-loops 完成了这项工作,但我想使用 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_matrixI get 0 0 0,所以有些东西显然不起作用。任何帮助表示赞赏。

4

2 回答 2

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), ]
于 2012-08-22T09:24:51.533 回答
1
  1. 我假设您的目标函数是矢量化的。exp是,如果可能的话,你也应该尝试编写你真正的目标函数向量化。

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

现在是建议:

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])

apply这是向量化计算与具有 100 个值的三个参数向量中的每一个的基准:

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
于 2012-08-22T09:25:26.293 回答