Python lmfit 库:如何使用最小化器来限制函数调用的数量
Pythin lmfit library: How do I use the minimizer to limit the # of function calls
如何使用 Minimizer 对象来最小化函数调用的数量。我从日志中收到此消息:
函数调用太多(最大设置为 %i)!使用: minimize(func, params, ..., maxfev=NNN) 或设置 leastsq_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()
我想通过最小化函数调用来加快拟合速度(无论如何,很多数据都是嘈杂的废话)
不确定我是否会推荐这个,但由于您在内部使用 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
如何使用 Minimizer 对象来最小化函数调用的数量。我从日志中收到此消息:
函数调用太多(最大设置为 %i)!使用: minimize(func, params, ..., maxfev=NNN) 或设置 leastsq_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()
我想通过最小化函数调用来加快拟合速度(无论如何,很多数据都是嘈杂的废话)
不确定我是否会推荐这个,但由于您在内部使用 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