在下面对optim()的调用中,我期望对fn()进行一次评估,对gr()进行一次评估,因为maxit=1。但是,fn()gr()分别评估7次。

optim(par=1000, fn=function(x) x^2, gr=function(x) 2*x,
      method="L-BFGS-B", control=list(maxit=1))$counts
function gradient
       7        7

为什么是这样?是 bug 吗?还是为什么optim()对一次迭代进行7次评估?

更详细的输出:
optim(par=1000,
      fn=function(x) { cat("f(", x, ")", sep="", fill=TRUE); x^2 },
      gr=function(x) { cat("g(", x, ")", sep="", fill=TRUE); 2*x },
      method="L-BFGS-B", control=list(maxit=1))$counts
f(1000)
g(1000)
f(999)
g(999)
f(995)
g(995)
f(979)
g(979)
f(915)
g(915)
f(659)
g(659)
f(1.136868e-13)
g(1.136868e-13)
function gradient
       7        7

(在R版本3.5.0中进行了测试。)

最佳答案

迭代是优化算法的一次迭代。 函数评估是对目标函数的单次调用。每次迭代需要多少个函数求值取决于:

  • 正在使用什么算法(例如Nelder-Mead与BFGS与...)
  • 一个迭代步骤如何工作
  • 例如对于Nelder-Mead an iteration comprises(1)反射; (2)[也许]扩展; (3)[也许]收缩; (4)[也许]收缩;总会有一个评估(反射),但其他步骤取决于第一步子步骤
  • 中发生的情况
  • for L-BFGS-B我认为涉及行搜索...
  • 是否需要通过有限差分计算导数

  • 值得一提的是,nlminb允许单独控制最大迭代次数和最大评估次数:

    关于r - 了解R中optim()的maxit参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53640574/

    10-11 11:14