[R] Optimization Grid Search Slow

ProfJCNash profjcnash at gmail.com
Thu Sep 17 21:31:12 CEST 2015


optimx does nothing to speed up optim or the other component optimizers. 
In fact, it does a lot of checking and extra work to improve reliability 
and add KKT tests that actually slow things down. The purpose of optimx 
is to allow comparison of methods and discovery of improved approaches 
to a problem. Is your function computing correctly?

Assuming you've got a correct function, then spending some time to speed 
up the function (I've found FORTRAN speediest) is likely your best hope.

JN



On 15-09-17 01:55 PM, Patzelt, Edward wrote:
> R Help -
>
> I am trying to use a grid search for a 2 free parameter reinforcement
> learning model and the grid search is incredibly slow. I've used optimx but
> can't seem to get reasonable answers. Is there a way to speed up this grid
> search dramatically?
>
>
> dat <- structure(list(choice = c(0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1,
>                                   1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1,
> 0, 1, 0, 1, 0, 1, 0,
>                                   0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
> 0, 0, 1, 0, 0, 1, 1,
>                                   1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0,
> 0, 1, 0, 0, 0, 0, 1,
>                                   1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
> 1, 0, 0, 0, 0, 0, 0,
>                                   1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1,
> 1, 0, 0, 0, 0, 0, 1,
>                                   1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1,
> 1, 0, 0, 1, 1, 0, 0,
>                                   0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1,
> 0, 0, 1, 0, 0, 0, 0,
>                                   1, 0, 1, 1, 1, 0), reward = c(0L, 0L, 0L,
> 0L, 1L, 1L, 0L, 0L,
>                                                                 1L, 0L, 0L,
> 0L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L,
>                                                                 1L, 0L, 1L,
> 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 1L, 0L, 1L,
>                                                                 1L, 0L, 1L,
> 0L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 1L,
>                                                                 0L, 0L, 1L,
> 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 1L,
>                                                                 1L, 1L, 0L,
> 0L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L,
>                                                                 0L, 0L, 0L,
> 0L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 0L,
>                                                                 1L, 0L, 0L,
> 1L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L,
>                                                                 0L, 1L, 0L,
> 0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L,
>                                                                 0L, 1L, 0L,
> 1L, 1L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 0L,
>                                                                 0L, 0L, 1L,
> 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 1L), RepNum = c(1L,
>
>                                                     1L, 1L, 1L, 1L, 1L, 1L,
> 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
>
>                                                     1L, 1L, 1L, 1L, 1L, 1L,
> 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
>
>                                                     1L, 1L, 1L, 1L, 1L, 1L,
> 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
>
>                                                     1L, 2L, 2L, 2L, 2L, 2L,
> 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
>
>                                                     2L, 2L, 2L, 2L, 2L, 2L,
> 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
>
>                                                     2L, 2L, 2L, 2L, 2L, 2L,
> 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
>
>                                                     2L, 2L, 2L, 2L, 2L, 2L,
> 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
>
>                                                     2L, 2L, 3L, 3L, 3L, 3L,
> 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
>
>                                                     3L, 3L, 3L, 3L, 3L, 3L,
> 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
>
>                                                     3L, 3L, 3L, 3L, 3L, 3L,
> 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
>
>                                                     3L, 3L, 3L, 3L)), .Names
> = c("choice", "reward", "RepNum"), row.names = c(NA,
>
>
>                                                   165L), class =
> "data.frame")
>
>
> CNTRACSID <- 0; subjectFit <- 0;
> pLlist <- 0; pRlist <- 0; logLikelihood <- 0; trialProb <- 0;
>
> hmmFunc <- function(delta, temperature){
>
>    pLlist = 1
>    pRlist = 1
>    block = 0
>    for (i in 1:length(dat$choice))
>    {
>      if (dat$RepNum[i] != block)
>      {
>        pL = 0.5
>        pR = 0.5
>        block = dat$RepNum[i]
>      }
>      # Markov Transitions
>      pL <- pL*(1-delta) + pR*delta
>      pR <- 1-pL
>      # Apply feedback
>      #denom <- p(F|L,C) * p(L) + p(F|R,C) * p(R)
>
>      pflc <- ifelse(dat$choice[i] == dat$reward[i], .8, .2)
>      pfrc <- 1 - pflc
>      denom <- pflc * pL + pfrc * pR
>
>      # What's the new belief given observation
>      posteriorL <- pflc * pL/denom
>      posteriorR <- 1-posteriorL
>
>      pL <- posteriorL
>      pR <- posteriorR
>
>      pL <- (1/(1 + exp(-temperature * (pL-.5))))
>      pR <- (1/(1 + exp(-temperature * (pR-.5))))
>
>      pLlist[i] = pL
>      pRlist[i] = pR
>
>      if(i > 1){
>        if(dat$choice[i] == 1){
>          trialProb[i] <- pLlist[i-1]
>        } else
>        {
>          trialProb[i] <- 1-pLlist[i-1]
>        }
>      }
>      else {
>        trialProb[1] <- .5
>      }
>
>    }
>    trialProb2 <- sum(log(trialProb))
>    subFit <- exp(trialProb2/length(dat$choice))
>    hmmOutput <- list("logLikelihood" = trialProb2, "subjectFit" = subFit,
> "probabilities" = pLlist)
>    # print(hmmOutput$logLikelihood)
>    return(hmmOutput)
> }
>
>
> subjectFits <- 0; subLogLike <- 0; bestTemp <- 0; bestDelta= 0;
>
> min = 0.001; max = .5; inc = 0.001;
> deltaList = seq(min, max, inc)
> mina = 0; maxa = 5; inca = .01
> amList = seq(mina, maxa, inca)
>      maxLogValue <- -1000
>      for(delta in deltaList){
>        for(temp in amList){
>          probabilities <- hmmFunc(delta, temp)
>          if(probabilities$logLikelihood > maxLogValue){
>            pList <- probabilities$probabilities
>            maxLogValue <- probabilities$logLikelihood
>            subLogLike <- probabilities$logLikelihood
>            subjectFits <- probabilities$subjectFit
>            bestTemp <- temp
>            bestDelta <- delta
>
>          }
>        }
>      }
>
>
>
>



More information about the R-help mailing list