如何绘制优化进度?

问题描述

有没有一种方法可以绘制使用scipy.optimize的差分演化进行优化的函数的累进值?在下面的绘图部分不起作用:

{{1}}

解决方法

注意:我最初回答这个问题是因为您希望优化器采用 path ,而不是优化过程中的值。我已经更新了答案,使它可以同时显示两个答案,但是您可能只对第二个图感兴趣。

differential_evolution返回的对象不包含指向结果的路径,也不包含沿途的值。但是,您可以使用callback参数来提供callback function,该变量在每次迭代中都会被调用。然后,该回调可以记录进度。

例如:

progress = []
progress_err = []

def cb(x,convergence):
    progress.append(x)
    progress_val.append(rosen(x))

bounds = [(0,5),(0,5)]
result = differential_evolution(rosen,bounds,disp=False,callback=cb)

progress = np.array(progress)
progress_val = np.array(progress_val)

由于您似乎想优化5D Rosenbrock功能,因此整个路径的可视化变得有些棘手。如果我仅选择可视化前两个坐标(+值,这就是您实际上要问的),即

fig = plt.figure()
ax = fig.add_subplot(2,1,1)
ax.plot(progress[:,0],progress[:,1])
ax = fig.add_subplot(2,2)
ax.plot(progress_val)
plt.show()

我明白了

A path and value during optimization

该值(我刚刚意识到您实际上要问的是底部图)。如果您不需要路径本身,请忽略与progress有关的代码中的任何内容。

当然,您的结果看起来可能会有所不同,因为我们的随机种子以及因此我们通往最佳状态的途径是不同的。