在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次评估,这意味着它过度评估了函数(不记得以前的运行)。