【问题标题】:Fitting a stretch exponential using python scipy.curve_fit()使用 python scipy.curve_fit() 拟合拉伸指数
【发布时间】:2021-02-23 01:36:12
【问题描述】:

我正在尝试使用以下类型的拉伸指数函数拟合一些数据:c*(exp(-x/tau)^beta)。我感兴趣的值是 tau。

我试图拟合的数据通过零,有时也是负数(例如,值从 -1 变为 1)。

def st_exp(x,c,tau,beta):
        return c*(np.exp(-(x/tau)**beta))

当我尝试适应时,我会收到运行时警告:

RuntimeWarning: invalid value encountered in power
  return c*(np.exp(-(x/tau)**beta))

我想按原样拟合数据,但是,这会显示运行时警告,并且拟合不会收敛或仅在遇到零之前拟合。

我使用的拟合:

def get_index(x0,x):
    return np.argmin(abs(x-x0))

init_vals = [max(y)-min(y),-1*x[get_index(np.mean(y),y)]/np.log(0.5),0.5]

best_vals, covar = curve_fit(st_exp, x,y, p0=init_vals)

The data I am trying to fit :

x = np.arange(0,400000,1000)
y = np.array([-45819., -37322., -34006., -28906., -26565., -13311., -10992.,
       -11233.,  -3313.,  -2421.,  -1687.,   9665.,  11951.,  12796.,
        22440.,  20331.,  24732.,  26594.,  25464.,  30668.,  37412.,
        33261.,  34365.,  39359.,  39105.,  40260.,  48946.,  48351.,
        49872.,  44422.,  49969.,  54536.,  54248.,  57340.,  61403.,
        61843.,  63386.,  61182.,  64080.,  64052.,  68232.,  68167.,
        76288.,  71786.,  74485.,  76070.,  76540.,  70167.,  82014.,
        79459.,  80499.,  80073.,  80697.,  88209.,  80099.,  83415.,
        93613.,  86038.,  89498.,  86073.,  86999.,  94242.,  91823.,
        91162.,  93277.,  94834.,  89088.,  92613.,  97663.,  95948.,
        92840., 105920.,  98487., 100951.,  88721.,  95078.,  99831.,
        94738., 102520.,  98576.,  99038., 103921., 102951., 103186.,
       100755., 103631., 107259., 107376., 105404., 109739., 110135.,
       107829., 103196., 110798., 104497., 107074., 111857., 110816.,
       111853., 111890., 107932., 111878., 109776., 112154., 112769.,
       113155., 114862., 109560., 111112., 111516., 110314., 115911.,
       115820., 118418., 113124., 114579., 118102., 115259., 112640.,
       121617., 118125., 114923., 115210., 121919., 115841., 111980.,
       117730., 112565., 120893., 113758., 121129., 110559., 118674.,
       122867., 118574., 118022., 118656., 117656., 116813., 118591.,
       119722., 110845., 126545., 119452., 121438., 118271., 125652.,
       121025., 119663., 119917., 121405., 124934., 117835., 121760.,
       123870., 126825., 120996., 116165., 119473., 120996., 120530.,
       122197., 119907., 123786., 116293., 118625., 123068., 123951.,
       123443., 120781., 126291., 119316., 119401., 125871., 120863.,
       117013., 125037., 124775., 117822., 123755., 121240., 122696.,
       117997., 124865., 123457., 124229., 117705., 126550., 121866.,
       123070., 123585., 126033., 126355., 124475., 121325., 125392.,
       125882., 126755., 128013., 123610., 123611., 123853., 124819.,
       125464., 123897., 128276., 120328., 125569., 128821., 128039.,
       126223., 123052., 121924., 121932., 122968., 129473., 124053.,
       122576., 124538., 127567., 129659., 126090., 130546., 131749.,
       118672., 130372., 125783., 126413., 126283., 125898., 124901.,
       130037., 123192., 122977., 125806., 125544., 131714., 130757.,
       128980., 130233., 129140., 127372., 118302., 126342., 126046.,
       127595., 129635., 121161., 123841., 124058., 124156., 131894.,
       124745., 129556., 127832., 126236., 130072., 121877., 121383.,
       136089., 123984., 127407., 128703., 127597., 126220., 124028.,
       122716., 127398., 129724., 128971., 124488., 127229., 130337.,
       132997., 126681., 127312., 123270., 123822., 127458., 127653.,
       122740., 132875., 124466., 132315., 129569., 128041., 127525.,
       124972., 123646., 122957., 130239., 126285., 127734., 131409.,
       128138., 133744., 131438., 130377., 130763., 127868., 129223.,
       130644., 131814., 132781., 127419., 124382., 127924., 129190.,
       127443., 132475., 130202., 128066., 130360., 130282., 125531.,
       130259., 123453., 126989., 129615., 132047., 129424., 126729.,
       127324., 128756., 121690., 132176., 126250., 127830., 128985.,
       133258., 125664., 123530., 130123., 126947., 123108., 125562.,
       126388., 131747., 128793., 121865., 121705., 127039., 132701.,
       128835., 133300., 125677., 134063., 136207., 128572., 127731.,
       130304., 129674., 126436., 132357., 128154., 129400., 126893.,
       132012., 129471., 124752., 127925., 123735., 125801., 126371.,
       128554., 126691., 126970., 129754., 130953., 125113., 133345.,
       127633., 128070., 127592., 125389., 127235., 125677., 131191.,
       130972., 124687., 132342., 130269., 133340., 127084., 132171.,
       131521., 133572., 124134., 132673., 131440., 122008., 129178.,
       133775., 126584., 131278., 133229., 128349., 139349., 127294.,
       133538.])

【问题讨论】:

    标签: python numpy scipy curve-fitting


    【解决方案1】:

    您的初始值可能会阻止您找到合适的人选。试试这个:

    best_vals, covar = curve_fit(st_exp, x, y, p0=[10000.0, 10000.0, 1.0])
    print(best_vals)
    # result: array([ 1.36046194e+05,  2.83889616e+04, -1.21296047e+00])
    
    fig, ax = plt.subplots(1, 1)
    ax.plot(x, y, label="data")
    ax.plot(x, st_exp(x,*best_vals), label="fit")
    ax.legend(loc="best")
    

    【讨论】:

    • 嗨,请注意拟合不超过 0。就我而言,重要的是,拟合超过零。我尝试合身时遇到了同样的问题。
    • 这不是curve_fit 的问题,而是您的拟合功能的直接后果。注意np.exp(x) > 0
    【解决方案2】:

    我犯的错误是我没有证明拟合函数的偏移量:

    1. 在拟合之前纠正偏移。

    1. 修改拟合函数为:
    def st_exp(x,c,tau,beta,y_offset):
        return c*(np.exp(-(x/tau)**beta))+y_offset
    

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2015-12-20
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多