如何绘制优化进度?

How to plot the progress of an optimization?

有没有办法绘制出用scipy.optimize的微分进化优化的函数的累进值?在下面的绘图部分不起作用:

from scipy.optimize import rosen, differential_evolution
bounds = [(0, 5), (0, 5), (0, 5), (0, 5), (0, 5)]
result = differential_evolution(rosen, bounds, disp=False)
print(result.x, result.fun)
import matplotlib.pyplot as plt
x, f = zip(*result)
plt.plot(x, f)

注意:我最初回答这个问题时认为您想要优化器采用的 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), (0, 5), (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,1,2)
ax.plot(progress_val)
plt.show()

我明白了

价值,也就是我刚刚意识到你实际上问的是底部情节。如果您不需要路径本身,请忽略代码中与 progress.

有关的任何内容

当然,您的结果可能看起来不同,因为我们的随机种子不同,因此我们通往最佳路径的路径也不同。