2013-05-10 111 views
4

我想拟合荧光寿命曲线。这些曲线由仪器响应函数的卷积(IRF,假设高斯)和(多)指数衰减给出:傅立叶变换/使用numpy/scipy在python中进行迭代反卷积

formula

在G是高斯和F指数衰减。我已经在Python使用lmfit.minimize尝试配合这一点,具有以下功能:

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中实现这些方法的输入。迭代去卷积似乎是最容易做到的,所以也许我应该从头开始。另一方面,从我读过的内容来看,傅里叶方法应该更快更可靠。但是,我不知道如何对傅里叶变换结果进行拟合。

回答

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) (2 * t * tau-s2)/(sqrt(2)* tau * sigma)))来计算(2 * t * tau_s2)/(2 * tau^2))*

这显然会推广到您的exp1和gaus的定义。

3)您可以使用np.convolve有效地卷积矢量,这是基于您在文章中提到的F​​FT方法。对于您的特定应用程序,高斯应该以包装顺序来表示。见例如数值食谱,第13.1章了解细节(否则你的时间原点将会改变)。

4)传统方法基于使用典型恒定高斯内核的迭代重新卷积。尽管可能,但解卷积是不适当的。

5)多功能包安装时间分辨荧光数据已经设计实现所有您需要什么:trfit