在 scipy 最小化过程中打印当前评估的参数

swe*_*eet 4 python parameters minimization scipy

我正在尝试使用 , 来最小化 Python 中的函数scipy.optimize.minimize,以确定四个不同的参数。

我想在优化算法的每一步打印当前评估的参数,这样我就可以使用它们来使我的初始猜测更好。

我怎样才能做到这一点?

Pas*_*ion 5

使用callback关键字参数。

scipy.optimize.minimize可以采用关键字参数callback。这应该是一个接受当前参数向量作为输入的函数。每次迭代后都会调用该函数。

例如,

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)
Run Code Online (Sandbox Code Playgroud)

通常,人们希望保留不同回调调用之间的信息,例如迭代次数。一种方法是使用闭包:

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
Run Code Online (Sandbox Code Playgroud)

使用以下命令调用最小化函数:

minimize(objective_function, x0 = (0., 0.), callback=generate_print_callback())
Run Code Online (Sandbox Code Playgroud)