Python:使用高斯上升和指数衰减拟合数据

Python:使用高斯上升和指数衰减拟合数据,python,numpy,matplotlib,scipy,Python,Numpy,Matplotlib,Scipy,我试图拟合一些数据,这些数据分布在高斯曲线上升之后的时间段,然后呈指数衰减。 我发现,这与我的情况非常相似,但我刚刚开始适应python,这个示例对我来说似乎很混乱。 尽管如此,我还是尝试根据我的脚本和数据调整示例,以下是我的进展: #!/usr/bin/env python import pyfits, os, re, glob, sys from scipy.optimize import leastsq from numpy import * from pylab import * fr

我试图拟合一些数据,这些数据分布在高斯曲线上升之后的时间段,然后呈指数衰减。 我发现,这与我的情况非常相似,但我刚刚开始适应python,这个示例对我来说似乎很混乱。 尽管如此,我还是尝试根据我的脚本和数据调整示例,以下是我的进展:

#!/usr/bin/env python

import pyfits, os, re, glob, sys
from scipy.optimize import leastsq
from numpy import *
from pylab import *
from scipy import *
from scipy import optimize
import numpy as N
import pylab as P

data=pyfits.open('http://heasarc.gsfc.nasa.gov/docs/swift/results/transients/weak/GX304-1.orbit.lc.fits')
time  = data[1].data.field(0)/86400. + data[1].header['MJDREFF'] + data[1].header['MJDREFI']
rate  = data[1].data.field(1)
error = data[1].data.field(2)
data.close()

cond = ((time > 56200) & (time < 56220))
time=time[cond]
rate=rate[cond]
error=error[cond]

def expGauss(x, pos, wid, tConst, expMod = 0.5, amp = 1):
    expMod *= 1.0
    gNorm = amp * N.exp(-0.5*((x-pos)/(wid))**2)
    g = expBroaden(gNorm, tConst, expMod)
    return g, gNorm

def expBroaden(y, t, expMod):
    fy = F.fft(y)
    a = N.exp(-1*expMod*time/t)
    fa = F.fft(a)
    fy1 = fy*fa
    yb = (F.ifft(fy1).real)/N.sum(a)
    return yb

if __name__ == '__main__':

# Fit the first set
#p[0] -- amplitude, p[1] -- position, p[2] -- width
    fitfuncG = lambda p, x: p[0]*N.exp(-0.5*(x-p[1])**2/p[2]**2) # Target function
    errfuncG = lambda p, x, y: fitfuncG(p, x) - y # Distance to the target function
    p0 = [0.20, 56210, 2.0] # Initial guess for the parameters
    p1, success = optimize.leastsq(errfuncG, p0[:], args=(time, rate))
    p1G = fitfuncG(p1, time)
   # P.plot(rate,  'ro', alpha = 0.4, label = "Gaussian")
   # P.plot(p1G, label = 'G-Fit')

def expGauss(x, pos, wid, tConst, expMod = 0.5, amp = 1):
  #p[0] -- amplitude, p[1] -- position, p[2] -- width, p[3]--tConst, p[4] -- expMod  
    fitfuncExpG = lambda p, x: expGauss(x, p[1], p[2], p[3], p[4], p[0])[0]
    errfuncExpG = lambda p, x, y: fitfuncExpG(p, x) - y # Distance to the target function  
    p0a = [0.20, 56210, 2.0] # Initial guess for the parameters
    p1a, success = optimize.leastsq(errfuncExpG, p0a[:], args=(time, rate))
    p1aG = fitfuncExpG(p1a, time)
    print type(rate), type(time), len(rate), len(time)  
    P.plot(rate, 'go', alpha = 0.4, label = "ExpGaussian")  
    P.plot(p1aG, label = 'ExpG-Fit')

    P.legend()  
    P.show()
