理解R中optim()的maxit参数

Flo*_*ian 5 optimization r mathematical-optimization

在接下来的调用中,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 
Run Code Online (Sandbox Code Playgroud)

为什么是这样?这是一个错误吗?或者为什么要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 
Run Code Online (Sandbox Code Playgroud)

(经R版3.5.0测试.)

Ben*_*ker 5

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

\n\n
    \n
  • 使用什么算法(例如 Nelder-Mead vs BFGS vs....)
  • \n
  • 一个迭代步骤如何工作\n\n
      \n
    • 例如,对于Nelder-Mead 来说,迭代包括(1) 反射;(2) [也许] 扩张;(3) [也许]收缩;(4) [可能] 收缩;总是有一个评估(反思),但其他步骤取决于第一个子步骤中发生的情况
    • \n
    • 因为L-BFGS-B我认为涉及线搜索......
    • \n
  • \n
  • 是否需要通过有限差分计算导数
  • \n
\n\n

就其价值而言,nlminb允许单独控制最大迭代和最大评估:

\n\n
\n

\xe2\x80\x98eval.max\xe2\x80\x99允许的目标函数评估的最大次数。默认为 200。
\n \xe2\x80\x98iter.max\xe2\x80\x99允许的最大迭代次数。默认为 150。

\n
\n

  • Byrd 等人的技术报告中给出了“L-BFGS-B”一次迭代所涉及的步骤列表。1995 年,第 17 页:http://users.iems.northwestern.edu/~nocedal/PDFfiles/limited.pdf (2认同)