python - 如何绘制优化的进度?

标签 python matplotlib scipy scipy-optimize

有没有办法绘制使用 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)

最佳答案

注意:我最初回答这个问题时认为您想要优化器采用的路径,而不是优化过程中的值。我已经更新了答案,以便同时显示两者,但您可能只对第二个情节感兴趣。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
值(value),这就是我刚刚意识到你实际上要问的,是底部的情节。如果您不需要路径本身,请忽略代码中与 progress 相关的任何内容。 .
当然,您的结果可能看起来不同,因为我们的随机种子以及我们通往最佳状态的路径不同。

关于python - 如何绘制优化的进度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64101301/

相关文章:

python - Python 3.6+ 中的格式化字符串文字

python - 序列化和反序列化 Django 枚举字段以接受数字和文本表示

python - 在 png 上绘制 matplotlib 散点图

python matplotlib 在 x 轴上设置年份

python - 如何用scipy优化n个点的位置?

Numpy 和 Biopython 必须集成吗?

python - 如何在Python中加载Matlab的结构体(用v7.3保存)

javascript - 如何将 Django 模板中的内容替换为其他内容?

python - 为什么当我将鼠标悬停在 imshow 上时不显示像素值?

php - 如何更新 Excel 数据? (刷新所有查询)