我重写了这个问题,使其具有可重复性。假设我想沿着我自己选择的网格最大化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
,因此显然无效。任何帮助表示赞赏。
答案 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)
我假设你的目标函数是矢量化的。如果可能的话,exp
也应该尝试编写矢量化的真实目标函数。
目前,我假设您可以将整个结果保存在内存中。如果没有,您将需要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])
以下是对于具有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