【问题标题】:`funcalls` output from scipy.optimize.fmin_l_bfgs_b unreliable?scipy.optimize.fmin_l_bfgs_b 的“funcalls”输出不可靠?
【发布时间】:2014-01-08 20:03:29
【问题描述】:

我的功能:

count = 0
def fake(x):
    global count
    print count
    count += 1
    return x ** 4 + 10 * x ** 3 + 4 * x ** 2 + 7 * x + 1

“Nelder-Mead”方法,给了我正确数量的函数调用。

scipy.optimize.fmin(fake, [1])

0
1
...

45
Optimization terminated successfully.
         Current function value: -887.470826
         Iterations: 23
         Function evaluations: 46
Out[377]:
array([-7.25761719])

BFGS 方法,给我正确的函数调用次数。

scipy.optimize.fmin_bfgs(fake, [1])
0
1
...
61
62
Optimization terminated successfully.
         Current function value: -887.470826
         Iterations: 6
         Function evaluations: 63
         Gradient evaluations: 21
Out[380]:
array([-7.25765231])

但是,L-BFGS-B 给了我奇怪数量的函数调用。发生了什么?

scipy.optimize.fmin_l_bfgs_b(fake, [1], approx_grad=True)
0
1
...
43
44
Out[374]:
(array([-7.25765246]),
 array([-887.47082639]),
 {'funcalls': 15,
  'grad': array([ -3.41060513e-05]),
  'nit': 6,
  'task': 'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH',
  'warnflag': 0})

【问题讨论】:

    标签: python optimization scipy


    【解决方案1】:

    从代码来看,函数和梯度计算时似乎计算了函数计算的次数,但没有计算逼近梯度所需的函数调用次数。

    在我的lbfgsb.py 版本中:

    197             n_function_evals += 1
    198             # Overwrite f and g:
    199             f, g = func_and_grad(x)
    

    我推荐你report this as a bug

    编辑:根据下面的评论,这实际上是一个错误并已修复。

    【讨论】:

      猜你喜欢
      • 2021-02-09
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 2012-07-07
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多