当找不到解决方案时,如何返回对 scipy 最小化的最佳猜测?

问题描述

在我的优化过程中,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])

您可以根据自己的喜好修改打印功能。然而,并不是所有的优化例程都支持回调。