R优化 - 将目标和梯度函数参数作为列表传递

时间:2016-03-16 21:07:49

标签: r optimization

我有一个同时评估渐变和输出的函数。我想针对目标函数进行优化。如何将目标和渐变作为列表传递给optimx?以下示例说明了问题:

假设我想找到多项式x^4 - 3*x^2 + 2*x + 3的最小非负根。其梯度为4*x^3 - 6*x + 2。我在nlminb中使用optimx方法,如下所示。

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的正确方法是什么?

感谢。

1 个答案:

答案 0 :(得分:1)

定义一个无参数函数,它可以提供两个函数......当被调用时:

> fngr <- function() {
+   fn <- function(x) {x^4 - 3*x^2 + 2*x + 3}
+   gr <- function(x) {4*x^3 - 6*x + 2}
+   return (list(fn = fn, gr = gr))
+ }
> do.call(optimx, c(list(par = 100, lower = 0, method="nlminb"), fngr() ))
                                    notice the need to call it ------^^
       p1 value fevals gevals niter convcode kkt1 kkt2 xtimes
nlminb  1     3     27     24    23        0 TRUE TRUE  0.002