如何绘制优化进度?
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
.
有关的任何内容
当然,您的结果可能看起来不同,因为我们的随机种子不同,因此我们通往最佳路径的路径也不同。
有没有办法绘制出用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
.
当然,您的结果可能看起来不同,因为我们的随机种子不同,因此我们通往最佳路径的路径也不同。