【发布时间】:2020-01-01 13:22:48
【问题描述】:
我正在开发一个代码,用于用一个模型拟合数据,该模型是两个函数的卷积(具有多指数衰减的高斯 exp(Ax)+exp(Bx)+...)。基本上只有高斯和/或高斯修改https://en.wikipedia.org/wiki/Exponentially_modified_Gaussian_distribution 的拟合在 Lmfit 中工作得非常好,但使用内置卷积(即,如果使用两个函数的 np.convolve,Lmfit 不起作用。
我在互联网上尝试了很多示例,到目前为止,我意识到我的函数返回 inf 或 nan 值,而且数据在卷积中的使用间隔不相等。我通过使用卷积的数学表达式和使用 scipy.optimize.curve_fit 找到了一个绕道而行的问题。但这是一个非常笨拙且耗时的方法,我想找到一种方法来使其更复杂和通用两个函数的卷积并使用 lmfit 可以更轻松地控制参数。
该数据集也包含在 cmets 中作为您的参考。
w=0.1 # is constant
def CONVSum(x,w,*p):
n=np.int(len(p)/3)
A=p[:n]
B=p[n:2*n]
C=p[2*n:3*n]
# =======================================================================
# below formula is derived as mathematical expression of convoluted multi exponential components with a gaussian distribution based on the instruction given in http://www.np.ph.bham.ac.uk/research_resources/programs/halflife/gauss_exp_conv.pdf
# ======================================================================
fnct=sum(np.float64([A[i]*np.exp(-B[i]*((x-C[i])-(0.5*np.square(w)*B[i])))*(1+scipy.special.erf(((x-C[i])-(np.square(w)*B[i]))/(np.sqrt(2)*w))) for i in range(n)]))
fnct[np.isnan(fnct)]=0
fnct[fnct<1e-12]=0
return fnct
N=4 #number of exponential functions to be fitted
params = np.linspace(1, 0.0001, N*3); #parameters for a multiple exponential
popt,pcov = curve_fit(CONVSum,x,y,p0=params,
bounds=((0,0,0,0,-np.inf,-np.inf,-np.inf,-np.inf,-3,-3,-3,-3),
(1,1,1,1, np.inf, np.inf, np.inf, np.inf, 3, 3, 3, 3)),
maxfev = 1000000)
任何关于高斯卷积和多重指数衰减拟合的帮助或提示都非常感谢,我更喜欢使用 lmfit,因为我可以很好地识别参数并将它们相互关联。
理想情况下,我想用参数拟合我的数据,其中一些在数据集之间共享,一些是延迟的 (+off_set)。
【问题讨论】:
标签: python curve-fitting convolution gaussian exponential