首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用numpy/scipy在python中进行傅里叶变换/迭代反卷积拟合

用numpy/scipy在python中进行傅里叶变换/迭代反卷积拟合
EN

Stack Overflow用户
提问于 2013-05-10 21:57:21
回答 1查看 2.5K关注 0票数 4

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

其中G是高斯和F指数衰减。我已经尝试使用lmfit.minimize在python中使用以下函数对其进行拟合:

代码语言:javascript
复制
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  

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

代码语言:javascript
复制
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中实现这些方法的意见。迭代反卷积似乎是最容易做的,所以也许我应该从它开始。另一方面,据我所知,傅立叶方法应该更快、更可靠。然而,我不知道如何对傅立叶变换的结果进行拟合。

EN

回答 1

Stack Overflow用户

发布于 2013-05-11 04:38:35

一些评论和想法:

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)你可以使用np.convolve有效地卷积向量,它基于你的帖子中提到的快速傅立叶变换方法。对于您的特定应用程序,高斯应该以环绕顺序表示。例如,参见数值配方,第13.1章了解详细信息(否则您的时间来源将改变)。

4)传统的方法是基于使用典型恒定高斯核的迭代重新卷积。反卷积虽然是可能的,但却是不合适的。

5)已经设计了一个用于拟合时间分辨荧光数据的通用软件包,它实现了您所需的所有功能:trfit

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16483990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档