4

我想拟合荧光寿命曲线。这些曲线由仪器响应函数(IRF,假定高斯)和(多)指数衰减的卷积给出:

公式

其中 G 是高斯和 F 指数衰减。我尝试使用 lmfit.minimize 在 python 中拟合它,具有以下功能:

def gaus(t, gamp, gwidth, gtoff):
    i = gamp*math.exp(-(t-gtoff)**2/gwidth)
    return i


def exp1(t, expamp, exptime, exptoff):
    i = expamp*math.exp((t-exptoff)/(exptime))
    return i

def func1(t, gamp, gwidth, gtoff, expamp1, exptime1, exptoff1):

    i = [(scipy.integrate.quad(lambda Tpr: gaus((ti - Tpr), gamp, gwidth, gtoff)*exp1(ti, expamp1, exptime1, exptoff1), 0, ti))[0]
            for ti in t]
    return i  

其中 gaus 定义了高斯仪器响应函数,exp1 是单指数衰减。func1 使用 scipy.integrate 计算两者之间的卷积,它返回的值用于计算拟合和给定一组参数的数据之间的差异:

def fitfunc(params, x, data):
    ..getting parameters part here..

    values = func1(t, gamp, gwidth, toff, expamp1, exptime1, toff)
    return values - data

result = lmfit.minimize(fitfunc, fit_params, args = (t, test))

虽然这种作品,拟合过程非常缓慢,还没有给我任何合理的拟合。

有几种方法可以通过使用傅里叶变换或迭代反卷积来规避卷积过程。Origin似乎知道该怎么做,但我无法理解程序。

据我所知,迭代反卷积的工作原理是用猜测的高斯函数对信号进行反卷积,然后拟合结果,然后调整高斯。

傅里叶变换方法将基于实际空间中的卷积对应于傅里叶域中的乘法的原理,这将减少计算时间。我猜这将是傅里叶变换信号,拟合它,然后傅里叶变换回来。

我想要一些关于如何在 python numpy/scipy 中实现这些方法的输入。迭代反卷积似乎是最容易做到的,所以也许我应该从它开始。另一方面,根据我的阅读,傅里叶方法应该更快、更可靠。但是,我不知道如何对傅里叶变换的结果进行拟合。

4

1 回答 1

3

一些评论和想法:

1)在您的上述实现中, gtoff 和 expoff 是多余的。这同样适用于 gamp 和 expamp。例如,使用 expoff=0 和 expamp=1。

2)如果你只是在多指数衰减与高斯核的卷积之后,使用解析结果,使用 scipy.special.erf 可以轻松有效地评估:exp(-t/tau) (t >= 0) 归一化高斯 1/(sqrt(2*pi)*sigma)*exp(-t^2/(2*sigma^2)) 是

1/2 * exp( - (2*t*tau - s2)/(2*tau^2) ) * (1 + erf( (2*t*tau - s2)/(sqrt(2)*tau*sigma )))。

这显然可以推广到您对 exp1 和 gaus 的定义。

3)您可以使用基于您帖子中提到的 FFT 方法的 np.convolve 有效地对向量进行卷积。对于您的特定应用程序,高斯应该以环绕顺序表示。有关详细信息,请参见例如数字食谱,第 13.1 章(否则您的时间原点将发生变化)。

4) 传统方法基于使用典型恒定高斯核的迭代再卷积。尽管可能,反卷积是不适定的。

5) 设计了一个用于拟合时间分辨荧光数据的多功能软件包,可满足您的所有要求:trfit

于 2013-05-10T20:38:35.000 回答