高斯拟合数据在Python中使用Lmfit



我正试图编写一个代码,执行高斯拟合伽马射线校准谱,即多峰。下面是我当前的代码:

from numpy import loadtxt
import numpy as np

from lmfit.models import GaussianModel
import matplotlib.pyplot as plt

#Centre of each of the peaks we want to fit Gaussian to
peakCentroids = np.array([251, 398, 803, 908, 996, 1133, 1178, 2581, 3194, 3698, 4671])

#Import total data set
data = loadtxt('Phase_1_02.dat')
x = data[:, 0] #channel number/gamma energy
y = data[:, 1] #Count number
mod = GaussianModel()
pars = mod.guess(y, x=x)
out = mod.fit(y, pars, x=x)
print(out.fit_report(min_correl=0.25))

for currentPeakNumber in range(len(peakCentroids)):
fig = plt.figure(figsize = (8, 8))

plt.plot(x, y, 'b')
plt.plot(x, out.init_fit, 'k--', label='initial fit')
plt.plot(x, out.best_fit, 'r-', label='best fit')
plt.legend(loc='best')
plt.show()

它为我的数据输出光谱并打印相关参数(例如中心,西格玛,fwhm等),但我在将高斯峰拟合到指定的每个质心方面有一点大脑冻结!目前,输出光谱仅在约248的值处拟合到第一个峰。有没有人比我更擅长在Python中编码,可以阐明如何做到这一点,如果可能的话,请使用Lmfit ?提前感谢!!:)

如果我正确理解了这个问题,您正在寻找用一系列高斯线形状对数据进行建模,以您拥有的许多(10个或更多)值为中心。

如果是这种情况,模型应该从10个或更多的高斯分布中构建,但你的模型只构建一个高斯分布。您将希望使用类似

的内容构建模型
import numpy as np
from lmfit.models import GaussianModel
peakCentroids = np.array([251.0, 398, 803, 908, 996, 1133, 1178, 2581, 3194,
3698, 4671.0])
mod = None 
for i, cen in enumerate(peakCentroids):
thispeak = GaussianModel(prefix='p%d_' %(i+1)) 
if mod is None:  
mod = thispeak
else:
mod = mod + thispeak
pars = mod.make_params()
for i, cen in enumerate(peakCentroids):
pars['p%d_center' % (i+1)].value = cen
pars['p%d_amplitude' % (i+1)].value = 1.0 # is that a sensible initial value?
pars['p%d_sigma' % (i+1)].value = 1.0 # is that a sensible initial value?
out = mod.fit(y, pars, x=x)
print(out.fit_report(min_correl=0.25))

或者至少这可能是一个很好的开始…

最新更新