用Python为2D数据集编写全局拟合

问题描述

我想使用全局拟合将一些瞬态吸收数据(细节并不重要)作为时间和能量的函数进行拟合。通常人们通过数据查看时间片,并将其与一些衰减的指数曲线的(总和)拟合:A *(1.-np.exp(-k *(t-t0)))+ B * np.exp( -k *(t-t0))+ BG。在A是一些消失的物种而B是一些向内生长的物种的情况下,BG是恒定的背景。我通常使用scipy中的curve_fit选项来拟合所有内容,但是您需要一个预定义的函数形式来拟合数据。

现在,我遇到麻烦的部分是从这种约束拟合变为全局拟合,在此我可以拟合所有数据。因此,除了具有上述功能之外,我还希望A和B也依赖于另一个参数(在我的情况下为能量),因此A(E)和B(E)。我认为这里最困难的部分是A和B应该具有任意形状(而不是n个高斯之和),这可以通过返回A(E),B(E),k,t0和BG的某些最小化器来解决(E)(以minimum [(data-model)^ 2]形式出现的东西。

有人知道该怎么做吗?我认为对A(E)和B(E)进行一些很好的初步猜测会很方便,我认为我可以从数据中获取这些信息(B类似于通过数据的第一个时间片,而A类似于最后一个时间片-第一个时间片)。我阅读了symfit选项页面https://symfit.readthedocs.io/en/stable/fitting_types.html#global-minimization),但在那里他们也对A(E)和B(E)使用了预定义的功能形式,而不是使它们具有任意形状。

感谢大家的帮助:)!

我已经附加了通常如何通过数据拟合一维切片的方法

#Select time range that needs to be fitted,take this out of the 2D dataset
start_time = 50.
stop_time = max(selected_tatimes)

selected_tatimes = ta_times[(ta_times >= start_time) & (ta_times <= stop_time)]
selected_tadata = ta_data_averaged[np.where(ta_times == selected_tatimes[0])[0][0]:np.where(ta_times == selected_tatimes[-1])[0][0],:]

#Taking one time slice through the data
test_x = selected_tatimes[1:]
test_y = selected_tadata[:,131]

#Define functional form to fit 1D slice
def fitfunction(t,t0,k,A,B,BG):
    return A*(1.-np.exp(-k*(t-t0)))+B*np.exp(-k*(t-t0)) + BG

guesses = [55,0.0005,0.1,-0.4,-0.6]

popt,pcov = curve_fit(fitfunction,test_x,test_y,p0 = guesses,maxfev = 200000)
xlistje = np.arange(55,3000,1)

plt.close('all')
plt.figure()
plt.plot(test_x,'bo')
plt.plot(xlistje,fitfunction(xlistje,*popt),'c-')
#plt.plot(xlistje,55,-0.6),'r-')
plt.ylim(-1.1,0.1)
plt.axhline(y = 0,lw = 1,color = 'black')
plt.show()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)