我试图概括一些代码,以便能够在单个数据集中拟合多个(n从1到>;10)高斯曲线/峰值。你知道吗
使用Scipy optimize Curve\u fit,当我硬编码1-3个高斯函数时,我可以得到非常好的拟合,并且我已经成功地生成了一个通用的、任意数量的高斯函数,它可以无错误地运行。但是,输出拟合很差。尽管给出的输入参数与用于生成“原始”数据的参数相同,即最佳情况。你知道吗
另外,在某个点上,特定函数可能需要从简单的高斯函数修改,但现在应该可以了。你知道吗
下面是我的代码示例,输出图如下所示。你知道吗
import numpy as np
import pandas as pd
import scipy
import scipy.optimize
import matplotlib.pyplot as plt
from matplotlib import gridspec
amp1 = 1
cen1 = 1
sigma1 = 0.05
df=pd.DataFrame(index=np.linspace(0,10,num=1000),columns=['int'])
def _ngaussian(x, amps,cens,sigmas):
fn = 0
if len(amps)== len(cens)== len(sigmas):
for i in range(len(amps)):
fn = fn+amps[i]*(1/(sigmas[i]*(np.sqrt(2*np.pi))))*\
(np.exp((-1.0/2.0)*(((x-cens[i])/sigmas[i])**2)))
else:
print('Your inputs have unequal lengths')
return fn
amps = [1,1.1,0.9]
cens = [1,2,1.7]
sigmas=[0.05]*3
popt_peaks = [amps,cens,sigmas]
df['peaks'] = _ngaussian(df.index, *popt_peaks)
# Optionally adding noise to the raw data
#noise = np.random.normal(0,0.1,len(df['peaks']))
#df['peaks'] = df['peaks']+noise
def wrapper_fit_func(x, *args):
N = len(args)
a, b, c = list(args[0][:N]),list(args[0][N:N*2]),list(args[0][2*N:3*N])
return _ngaussian(x, a, b, c)
def unwrapper_fit_func(x, *args):
N = int(len(args)/3)
a, b, c = list(args[:N]),list(args[N:N*2]),list(args[2*N:3*N])
return _ngaussian(x, a, b, c)
popt_fitpeaks, pcov_fitpeaks = scipy.optimize.curve_fit(lambda x, *popt_peaks: wrapper_fit_func(x, popt_peaks),
df.index, df['peaks'], p0=popt_peaks,
method='lm')
df['peaks_fit'] = unwrapper_fit_func(df.index, *popt_fitpeaks)
fig = plt.figure(figsize=(8,8))
gs = gridspec.GridSpec(1,1)
ax1 = fig.add_subplot(gs[0])
ax1.set_xlim(0,3)
ax1.plot(df.index, df['peaks'], "b",label='ideal data')
ax1.plot(df.index, df['peaks_fit'], "g",label='fit data')
ax1.legend(loc='upper right')
如果你感兴趣,背景是在分析化学,核磁共振(NMR)和傅立叶变换离子回旋共振质谱(FTICR-MS)信号处理。你知道吗
你可能会发现
lmfit
(https://lmfit.github.io/lmfit-py/,披露:我是一个主要作者)对此很有用。它为建模数据提供了一个易于使用的模型类,包括用于高斯、Voigt和类似线型的内置模型,从而可以方便地比较模型函数。你知道吗Lmfit模型可以被添加(或多重)以形成一个复合模型,使得它很容易支持1、2、3等高斯分布,并且还包括不同的基线函数。在上面的链接中有文档和几个例子。对您的示例稍加重写(包括添加一点杂音)可能如下所示:
这将生成一个如下的拟合图:
并打印一份
相关问题 更多 >
编程相关推荐