imprimir los parámetros evaluados actualmente durante la minimización de scipy

Estoy tratando de minimizar una función en Python usando scipy.optimize.minimize , para determinar cuatro parámetros distintos.

Me gustaría imprimir los parámetros evaluados actualmente en cada paso del algoritmo de optimización, para que pueda usarlos para mejorar mi estimación inicial.

¿Cómo puedo hacer esto?

Utilice el argumento de la palabra clave de callback .

scipy.optimize.minimize puede tomar una callback argumento de palabra clave. Esta debería ser una función que acepte, como entrada, el vector actual de parámetros. Esta función se llama después de cada iteración.

Por ejemplo,

 from scipy.optimize import minimize def objective_function(xs): """ Function to optimize. """ x, y = xs return (x-1)**2 + (y-2)**4 def print_callback(xs): """ Callback called after every iteration. xs is the estimated location of the optimum. """ print xs minimize(objective_function, x0 = (0., 0.), callback=print_callback) 

A menudo, uno quiere retener información entre diferentes llamadas a la callback, como, por ejemplo, el número de iteración. Una forma de hacer esto es usar un cierre:

 def generate_print_callback(): """ Generate a callback that prints iteration number | parameter values | objective function every tenth iteration. """ saved_params = { "iteration_number" : 0 } def print_callback(xs): if saved_params["iteration_number"] % 10 == 0: print "{:3} | {} | {}".format( saved_params["iteration_number"], xs, objective_function(xs)) saved_params["iteration_number"] += 1 return print_callback 

Llame a la función de minimizar con:

 minimize(objective_function, x0 = (0., 0.), callback=generate_print_callback())