【问题标题】:Pythin lmfit library: How do I use the minimizer to limit the # of function callsPython lmfit 库:如何使用最小化器来限制函数调用的次数
【发布时间】:2017-12-13 19:51:06
【问题描述】:

如何使用 Minimizer 对象来最小化函数调用的次数。我从日志中得到这条消息:

函数调用过多(最大值设置为 %i)!使用:minimize(func, params, ..., maxfev=NNN) 或设置 minimumsq_kws[\'maxfev\'] 来增加这个最大值。'

from numpy import sqrt, pi, exp, loadtxt
from lmfit import  Model
from lmfit import Minimizer
import matplotlib.pyplot as plt

data = loadtxt('data/model1d_gauss.dat')
x = data[:, 0]
y = data[:, 1]

def gaussian(x, amp, cen, wid):
    "1-d gaussian: gaussian(x, amp, cen, wid)"
    return (amp/(sqrt(2*pi)*wid)) * exp(-(x-cen)**2 /(2*wid**2))


gmodel = Model(gaussian)

result = gmodel.fit(y, x=x, amp=5, cen=1, wid=1,method= 'least_squares')

print(result.fit_report())

r = result.fit_report()

plt.plot(x, y,         'bo')
plt.plot(x, result.init_fit, 'k--')
plt.plot(x, result.best_fit, 'r-')
plt.show()

lmfit documentation link

Github link

我想通过最小化函数调用来加快拟合(反正很多数据都是嘈杂的废话)

【问题讨论】:

    标签: python scipy lmfit


    【解决方案1】:

    不确定我是否会推荐这个,但由于您在内部使用 scipy 的 least_squares,您可以只传递所需的选项,例如:

    result = gmodel.fit(y, x=x, amp=5, cen=1, wid=1,method='least_squares',
                        fit_kws={'max_nfev': 100})
    

    当然这是假设 lmfit 在观察到maxiter reached 状态后会接受该状态。但从你的问题听起来,这仅被视为警告。

    请记住,此优化器基于容差标准(请参阅文档),并且在给定 x 步数的情况下不收敛时,它实际上认为它仍然可以改进最小化!

    如评论中所问:是的,您也可以更改这些标准,例如通过这样做:

    result = gmodel.fit(y, x=x, amp=5, cen=1, wid=1,method='least_squares',
                    fit_kws={'ftol': 1-07,   # default 1e-08
                             'xtol': 1-07,   #         1e-08
                             'gtol': 1-07})  #         1e-08
    

    【讨论】:

    • 您是否也可以拟合数据直到出现可接受的错误?如果是这样,那么代码 sn-p 是什么?
    • @im281 您可以使用任何参数,记录在 here。我添加了一些示例。
    猜你喜欢
    • 2018-03-14
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2018-10-20
    相关资源
    最近更新 更多