python - 指数衰减拟合

标签 python numpy scipy

我试图拟合一些在指数衰减后的时间内分布的数据。我试图在网上遵循一些合适的例子,但我的代码不适合数据。拟合只产生一条直线。也许初始参数有问题?到目前为止,我只使用了高斯拟合和线拟合,使用相同的方法,这对于这种情况可能不正确。
代码从网络上获取数据,因此可以直接执行。
问题:为什么代码不适合?
非常感谢提前。

#!/usr/bin/env python

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

rc('font',**{'family':'serif','serif':['Helvetica']})
rc('ps',usedistiller='xpdf')
rc('text', usetex=True)
#------------------------------------------------------

tmin = 56200
tmax = 56249

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 > 56210) & (time < 56225))
time = time[cond]
rate = rate[cond]
error = error[cond]

right_exp = lambda p, x: p[0]*exp(-p[1]*x)
err = lambda p, x, y:(right_exp(p, x) -y)
v0= [0.20, 56210.0, 1]
out = leastsq(err, v0[:], args = (time, rate), maxfev=100000, full_output=1)
v = out[0] #fit parameters out
xxx = arange(min(time), max(time), time[1] - time[0])
ccc = right_exp(v, xxx)
fig = figure(figsize = (9, 9)) #make a plot
ax1 = fig.add_subplot(111)
ax1.plot(time, rate, 'g.') #spectrum
ax1.plot(xxx, ccc, 'b-') #fitted spectrum
savefig("right exp.png")

axis([tmin-10, tmax, -0.00, 0.45])

最佳答案

您的问题是病态的,因为您的阵列 times包含在 exp(-a*time) 中使用时的大数字给出的值接近 0. ,它欺骗了 err功能,因为您的 rate数组包含也接近 0. 的小值,导致小错误。换句话说,高a在指数函数中给出了一个很好的解决方案。

要解决这个问题,您可以:

  • 更改衰减函数以包含初始时间:exp(-a*(time-time0))
  • 将输入数据更改为从较小的数字开始:time -= time.min()

  • 对于这两个选项,您必须更改初始猜测 v0 ,例如v0=[0.,0.] .第一个解决方案似乎更强大,您不必管理 time 中的更改。阵列。 time0 的一个很好的初始猜测是 time.min() :
    right_exp = lambda p, x: p[0]*exp(-p[1]*(x-p[2]))
    err = lambda p, x, y:(right_exp(p, x) -y)
    v0= [0., 0., time.min() ]
    out = leastsq(err, v0, args = (time, rate))
    v = out[0] #fit parameters out
    xxx = arange(min(time), max(time), time[1] - time[0])
    ccc = right_exp(v, xxx)
    fig = figure(figsize = (9, 9)) #make a plot
    ax1 = fig.add_subplot(111)
    ax1.plot(time, rate, 'g.') #spectrum
    ax1.plot(xxx, ccc, 'b-') #fitted spectrum
    fig.show()
    

    给予:

    enter image description here

    不过,最终结果取决于 v0 ,例如与 v0=[1.,1.,time.min()]它衰减太快,找不到最佳值。

    关于python - 指数衰减拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15545004/

    相关文章:

    python - 使用 pandas 将对象类型列转换为数字类型

    python - 求解大量小型线性系统

    python - 在 debian 上打包使用 perl 和 python 的应用程序

    python - 关于树状图的一些问题 - python (Scipy)

    python - 总结二维数组以找到灰度强度

    python - 从Python(pandas)中的日期列获取周开始日期(星期一)?

    python - Scipy 稀疏矩阵 - 不一致的和

    python - 如何在 numpy 中对二维数组进行 bin?

    python - 如何计算 GradientBoostingClassifier 的特征重要性

    python - 如何使用 python 绘制 numpy 数组的 3d 表面?