使用幂律拟合时出现 Lmfit 错误:乘法中遇到无效值 return

Lmfit error while fitting with a power law : invalid value encountered in multiply return

Lmfit 无法与幂律型函数进行拟合,我真的不明白为什么。

函数如下

def HB(x, ys, K, n):
    return ys + K*np.power(x, n)

我尝试拟合的数据是这个:


rate = [1.00e-04, 1.33e-04, 1.76e-04, 2.33e-04, 3.09e-04, 4.09e-04,
       5.43e-04, 7.20e-04, 9.54e-04, 1.26e-03, 1.68e-03, 2.22e-03,
       2.95e-03, 3.91e-03, 5.18e-03, 6.87e-03, 9.10e-03, 1.21e-02,
       1.60e-02, 2.12e-02, 2.81e-02, 3.73e-02, 4.94e-02, 6.55e-02,
       8.68e-02, 1.15e-01, 1.53e-01, 2.02e-01, 2.68e-01, 3.56e-01,
       4.71e-01, 6.25e-01, 8.29e-01, 1.10e+00, 1.46e+00, 1.93e+00,
       2.56e+00, 3.39e+00, 4.50e+00, 5.96e+00, 7.91e+00, 1.00e+01,
       1.05e+01, 1.27e+01, 1.39e+01, 1.62e+01, 1.84e+01, 2.07e+01,
       2.44e+01, 2.64e+01, 3.24e+01, 3.36e+01, 4.28e+01, 4.29e+01,
       5.46e+01, 5.69e+01, 6.95e+01, 7.54e+01, 8.86e+01, 1.00e+02,
       1.13e+02, 1.44e+02, 1.83e+02, 2.34e+02, 2.98e+02, 3.79e+02,
       4.83e+02, 6.16e+02, 7.85e+02, 1.00e+03]

stress = [   8.25,    8.9 ,    9.19,    9.29,    9.32,    9.46,    9.58,
          9.59,    9.82,   10.  ,   10.2 ,   10.4 ,   10.6 ,   10.8 ,
         11.1 ,   11.4 ,   11.8 ,   12.2 ,   12.7 ,   13.2 ,   13.8 ,
         14.5 ,   15.3 ,   16.2 ,   17.2 ,   18.5 ,   19.9 ,   21.4 ,
         23.3 ,   25.3 ,   27.8 ,   30.5 ,   33.8 ,   37.6 ,   42.1 ,
         47.2 ,   53.2 ,   60.2 ,   68.4 ,   77.9 ,   89.  ,   93.9 ,
        102.  ,  106.  ,  117.  ,  120.  ,  135.  ,  136.  ,  156.  ,
        154.  ,  180.  ,  175.  ,  199.  ,  208.  ,  226.  ,  242.  ,
        258.  ,  283.  ,  294.  ,  331.  ,  337.  ,  387.  ,  446.  ,
        515.  ,  597.  ,  695.  ,  812.  ,  950.  , 1120.  , 1330.  ]

两个字段都绝对没有负值。我像这样修复边界:

HB_model = lmfit.Model(HB)
HB_model.set_param_hint('ys', min=5, max=20)
HB_model.set_param_hint('K', min=1e-6, max=100)
HB_model.set_param_hint('n', min=0.4, max=0.8)

而且我通过反复试验知道,一个非常好的猜测是在 ys=10、K=20 和 n=0.6 附近,绘制后看起来像这样:

虽然,当做适合

res_fit=HB_model.fit(stress,x=rate)

我收到以下错误消息

RuntimeWarning: invalid value encountered in multiply return ys + K*np.power(x, n)

当 n 系统地等于我施加的下限时,ys 和 K 的两个值都会改变。 有谁知道这里会发生什么?

正如@9769953 在评论中所暗示的,问题几乎可以肯定是您没有提供初始值。奇怪的是,你说你有 良好的初始值并显示使用它们的情节。所以,就这样吧

HB_model = lmfit.Model(HB)
params = HB_model.make_params(ys=10, K=20, n=0.6)

我建议不要像 Model.set_param_hint() 那样设置界限。首先,不要因为您认为那些“应该接近”而将界限设置得太紧。设置界限以防止出现荒谬的值或防止生成 NaN。
其次,设置参数提示是对于模型,说power-law模型应该有5到20之间的偏移是不正确的。它 可能 说某个适合该 power-law 模型的数据集应该将偏移量限制在 5 到 20 之间是合理的(但可能不是)。但是,最好这样做带有用于该数据集的参数,而不是一般模型的参数。所以,也许是这样的:

HB_model = lmfit.Model(HB)
params = HB_model.make_params(ys=10, K=20, n=0.6)
params['ys'].max = 100
params['ys'].min = 0
params['K'].min = 0
params['n'].min = 0

result = HB_model.fit(stress, params, x=rate)