【发布时间】:2022-02-20 13:27:12
【问题描述】:
我有一个函数可以同时评估梯度和输出。我想针对目标函数对其进行优化。如何将目标和梯度作为列表传递给optimx?下面的例子说明了这个问题:
假设我想找到多项式x^4 - 3*x^2 + 2*x + 3 的最小非负根。它的梯度是4*x^3 - 6*x + 2。我使用optimx中的nlminb方法,如下图。
optimx(par = 100, method = "nlminb", fn = function(x) x^4 - 3*x^2 + 2*x + 3,
gr=function(x) 4*x^3 - 6*x + 2, lower = 0)
这工作正常,我得到以下输出:
p1 value fevals gevals niter convcode kkt1 kkt2 xtimes
nlminb 1 3 27 24 23 0 TRUE TRUE 0
现在假设我定义了函数fngr,它以列表的形式返回目标和梯度:
fngr <- function(x) {
fn <- x^4 - 3*x^2 + 2*x + 3
gr <- 4*x^3 - 6*x + 2
return (list(fn = fn, gr = gr))
}
我尝试拨打optimx如下:
do.call(optimx, c(list(par = 100, lower = 0, method="nlminb"), fngr))
这返回了以下错误:
Error in optimx.check(par, optcfg$ufn, optcfg$ugr, optcfg$uhess, lower, :
Function provided is not returning a scalar number
当我想将目标和梯度作为列表传递时,定义fngr 和调用optimx 的正确方法是什么?
谢谢。
【问题讨论】:
-
我不认为你可以真正摆脱分别定义 fn 和 gr (即使这在@42-的答案中被模糊了)。通常,优化子例程将独立地调用每个函数,可能使用不同的参数。您不能假设对 fn 的每次调用都可以与对 gr 的一次调用完全匹配。
-
注意,感谢您的意见。
-
晚了,但我会考虑是否值得memoizing 函数(我认为有一个
memoise包)
标签: r optimization