使用幂律拟合时出现 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)
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)