如何绘制优化的进度?

2024-06-09 20:39:24 发布

您现在位置:Python中文网/ 问答频道 /正文

是否有一种方法可以绘制正在使用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)

Tags: 方法函数fromimport绘制情况plt差分
1条回答
网友
1楼 · 发布于 2024-06-09 20:39:24

注意:我最初回答这个问题时认为您想要优化器采用的路径,而不是优化过程中的值。我已经更新了答案,让它同时显示了这两个,但你可能只对第二个情节感兴趣

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()

我明白了

A path and value during optimization

这个值,就是我刚刚意识到你实际上在问的,是底部的情节。如果不需要路径本身,请忽略代码中与progress有关的任何内容

当然,您的结果可能看起来有所不同,因为我们的随机种子,因此我们走向最佳的路径,是不同的

相关问题 更多 >