I use scipy.optimize to minimize a function of 12 arguments.
I started the optimization a while ago and still waiting for results.
Is there a way to force scipy.optimize to display its progress (like how much is already done, what are the current best point)?
Speed up your objective function. Reduce the number of design variables. Choose a better initial guess. Use parallel processing.
SciPy optimize provides functions for minimizing (or maximizing) objective functions, possibly subject to constraints. It includes solvers for nonlinear problems (with support for both local and global optimization algorithms), linear programing, constrained and nonlinear least-squares, root finding, and curve fitting.
jac : bool or callable, optional Jacobian (gradient) of objective function. Only for CG, BFGS, Newton-CG, L-BFGS-B, TNC, SLSQP, dogleg, trust-ncg. If jac is a Boolean and is True, fun is assumed to return the gradient along with the objective function. If False, the gradient will be estimated numerically.
As mg007 suggested, some of the scipy.optimize routines allow for a callback function (unfortunately leastsq does not permit this at the moment). Below is an example using the "fmin_bfgs" routine where I use a callback function to display the current value of the arguments and the value of the objective function at each iteration.
import numpy as np from scipy.optimize import fmin_bfgs  Nfeval = 1  def rosen(X): #Rosenbrock function     return (1.0 - X[0])**2 + 100.0 * (X[1] - X[0]**2)**2 + \            (1.0 - X[1])**2 + 100.0 * (X[2] - X[1]**2)**2  def callbackF(Xi):     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], rosen(Xi))     Nfeval += 1  print  '{0:4s}   {1:9s}   {2:9s}   {3:9s}   {4:9s}'.format('Iter', ' X1', ' X2', ' X3', 'f(X)')    x0 = np.array([1.1, 1.1, 1.1], dtype=np.double) [xopt, fopt, gopt, Bopt, func_calls, grad_calls, warnflg] = \     fmin_bfgs(rosen,                x0,                callback=callbackF,                maxiter=2000,                full_output=True,                retall=False)   The output looks like this:
Iter    X1          X2          X3         f(X)          1    1.031582    1.062553    1.130971    0.005550    2    1.031100    1.063194    1.130732    0.004973    3    1.027805    1.055917    1.114717    0.003927    4    1.020343    1.040319    1.081299    0.002193    5    1.005098    1.009236    1.016252    0.000739    6    1.004867    1.009274    1.017836    0.000197    7    1.001201    1.002372    1.004708    0.000007    8    1.000124    1.000249    1.000483    0.000000    9    0.999999    0.999999    0.999998    0.000000   10    0.999997    0.999995    0.999989    0.000000   11    0.999997    0.999995    0.999989    0.000000 Optimization terminated successfully.          Current function value: 0.000000          Iterations: 11          Function evaluations: 85          Gradient evaluations: 17   At least this way you can watch as the optimizer tracks the minimum
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With