如何解决scipy.optimize.curve_fit拟合指数函数时报残差非有限值错误
问题根因
- 核心错误是
scipy.optimize.curve_fit的入参顺序传反:该函数的标准调用顺序是curve_fit(待拟合函数, 自变量x数据, 因变量y数据),你两次调用都把y和x的位置写反了。 - 参数顺序错误后,原本的因变量y(数值范围2307~309083)被当作自变量输入拟合函数,计算
np.exp(c*(x-2011))时指数项数值爆炸溢出,得到无穷大结果,因此触发ValueError: Residuals are not finite in the initial point报错;之前调大maxfev无效也是因为参数逻辑错误,拟合过程完全偏离正确方向。
修复方案
调整curve_fit的x、y数据顺序即可,完整可运行代码如下:
import numpy as np from scipy.optimize import curve_fit # 原始数据 x = np.linspace(2011, 2021, 11) y = np.array([2307, 4541, 7114, 12156, 18948, 25502, 34022, 53861, 83175, 136617, 309083]) # 自定义拟合函数 def y_func(x, a, b, c): return np.exp(c*(x-2011))*b + a # 修正参数顺序后的拟合调用 popt, pcov = curve_fit(y_func, x, y, bounds=([1000, 30, 0.8], [3000, 80, 1.1]), p0=[2307, 50, 0.88]) # 输出拟合得到的a、b、c参数 print(popt)
运行后可正常得到拟合结果,无报错。
可选优化建议
如果后续遇到手动猜初始参数不准的情况,可以先对y取对数,做线性拟合先拿到c和b的近似估计值,作为p0传入能大幅提升拟合成功率。
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

