我正在尝试使用 lmfit.minimize 来最小化目标函数(这是误差平方和)。我可以使用
lmfit.minimize(function,params,args)
来执行此操作,它会返回一个具有拟合统计信息的 Minimizer 对象。但是,我想看看目标函数值在每次迭代中如何变化。
我可以在每次迭代中打印值或使用迭代回调函数绘制各个残差值,但我想将目标函数的值作为数组获取,以便稍后使用/绘制。
怎么办?
我正在尝试得到这样的东西:
以下是您可以使用迭代回调函数执行的操作(使用 lmfit 主页中的示例):
from lmfit import minimize, Parameters
import numpy as np
def myfunc(x, amp, phase, freq, decay):
return amp * np.sin(x*freq + phase) * np.exp(-x*x*decay)
def residual(params, x, data, uncertainty, *args, **kws):
"""Model a decaying sine wave and subtract data."""
model = myfunc(x, params['amp'], params['phase'], params['freq'], params['decay'])
return (data-model) / uncertainty
x = np.linspace(0, 100)
noise = np.random.normal(size=x.size, scale=0.2)
data = myfunc(x, 7.5, 2.5, 0.22, 0.01) + noise
# generate experimental uncertainties
uncertainty = np.abs(0.16 + np.random.normal(size=x.size, scale=0.05))
def callback(params, iter, resid, *args, **kws):
itervalues = kws['itervalues']
itervalues.append((resid**2).sum())
params = Parameters()
params.add('amp', value=10)
params.add('decay', value=0.007)
params.add('phase', value=0.2)
params.add('freq', value=3.0)
itervalues = []
result = minimize(residual, params, args=(x, data, uncertainty), iter_cb=callback, kws={'itervalues': itervalues})
和
itervalues
将按渐进顺序提供您要查找的值。 (当算法尝试不同的方向时,一开始的数字通常会很高。)
这利用了 Python 列表的可变性,因为这是
callback
可以更改 itervalues
的唯一方式;它的返回值用于不同的用途,因此不能用于更改itervalues
。