scipy.optimize.fmin_l_bfgs_b的`funcalls`输出不可靠?

时间:2014-01-06 13:50:45

标签: python optimization scipy

我的功能:

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})

1 个答案:

答案 0 :(得分:3)

从代码中可以看出,在计算函数和渐变时,会计算函数求值的数量,但不计算近似渐变所需的函数调用次数。

在我的lbfgsb.py版本中:

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

我建议您report this as a bug

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