使用 lmfit.minimize 时在每次迭代中获取目标函数值

问题描述 投票:0回答:1

我正在尝试使用 lmfit.minimize 来最小化目标函数(这是误差平方和)。我可以使用

lmfit.minimize(function,params,args)  
来执行此操作,它会返回一个具有拟合统计信息的 Minimizer 对象。但是,我想看看目标函数值在每次迭代中如何变化。 我可以在每次迭代中打印值或使用迭代回调函数绘制各个残差值,但我想将目标函数的值作为数组获取,以便稍后使用/绘制。 怎么办?

我正在尝试得到这样的东西:

enter image description here

python minimize lmfit
1个回答
0
投票

以下是您可以使用迭代回调函数执行的操作(使用 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

© www.soinside.com 2019 - 2024. All rights reserved.