scipy.optimize.minimize跟踪目标函数

问题描述 投票:1回答:1

我与scipy.optimize.minimize工作,而我优化3个参数有这样的功能

def foo(A, x, y, z):
    test = my_function(A[0], A[1], A[2], x, y, z)
    return test

在这个答案,我发现了一些见解:How to display progress of scipy.optimize function?所以我想出了这个功能:

def callbackF(Xi, x, y, z)
    global Nfeval
    print '{0:4d}   {1: 3.6f}   {2: 3.6f}   {3: 3.6f}   {4: 3.6f}'.format(Nfeval, Xi[0], Xi[1], Xi[2], foo(Xi, x, y, z))
    Nfeval += 1

所以,我的代码看起来像这样

Optimal = minimize(fun=foo, x0=[fi, alfa, Ks], args=(x, y, z), 
                   method='BFGS', callback=callbackF, tol=1e-2)

但我得到这个错误:

TypeError: callbackF() takes exactly 4 arguments (1 given)

我理解的错误,但我应该怎么避免呢?

python scipy mathematical-optimization minimize
1个回答
1
投票

如果你能仪器本身的功能,您可以随时DIY吧。唯一棘手位是迭代次数。对于它,你可以使用一个全球性的,或(IMO,更好)附加反函数本身:

>>> import numpy as np
>>> from scipy.optimize import minimize
>>> 
>>> def f(x):
...     res = np.sum(x**2)
...     f.count += 1
...     print('x = ', x, ' res = ', res, '  j = ', f.count)
...     return res
... 
>>> f.count = 0
>>> minimize(f, x0=5)
x =  [ 5.]  res =  25.0   j =  1
x =  [ 5.00000001]  res =  25.000000149   j =  2
x =  [ 5.]  res =  25.0   j =  3
x =  [-5.]  res =  25.0   j =  4
x =  [-5.]  res =  25.0   j =  5
x =  [-4.99999999]  res =  24.999999851   j =  6
x =  [ 0.0005]  res =  2.5e-07   j =  7
x =  [ 0.0005]  res =  2.5e-07   j =  8
x =  [ 0.00050001]  res =  2.50014901383e-07   j =  9
x =  [ -7.45132485e-09]  res =  5.55222420558e-17   j =  10
x =  [ -7.45132485e-09]  res =  5.55222420558e-17   j =  11
x =  [  7.44983634e-09]  res =  5.55000615146e-17   j =  12
      fun: 5.552224205575604e-17
 hess_inv: array([[ 0.5]])
      jac: array([ -1.48851092e-12])
  message: 'Optimization terminated successfully.'
     nfev: 12
      nit: 2
     njev: 4
   status: 0
  success: True
        x: array([ -7.45132485e-09])
© www.soinside.com 2019 - 2024. All rights reserved.