我的功能:
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})
答案 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。
编辑:根据以下评论,这实际上是一个错误并已修复。