R 通过保存以前函数调用的结果加快优化

R 通过保存以前函数调用的结果加快优化,r,performance,mathematical-optimization,R,Performance,Mathematical Optimization,在R中进行优化时,通常会使用相同的参数多次计算函数。如果功能需要很长时间,则表示效率低下 我提出了一个解决方案,通过创建一个data.frame来存储以前的函数运行,来改进这一点,但我想问是否有人有更好的解决方案,或者是否有可能将以前函数运行的结果直接提供给任何优化函数 例子 我们希望最大化IntensiveFunction,这需要花费大量时间来计算(当然不是在示例中) 创建表以存储以前函数运行的结果 ResultStore = data.table(A = c(0),B = c(0),D =

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

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

例子 我们希望最大化IntensiveFunction,这需要花费大量时间来计算(当然不是在示例中)

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

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])
}
用于检索或计算并存储函数运行的函数

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,它也会从ResultStore中进行5次求值,这意味着它对函数的求值过高(不记得以前的运行)

问题
  • 有没有人遇到过这个问题并提出了更快/更干净/更好的解决方案
  • 有没有办法将功能评估的数据框架直接提供给优化包?可以想象,访问功能评估框架可能意味着优化器不必进行某些评估

  • 你看过包裹了吗?如果您的参数是实值(非整数),那么R不太可能多次使用完全相同的参数调用。预先构建网格似乎是浪费时间,因为如果没有精确匹配,网格将不会被使用。在前5次之后,你会看到很多重复吗?我认为这可能是循环展开的副作用。我支持各种记忆选项。另一个选择是闭包,但我还没有仔细研究,以确定这在这里是否有效。感谢您建议使用memorise包-这将使代码变得更好。我同意网格不是一个好主意,但保存以前的函数调用将有助于加快某些优化,特别是像Optimx这样可以在同一个函数上执行多个过程的优化。在前五个过程之后,会有很多重复。例如,如果您按顺序运行上述代码,那么随着数据库的建立,您将在Calibration2和Calibration3中看到更多内容。