我尝试使用lmfit包对我的数据进行拟合。但是我找不到任何内置的多指数衰减模型。我尝试创建自己的函数,然后拟合它。我的代码如下:
import os
import time
import numpy as np
import pandas as pd
import lmfit
from lmfit.models import ExponentialModel, LinearModel
from lmfit import Model, Parameter, report_fit
def MultiExpDecay(tiempo,C1,tau1,C2,tau2):
return C1*np.exp(-tiempo/tau1)+C2*np.exp(-tiempo/tau2)
def MultiExpDecay_fit():
C1s = []
C1s_error = []
C2s = []
C2s_error = []
tau1s = []
tau1s_error = []
tau2s = []
tau2s_error = []
Fit_MultiExpDecays = []
model = Model(MultiExpDecay, independent_vars=['tiempo'])
for c in range(len(V_APD.columns)):
xdat = tiempo.iloc[:, c]
ydat = V_APD.iloc[:, c]
pars = model.guess(ydat, x=xdat)
fit = model.fit(ydat, pars, x=xdat)
fit_values = model.eval(pars, x=xdat)
Fit_MultiExpDecays.append(fit_values)
for key in fit.params:
if key == 'C1':
#print(key, "=", out.params[key].value, "+/-", out.params[key].stderr)
C1s.append(fit.params[key].value)
C1s_error.append(fit.params[key].stderr)
elif key == 'C2':
C2s.append(fit.params[key].value)
C2s_error.append(fit.params[key].stderr)
elif key == 'tau1':
tau1s.append(fit.params[key].value)
tau1s_error.append(fit.params[key].stderr)
elif key == 'tau2':
tau2s.append(fit.params[key].value)
tau2s_error.append(fit.params[key].stderr)
Fit_MultiExpDecays = np.transpose(pd.DataFrame(Fit_MultiExpDecays, index=labels))
C1 = np.transpose(pd.DataFrame(C1s, index = labels, columns = ['C1']))
C2 = np.transpose(pd.DataFrame(C2s, index=labels, columns=['C2']))
tau1 = np.transpose(pd.DataFrame(tau1s, index=labels, columns=['tau1']))
tau2 = np.transpose(pd.DataFrame(tau2s, index=labels, columns=['tau2']))
C1_error = np.transpose(pd.DataFrame(C1s_error, index = labels, columns=['C1 error']))
C2_error = np.transpose(pd.DataFrame(C2s_error, index=labels, columns=['C2 error']))
tau1_error = np.transpose(pd.DataFrame(tau1s_error, index=labels, columns=['tau1 error']))
tau2_error = np.transpose(pd.DataFrame(tau2s_error, index=labels, columns=['tau2 error']))
C1 = pd.concat([C1, C1_error])
C2 = pd.concat([C2, C2_error])
tau1 = pd.concat([tau1, tau1_error])
tau2 = pd.concat([tau2, tau2_error])
return C1, C2, tau1, tau2, Fit_MultiExpDecays
C1, C2, tau1, tau2, Fit_MultiExpDecays = MultiExpDEcay_fit():
字符串
出现错误,但无法识别问题。
File "C:\ProgramData\Anaconda3\Lib\site-packages\lmfit\model.py", line 737, in guess
raise NotImplementedError(msg)
NotImplementedError: guess() not implemented for Model
型
2条答案
按热度按时间thigvfpy1#
也可以使用两个
lmfit.ExponentialModel
,字符串
对于实际问题:正如异常所说,
Model
不知道如何为任意的用户定义的模型函数猜测合理的参数值-Model.guess()
方法在默认情况下引发此异常,并且必须由每个子类覆盖。lmfit
为提供的子模型(包括ExponentialModel
)提供此方法,但这些方法都是在理解这些特定模型的情况下编码的。最后:拟合双指数衰减是出了名的容易出错,并且对于最小二乘方法(或至少Levenberg-Marquardt实现)来说是困难的。对于更现实的情况,我建议用双指数衰减的对数来拟合数据的对数。
mnemlml82#
lmfit
的设计使你不必做你在这里做的所有编程。它应该看起来像:字符串
提供:
型
和
的数据