我使用import scipy
import bumpy as np
def rosen(x):
"""The Rosenbrock function"""
return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
scipy.optimize.fmin(rosen, x0, full_output=True)
来优化Rosenbrock功能:
<strong>
这将返回解决方案的元组(最小化函数的参数,函数最小值,迭代次数,函数调用次数)。
但是我希望能够在每一步绘制数值。例如,我想绘制沿x轴的迭代次数和沿y轴的运行最小值。
答案 0 :(得分:3)
fmin可以采用在每一步调用的可选回调函数,因此您可以创建一个在每一步抓取值的简单函数:
def save_step(k):
global steps
steps.append(k)
steps = []
scipy.optimize.fmin(rosen, x0, full_output=True, callback=save_step)
print np.array(steps)[:10]
输出:
[[ 1.339 0.721 0.824 1.71 1.236 ]
[ 1.339 0.721 0.824 1.71 1.236 ]
[ 1.339 0.721 0.824 1.71 1.236 ]
[ 1.339 0.721 0.824 1.71 1.236 ]
[ 1.2877696 0.7417984 0.8013696 1.587184 1.3580544 ]
[ 1.28043136 0.76687744 0.88219136 1.3994944 1.29688704]
[ 1.28043136 0.76687744 0.88219136 1.3994944 1.29688704]
[ 1.28043136 0.76687744 0.88219136 1.3994944 1.29688704]
[ 1.35935594 0.83266045 0.8240753 1.02414244 1.38852256]
[ 1.30094767 0.80530982 0.85898166 1.0331386 1.45104273]]