Curve_fit RuntimeScipy python中的警告消息

8i9zcol2  于 2023-08-05  发布在  Python
关注(0)|答案(2)|浏览(161)

我正在尝试使用curve_fit拟合数据。然而,我收到了这个警告信息。
运行时警告:日志中遇到无效值
我搜索到这意味着log中有负值。但是,我的数据中没有负值。有人能帮忙吗?
下面是我的代码:

from scipy.optimize import curve_fit
import numpy as np
def fit(x,a,b):
    return a*np.log(b*x+1)
q = [0., 4.698, 9.396, 13.148, 18.792, 22.416, 26.296, 30.176, 34.056]
r = [0., 1.50755518, 3.53050467, 6.5067685, 9.8676480, 12.8481805, 14.6121058, 15.5656062, 16.69052756]
fit_log_param, _ = curve_fit(fit, xdata=q, ydata=r)

字符串

cdmah0mi

cdmah0mi1#

这意味着log中有负值
这是正确的。
之所以会发生这种情况,是因为curve_fit尝试更改各种参数,并计算卡方2或其他度量来尝试找到含义。改变这些参数可能会导致此类警告。例如,当B变为负数时,可能会发生这种情况:b*x+1可以变为负值,作为日志的inupt。
所得到的度量通常是无穷大或NaN,并且被认为比以前的任何度量都差,因此这些参数值将很快被视为“不好”而丢弃。它们不应该妨碍试衣,但会减慢试衣速度(即使只是轻微的)。
如果使用接近预期的一些启动参数启动curve_fit,则通常会出现

  • 更快的结果(迭代次数更少)
  • 无警告消息
  • 完全没有结果(某些不良的起始参数可能无法找到良好的最佳值)

所以提供一些好的启动参数。这可能是每次使用curve_fit时的一个很好的实践,无论您尝试适合哪种类型的函数。

azpvetkf

azpvetkf2#

def fit(x,a,b):
    return a*np.log(b*x+1)
q = [0., 4.698, 9.396, 13.148, 18.792, 22.416, 26.296, 30.176, 34.056]
r = [0., 1.50755518, 3.53050467, 6.5067685, 9.8676480, 12.8481805, 14.6121058, 15.5656062, 16.69052756]
fit_log_param, _ = curve_fit(fit, xdata=q, ydata=r, bounds=[(-2, 0), (500, 100)])

字符串
log意味着在curve_fit的搜索过程中,B*x+1可能为负,因此您可以使用param bounds限制参数的范围以避免这种情况。

相关问题