通过保存先前函数调用的结果来加速优化

时间:2014-06-16 00:36:57

标签: r performance mathematical-optimization

在R中进行优化时,通常会使用相同的参数多次评估函数。如果函数需要很长时间,则表示效率低下。

我提出了一个解决方案,通过创建一个data.frame来存储以前的函数运行来改进这个,但是想问一下是否有人有更好的解决方案,或者是否有可能将以前函数运行的结果直接提供给任何优化功能

实施例

我们想要最大化IntensiveFunction,这需要很多时间来计算(当然不是在例子中)

library(data.table)
library(bbmle)
library(optimx)

IntensiveFunction = function(a,b,d,e){
  (a-1)^2 + (b-2)^2 + (d-3)^2 +(e-4)^2
}

创建表以存储先前函数运行的结果

ResultStore = data.table(A = c(0),B = c(0),D = c(0),E = c(0),Result = c(IntensiveFunction(0,0,0,0)), key = "A,B,D,E")

检索或计算&存储功能运行

ToOptimise = function(a,b,d,e){
  if(is.na(ResultStore[J(a,b,d,e), "Result", with = FALSE][[1]]) == FALSE){
      cat("Got Value from Result Store", "\n")
      return(ResultStore[J(a,b,d,e), "Result", with = FALSE][[1]])
  } else {
      cat("Calculating", "\n")
      result = IntensiveFunction(a,b,d,e)
      ResultStore <<- data.table(rbind(ResultStore, data.frame("A" = a,"B" = b,"D" = d,"E" = e,"Result" = result), use.names=TRUE ), key = "A,B,D,E")
      return(result)
  }
}

ToOptimiseForOptimX = function(Theta){
  ToOptimise(Theta[1],Theta[2],Theta[3],Theta[4])
}

的优化

Calibration1 = mle2(ToOptimise, 
                   start = list(a = 1, d = 10),
                   fixed = list(b = 6, e = 10))

Calibration2 = mle2(ToOptimise, 
                   start = list(a = 1, b = 6, d = 10, e = 14))


Calibration3 = optimx(par = c(1,1,1,1),
                      fn = ToOptimiseForOptimX,
                      control = list(all.methods = TRUE))

当你运行它时,你可以注意到的一点是,即使你第一次运行Calibration1,它也需要从ResultStore进行5次评估,这意味着它过度评估了函数(不记得以前的运行)。

问题

  1. 有没有人遇到过这个问题,并提出了更快/更清洁/更好的解决方案?
  2. 有没有办法将函数评估的data.frame直接提供给优化包?可以想象,访问功能评估框架可能意味着优化器可能不必进行一些评估。

0 个答案:

没有答案