gpt4 book ai didi

python - 将 lmfit 中的模型类与参数类结合使用

转载 作者:太空宇宙 更新时间:2023-11-03 20:39:06 26 4
gpt4 key购买 nike

我正在尝试使用 lmfit 拟合一些数据。最初,我使用了 Model 类,它基于此示例/教程运行良好: https://lmfit.github.io/lmfit-py/model.html但后来我想向模型添加一些参数约束,因此我查看了本教程: https://lmfit.github.io/lmfit-py/parameters.html

但是,我在组合这两个类以使它们能够很好地协同工作时遇到了一些问题。它要么提示拟合函数缺少参数或获取无效参数(这就是我将发布的示例中的情况),要么我得到一个实际上不采用我指定的参数的模型。我实际上可以使用以下不同方法之一来解决问题:1.使用model.make_params(...)传递参数,但我想将它们单独拆分2.我可以使用 Minimizer 而不是 Model,但我想了解为什么它们的实现如此不同,尽管我希望它们非常相似(除了它们适用于不同类型的输入)

任何帮助/解释将不胜感激。 :)

此代码基于参数教程页面上的示例。我在这里所做的是修改示例,以便使用 Model 类而不是 Minimizer 类,原则上应该可以工作,但我不知何故以错误的方式进行了操作。作为比较,原始示例在这里(滚动到底部): https://lmfit.github.io/lmfit-py/parameters.html

# <examples/doc_parameters_basic.py>
import numpy as np

from lmfit import Model, Parameters

# create data to be fitted
x = np.linspace(0, 15, 301)
data = (5. * np.sin(2*x - 0.1) * np.exp(-x*x*0.025) +
np.random.normal(size=len(x), scale=0.2))


# define objective function: returns the array to be minimized
def fcn2min(params, x):
"""Model a decaying sine wave and subtract data."""
amp = params['amp']
shift = params['shift']
omega = params['omega']
decay = params['decay']
model = amp * np.sin(x*omega + shift) * np.exp(-x*x*decay)
return model


# create a set of Parameters
params = Parameters()
params.add('amp', value=10, min=0)
params.add('decay', value=0.1)
params.add('shift', value=0.0, min=-np.pi/2., max=np.pi/2)
params.add('omega', value=3.0)

# do fit, here with leastsq model
fitmodel = Model(fcn2min)
result = fitmodel.fit(data, params, x=x)

# calculate final result
final = result.fit_report()

# try to plot results
try:
import matplotlib.pyplot as plt
plt.plot(x, data, 'k+')
plt.plot(x, final, 'r')
plt.show()
except ImportError:
pass
# <end of examples/doc_parameters_basic.py>

但是像这样使用它,我收到错误

ValueError: Invalid independent variable name ('params') for function fcn2min

我尝试过:将所有参数指定为函数参数,例如

def fcn2min(x, amp, shift, omega, decay):

但在这种情况下,我最终发现模型/函数参数没有连接,并且我得到了一个不执行任何操作的“fit”。

现在我尝试了诸如指定之类的东西:

fitmodel = Model(fcn2min, independent_vars=['x'], param_names=params)

但在这种情况下我得到

Invalid parameter name ('amp') for function fcn2min

还尝试过这样的事情:

params = fitmodel.make_params()
params.add('amp', value=10, min=0)
...

但在这种情况下,我也没有获得连接到模型的参数,这可以从

的输出中看到
fitmodel.param_names

返回一个空列表。

最佳答案

您混淆了 Model 包装的模型函数用于曲线拟合的类,具有通用最小化目标函数 minimizeleastsq 。目标函数将具有如下签名:

 def objective(params, *args): 

哪里paramslmfit.Parameters您必须在函数中解压的实例和 *args是可选参数。该函数将返回数组(目标),该数组将在最小二乘意义上最小化。

相比之下,用于创建曲线拟合模型的模型函数将具有如下签名

 def modelfunc(x, par1, par2, par3, ..., **kws):

哪里x是自变量且 par1 ...将包含模型参数的。模型函数将返回一个对数据建模的数组。

有很多使用目标函数和模型函数的例子 https://github.com/lmfit/lmfit-py/tree/master/examples 。要对数据进行建模,您需要这样做

# define MODEL **not objective** function: returns the array to model the data
def sinedecay(x, amp, shift, omega, decay):
"""Model a decaying sine wave""" .
return amp * np.sin(x*omega + shift) * np.exp(-x*x*decay)


# create model:
smodel = Model(sinedecay)

# create a set of Parameters
params = smodel.make_params(amp=10, decay=0.1, shift=0, omega=3)
params.set('amp', min=0)
params.set('shift', min=-np.pi/2., max=np.pi/2)

# do fit
result = smodel.fit(data, params, x=x)

关于python - 将 lmfit 中的模型类与参数类结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56970958/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com