使用 lmfit 模型最适合多峰数据
Using lmfit model to best fit the multiple peaks data
import matplotlib.pyplot as plt
import numpy as np
from lmfit import Model
x=np.array([4698.031, 4698.027, 4698.024, 4698.021, 4698.017, 4698.014,4698.011, 4698.007, 4698.004, 4698.001, 4697.997, 4697.994, 4697.991, 4697.987, 4697.984, 4697.981, 4697.977, 4697.974, 4697.971, 4697.967, 4697.964, 4697.961, 4697.957, 4697.954, 4697.951, 4697.947, 4697.944, 4697.941, 4697.937, 4697.934, 4697.931, 4697.927, 4697.924, 4697.921, 4697.917])
y=np.array([0.56565, 0.586575, 0.70335, 0.991245, 1.447545, 4.944375, 11.97281, 18.22095, 19.7613, 17.13792, 13.35083, 10.26506, 7.898505, 5.084775, 2.4192, 1.34358, 0.829905, 1.31322, 3.2049, 4.0095, 2.83263, 1.51605, 0.643275, 0.48972, 0.432675, 0.084375, 0.135345, 0.362145, 0.34425, 0.307125, 0.469125, 0.297, 0.183255, 0.528855, 0.523125])
gmodel = Model(gaussian, prefix='p1_') + Model(gaussian, prefix='p2_')
params = gmodel.make_params(p1_amp=0.1, p1_cen=4697.97, p1_wid=0.005, p2_amp=0.5, p2_cen=4698.00, p2_wid=0.005)
params['p1_cen'].min = x.min()
params['p1_cen'].max = 4697.98
params['p2_cen'].min = 4697.98
params['p2_cen'].max = x.max()
result = gmodel.fit(y, params, x=x)
更新程序
几个问题
- 当我 运行 程序时,它给我一个错误。
追溯(最近一次通话最后一次):
文件“”,第 7 行,位于
gmodel =模型(高斯,前缀='p1_')+模型(高斯,前缀='p2_')
NameError: 名称 'gaussian' 未定义
我为此添加了 from lmfit.lineshapes import gaussian
并且它有效。
是对还是错??
- 添加 library/package 程序后说
追溯(最近一次通话最后一次):
文件“”,第 9 行,位于
参数['p1_'].min = x.min()
按键错误:'p1_cen'
帮我解决这个问题。
- 删除
params
程序后 运行s 没有任何错误,但我该怎么做才能显示我的 给定数据 的图表最适合数据。我刚刚为我的给定数据做了 plt.plot(x,y)
,但不知道如何为我的最佳数据做......
你需要给出更好的起始猜测。您的数据 x
范围从 4697.8 到 4698.0,但您对 cen
的初始猜测是 1.0,远远超出了您的数据范围。将初始值更改为对您的数据更合理的值。
更新以解决如何拟合 2 个峰的问题:
要拟合 2 个峰,您可以创建一个复合模型,如
gmodel = Model(gaussian, prefix='p1_') + Model(gaussian, prefix='p2_')
result = gmodel.fit(y, x=x, p1_amp=0.1, p1_cen=4697.97, p1_wid=0.005,
p2_amp=0.5, p2_cen=4698.00, p2_wid=0.005)
这将创建一个将 2 个高斯相加的模型,并为一个模型的参数名称提供前缀 p1_
,为另一个模型的参数提供前缀 p2_
。然后,您可以在进行拟合时为其中的每一个提供初始值。
一般建议为每个模型创建一个lmfit.Parameters
的实例,因为这允许您进一步操作参数设置,例如设置上限和下限。对于这种模型,确保峰不会重叠得太近或重叠可能会有所帮助。你可以这样做:
gmodel = Model(gaussian, prefix='p1_') + Model(gaussian, prefix='p2_')
params = gmodel.make_params(p1_amp=0.1, p1_cen=4697.97, p1_wid=0.005,
p2_amp=0.5, p2_cen=4698.00, p2_wid=0.005)
params['p1_cen'].min = x.min()
params['p1_cen'].max = 4697.98
params['p2_cen'].min = 4697.98
params['p2_cen'].max = x.max()
result = gmodel.fit(y, params, x=x)
为每个模型的 cen
参数设置 min
/max
值,以便它们不能交换。
import matplotlib.pyplot as plt
import numpy as np
from lmfit import Model
x=np.array([4698.031, 4698.027, 4698.024, 4698.021, 4698.017, 4698.014,4698.011, 4698.007, 4698.004, 4698.001, 4697.997, 4697.994, 4697.991, 4697.987, 4697.984, 4697.981, 4697.977, 4697.974, 4697.971, 4697.967, 4697.964, 4697.961, 4697.957, 4697.954, 4697.951, 4697.947, 4697.944, 4697.941, 4697.937, 4697.934, 4697.931, 4697.927, 4697.924, 4697.921, 4697.917])
y=np.array([0.56565, 0.586575, 0.70335, 0.991245, 1.447545, 4.944375, 11.97281, 18.22095, 19.7613, 17.13792, 13.35083, 10.26506, 7.898505, 5.084775, 2.4192, 1.34358, 0.829905, 1.31322, 3.2049, 4.0095, 2.83263, 1.51605, 0.643275, 0.48972, 0.432675, 0.084375, 0.135345, 0.362145, 0.34425, 0.307125, 0.469125, 0.297, 0.183255, 0.528855, 0.523125])
gmodel = Model(gaussian, prefix='p1_') + Model(gaussian, prefix='p2_')
params = gmodel.make_params(p1_amp=0.1, p1_cen=4697.97, p1_wid=0.005, p2_amp=0.5, p2_cen=4698.00, p2_wid=0.005)
params['p1_cen'].min = x.min()
params['p1_cen'].max = 4697.98
params['p2_cen'].min = 4697.98
params['p2_cen'].max = x.max()
result = gmodel.fit(y, params, x=x)
更新程序 几个问题
- 当我 运行 程序时,它给我一个错误。 追溯(最近一次通话最后一次):
文件“”,第 7 行,位于 gmodel =模型(高斯,前缀='p1_')+模型(高斯,前缀='p2_')
NameError: 名称 'gaussian' 未定义
我为此添加了 from lmfit.lineshapes import gaussian
并且它有效。
是对还是错??
- 添加 library/package 程序后说 追溯(最近一次通话最后一次):
文件“”,第 9 行,位于 参数['p1_'].min = x.min()
按键错误:'p1_cen'
帮我解决这个问题。
- 删除
params
程序后 运行s 没有任何错误,但我该怎么做才能显示我的 给定数据 的图表最适合数据。我刚刚为我的给定数据做了plt.plot(x,y)
,但不知道如何为我的最佳数据做......
你需要给出更好的起始猜测。您的数据 x
范围从 4697.8 到 4698.0,但您对 cen
的初始猜测是 1.0,远远超出了您的数据范围。将初始值更改为对您的数据更合理的值。
更新以解决如何拟合 2 个峰的问题:
要拟合 2 个峰,您可以创建一个复合模型,如
gmodel = Model(gaussian, prefix='p1_') + Model(gaussian, prefix='p2_')
result = gmodel.fit(y, x=x, p1_amp=0.1, p1_cen=4697.97, p1_wid=0.005,
p2_amp=0.5, p2_cen=4698.00, p2_wid=0.005)
这将创建一个将 2 个高斯相加的模型,并为一个模型的参数名称提供前缀 p1_
,为另一个模型的参数提供前缀 p2_
。然后,您可以在进行拟合时为其中的每一个提供初始值。
一般建议为每个模型创建一个lmfit.Parameters
的实例,因为这允许您进一步操作参数设置,例如设置上限和下限。对于这种模型,确保峰不会重叠得太近或重叠可能会有所帮助。你可以这样做:
gmodel = Model(gaussian, prefix='p1_') + Model(gaussian, prefix='p2_')
params = gmodel.make_params(p1_amp=0.1, p1_cen=4697.97, p1_wid=0.005,
p2_amp=0.5, p2_cen=4698.00, p2_wid=0.005)
params['p1_cen'].min = x.min()
params['p1_cen'].max = 4697.98
params['p2_cen'].min = 4697.98
params['p2_cen'].max = x.max()
result = gmodel.fit(y, params, x=x)
为每个模型的 cen
参数设置 min
/max
值,以便它们不能交换。