是否有一种方法来绘制函数的累进值,并对其进行优化,优化其微分演化?在下面的绘图部分中,不工作:
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)发布于 2020-09-29 08:03:31
注意:我最初回答了这个问题,认为您需要的是优化器的路径,而不是优化过程中的值。我更新了答案,以便两者都显示出来,但您可能只对第二幅图感兴趣。
differential_evolution返回的对象不包含指向结果的路径,也不包含沿途的值。但是,您可以使用callback参数来提供在每次迭代中调用的回调函数。然后,该回调可以记录进度。
例如:
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相关的任何内容。
当然,你的结果可能看上去不一样,因为我们的随机种子,以及我们通向最佳状态的道路,是不同的。
https://stackoverflow.com/questions/64101301
复制相似问题