#/usr/bin/env python
导入pyfits、os、re、glob、sys
从scipy.optimize import leastsq
从numpy进口*
从派拉布进口*
从scipy导入*
从scipy导入优化
将numpy作为N导入
将pylab作为P导入
数据=pyfits.open('http://heasarc.gsfc.nasa.gov/docs/swift/results/transients/weak/GX304-1.orbit.lc.fits')
时间=数据[1]。数据。字段(0)/86400+数据[1]。标题['MJDREFF']+数据[1]。标题['MJDREFI']
速率=数据[1]。数据。字段(1)
错误=数据[1]。数据。字段(2)
data.close()
条件=((时间>56200)和(时间<56220))
时间=时间[秒]
速率=速率[秒]
错误=错误[cond]
def expGauss(x、pos、wid、tConst、expMod=0.5、amp=1):
expMod*=1.0
gNorm=amp*N.exp(-0.5*((x-pos)/(wid))**2)
g=expMod(gNorm、tConst、expMod)
返回g,gNorm
def expMod(y、t、expMod):
fy=F.fft(y)
a=N.exp(-1*expMod*time/t)
fa=F.fft(a)
fy1=fy1*fa
yb=(F.ifft(fy1.real)/N.sum(a)
返回yb
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
#适合第一套
#p[0]--振幅,p[1]--位置,p[2]--宽度
fitfuncG=lambda p,x:p[0]*N.exp(-0.5*(x-p[1])**2/p[2]**2)#目标函数
errfuncG=lambda p,x,y:fitfuncG(p,x)-y#到目标函数的距离
p0=[0.2056210,2.0]#参数的初始猜测
p1,success=optimize.leastsq(errfuncG,p0[:],args=(时间,速率))
p1G=fitfuncG(p1,时间)
#P.绘图(速率“ro”,α=0.4,标签=“高斯”)
#P.绘图(p1G,标签='G-Fit')
def expGauss(x、pos、wid、tConst、expMod=0.5、amp=1):
#p[0]——振幅,p[1]——位置,p[2]——宽度,p[3]——t常数,p[4]——expMod
fitfuncepg=lambda p,x:expGauss(x,p[1],p[2],p[3],p[4],p[0])[0]
errfuncExpG=lambda p,x,y:fitfuncExpG(p,x)-y#到目标函数的距离
p0a=[0.2056210,2.0]#参数的初始猜测
p1a,success=optimize.leastsq(errfuncExpG,p0a[:],args=(时间,速率))
p1aG=fitfuncExpG(p1a,时间)
打印类型(速率)、类型(时间)、长度(速率)、长度(时间)
P.绘图(速率“go”,alpha=0.4,label=“ExpGaussian”)
P.plot(p1aG,标签='ExpG Fit')
P.图例()
P.show()
我肯定把整件事搞糊涂了,所以在此之前我很抱歉,但现在我不知道如何进一步。。。 代码从web获取数据,因此可以直接执行。 目前代码运行时没有任何错误,但不会生成任何绘图。 同样,我的目标是使数据与这两个函数相匹配,如何改进代码以实现这一点? 非常感谢您的建议。

与此类似,这里我还将使用三角函数拟合此峰值:

如果在代码后粘贴,则以下代码有效:

import numpy as np
from scipy.optimize import curve_fit
x = time
den = x.max() - x.min()
x -= x.min()
y_points = rate
def func(x, a1, a2, a3):
    return  a1*sin(1*pi*x/den)+\
            a2*sin(2*pi*x/den)+\
            a3*sin(3*pi*x/den)
popt, pcov = curve_fit(func, x, y_points)
y = func(x, *popt)
plot(time,rate)
plot(x,y, color='r', linewidth=2.)
show()
与之类似,这里我也将使用三角函数拟合该峰值:

如果在代码后粘贴,则以下代码有效:

import numpy as np
from scipy.optimize import curve_fit
x = time
den = x.max() - x.min()
x -= x.min()
y_points = rate
def func(x, a1, a2, a3):
    return  a1*sin(1*pi*x/den)+\
            a2*sin(2*pi*x/den)+\
            a3*sin(3*pi*x/den)
popt, pcov = curve_fit(func, x, y_points)
y = func(x, *popt)
plot(time,rate)
plot(x,y, color='r', linewidth=2.)
show()

减少混乱的最好办法是把问题分成几个小部分。首先,试着画一个简单的图——一条直线,或者一个正弦波或者其他东西。然后,找到一个绘图函数,并确保您理解它,首先尝试一些简单的东西-线性函数或正弦波。利用您的绘图经验,确保正确绘制。然后,也只有到那时,试着对一些复杂的事情做出反应。欢迎您就所有这些步骤提出问题。通过将其分解成小块,我们可以更轻松地帮助您。你好,Robbert,谢谢您的回复。我已经可以做一些拟合了,比如数据的第一个高斯部分。我的问题是我不能“连接”这些功能。此外,我在网上找到了这个例子,我正在尝试应用它,但我没有其他参考资料来了解我所做的是以一种好的方式做的。你为什么希望代码生成一个绘图?绘图方法做什么?@Py ser如果我读对了你的代码,似乎没有任何绘图方法……减少混乱的最佳方法是将问题分成几个小部分。首先,试着画一个简单的图——一条直线,或者一个正弦波或者其他东西。然后,找到一个绘图函数,并确保您理解它,首先尝试一些简单的东西-线性函数或正弦波。利用您的绘图经验,确保正确绘制。然后,也只有到那时,试着对一些复杂的事情做出反应。欢迎您就所有这些步骤提出问题。通过将其分解成小块,我们可以更轻松地帮助您。你好,Robbert,谢谢您的回复。我已经可以做一些拟合了,比如数据的第一个高斯部分。我的问题是我不能“连接”这些功能。此外,我在网上找到了这个例子,我正在尝试应用它,但我没有其他参考资料来了解我所做的事情是以一种好的方式完成的。为什么你会期望代码生成一个绘图?绘图方法是做什么的?@Py ser如果我正确地阅读了你的代码,它似乎没有到达任何绘图方法。。。