问题描述
在我的优化过程中,scipy 经常找不到解决方案而只是返回我最初的猜测。我宁愿使用迄今为止发现的最佳值,而不是我最初的猜测。
> results = optimize.minimize(optimize_me,x0,method='BFGS',jac=True)
> results.success
False
> results.x == x0
True
像这样optimize_me(x0) == results.fun
。但我更希望 optimize_me(results.x)
/results.fun
是找到的最低值,即使没有找到解决方案也是如此。
解决方法
这是一个带有 callback
func = lambda x: np.cos(14.5 * x - 0.3) + (x + 0.2) * x
x0=[1.]
def print_fun(x):
print("Current value: {}".format(x))
minimize (func,x0,method = 'BFGS',callback=print_fun)
这会将每次迭代的当前值打印为:
Current value: [1.05820172]
Current value: [1.09236336]
Current value: [1.09262207]
Current value: [1.09260106]
fun: 0.4259196810917082
hess_inv: array([[0.00477712]])
jac: array([-1.2665987e-06])
message: 'Optimization terminated successfully.'
nfev: 16
nit: 4
njev: 8
status: 0
success: True
x: array([1.09260106])
您可以根据自己的喜好修改打印功能。然而,并不是所有的优化例程都支持回调。