2

再現性のある質問に書き直しました。自分で選んだグリッドに沿って関数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、明らかに何かが機能していません。どんな助けでも大歓迎です。

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. 今のところ、結果全体をメモリに保持できると思います。そうでない場合は、lapply1つ以上のパラメーターを使用する必要がありますが、おそらくすべてのパラメーターをループする必要はありません。

今ここに提案があります:

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個の値を持つ3つのパラメーターベクトルのそれぞれのベンチマーク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
于 2012-08-22T09:25:26.293 に答える