"类型错误:"复合模型"对象不可调用"时尝试拟合复合模型



我目前正在使用lmfit来分析一些光谱数据,特别是试图拟合一个由高斯和线性模型组成的复合模型,多次(现在有4次,将来可能需要拟合更多(,但我一直得到上述错误。这是我当前的代码:

gausmodel = GaussianModel()
linemodel = LinearModel()
params = linemodel.make_params(intercept=40, slope=0)
params += gausmodel.make_params(cen=100, sigma=10, amplitude=100)
model = gausmodel + linemodel
x = pd.DataFrame(np.arange(0, 351), columns=['Pixel Position'])
df = pd.concat([x, intens], axis=1)
# Create models for fitting
peak1 = model(prefix='p1_')
peak2 = model(prefix='p2_')
peak3 = model(prefix='p3_')
peak4 = model(prefix='p4_')
# Set hints for start parameters
params = peak1.make_params()
params['p1_cen'].set(value=80, min=70, max=100)
params['p1_sigma'].set(value=10, min=5, max=20)
params['p1_amplitude'].set(value=80, min=50, max=100000)
params['p1_intercept'].set(value=40, min=30, max=55)
params['p1_slope'].set(value=1, min=0.00001, max=5)
params.update(peak2.make_params())
params['p2_center'].set(value=150, min=140, max=160)
params['p2_sigma'].set(value=10, min=5, max=20)
params['p2_amplitude'].set(value=80, min=50, max=100000)
params['p2_intercept'].set(value=40, min=30, max=55)
params['p2_slope'].set(value=1, min=0.00001, max=5)
params.update(peak3.make_params())
params['p3_center'].set(value=200, min=180, max=220)
params['p3_sigma'].set(value=10, min=5, max=20)
params['p3_amplitude'].set(value=100, min=50, max=100000)
params['p3_intercept'].set(value=40, min=30, max=55)
params['p3_slope'].set(value=1, min=0.00001, max=5)
params.update(peak4.make_params())
params['p4_center'].set(value=250, min=230, max=300)
params['p4_sigma'].set(value=10, min=5, max=20)
params['p4_amplitude'].set(value=100, min=50, max=100000)
params['p4_intercept'].set(value=40, min=30, max=55)
params['p4_slope'].set(value=1, min=0.00001, max=5)
# Define peak model
fit_model = peak1 + peak2 + peak3
# Start fitting
init = fit_model.eval(params, x=df)
result = fit_model.fit(df['Intensity'], params, x=df['Pixel Position'])
print(result.fit_report())

实际上,我希望继续使用lmfit而不是scipy,因为lmfit返回了我需要的许多有用的统计信息,尤其是减少的卡方。

我的数据帧仅由两列组成,一列具有像素位置,另一列具有强度,其中有4个峰值。

非常感谢!

我认为您混淆了什么是模型类,什么是模型实例。此外,您不需要多行-两行加起来就是一行。

我建议使用更像的东西

from lmfit.models import GaussianModel, LinearModel
peak1 = GaussianModel(prefix='p1_')
peak2 = GaussianModel(prefix='p2_')
peak3 = GaussianModel(prefix='p3_')
peak4 = GaussianModel(prefix='p4_')
model = peak1 + peak2 + peak3 + peak4 + LinearModel()
params = model.make_params(intercept=40, slope=0) 
params['p1_center'].set(value=80, min=70, max=100)
params['p1_sigma'].set(value=10, min=0)
params['p1_amplitude'].set(value=80, min=0)
params['p2_center'].set(value=150, min=140, max=160)
params['p2_sigma'].set(value=10, min=0)
params['p2_amplitude'].set(value=80, min=0)
params['p3_center'].set(value=200, min=180, max=220)
params['p3_sigma'].set(value=10, min=0)
params['p3_amplitude'].set(value=100, min=0)
params['p4_center'].set(value=250, min=230, max=300)
params['p4_sigma'].set(value=10, min=0)
params['p4_amplitude'].set(value=100, min=0)

此外,在这里将numpy数组转换为数据帧并没有多大意义——lmfit只会将它们改回数组。

x = p.arange(0, 351)
init = model.eval(params, x=x)

最新更新