【问题标题】:RuntimeWarning: overflow encountered in exp Python/Scipy [duplicate]RuntimeWarning:exp Python / Scipy中遇到溢出[重复]
【发布时间】:2020-12-06 18:27:52
【问题描述】:

我是使用 scipy 的 curve_fit() 的初学者。我不明白我的以下代码中的问题是什么:

import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit

def func(x, a, b, c):
    return a * np.exp(-b * x) + c

xdata = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]
ydata = [75,66,63,61,60,58,58,55,56,54,56,59,57,57,56,58,56,58,56,56,56]
popt, pcov = curve_fit(func, xdata, ydata)

它返回RuntimeWarning:exp遇到溢出

知道有什么问题吗?提前致谢!

【问题讨论】:

  • 可能值得在func 中加入一个打印语句,以查看它被调用的参数。
  • @JohanC 不幸的是没有帮助
  • @Derlin 不幸的是,我以前见过那个

标签: python matplotlib scipy curve-fitting


【解决方案1】:

正如this post 中所说,np.exp 很快就会溢出。您可以通过在b 上添加bounds 来避免溢出。请注意,您只会收到警告,curve_fit 的结果不受影响。

import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit

def func(x, a, b, c):
    return a * np.exp(-b * x) + c

xdata = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]
ydata = [75, 66, 63, 61, 60, 58, 58, 55, 56, 54, 56, 59, 57, 57, 56, 58, 56, 58, 56, 56, 56]
popt, pcov = curve_fit(func, xdata, ydata, bounds=([-np.inf, 0.0001, -np.inf], [np.inf, 10, np.inf]))
xs = np.linspace(2, 22, 100)
plt.plot(xs, func(xs, *popt))
plt.scatter(xdata, ydata)
plt.show()

PS:还要注意拟合函数使用x的数据类型,这有时会导致奇怪的问题。在此示例中没有问题,但通常添加 xdata = np.array(xdata, dtype=float)xdata = np.array(xdata, dtype=np.longdouble) 会有所帮助。

【讨论】:

  • 如果这回答了您的问题,您可能会将marking 的答案视为已接受。
猜你喜欢
  • 2017-11-15
  • 2018-07-10
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
相关资源
最近更新 更多