使用Scipy的curve_fit拟合数据时遇RuntimeWarning报错求助
解决curve_fit中log函数出现无效值的警告
问题出在curve_fit优化参数的过程中——虽然你的输入数据q都是非负数,但优化算法会尝试各种可能的参数值,包括负数的b。当b为负且x足够大时,b*x+1会小于0,导致np.log计算时出现无效值,触发警告。
解决方案:限制参数范围
给curve_fit添加bounds参数,强制约束b的取值为非负数,这样b*x+1始终≥1(因为x≥0),就不会出现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] # 限制b的下限为0,a的范围无限制 fit_log_param, _ = curve_fit(fit, xdata=q, ydata=r, bounds=([-np.inf, 0], [np.inf, np.inf])) print(fit_log_param)
额外优化:添加初始猜测值
如果想让优化收敛更快,可以通过p0参数给a和b一个合理的初始猜测值,比如根据数据趋势估算的初始值:
# 比如假设初始a=5,b=0.1 fit_log_param, _ = curve_fit(fit, xdata=q, ydata=r, bounds=([-np.inf, 0], [np.inf, np.inf]), p0=[5, 0.1])
这样修改后,警告就会消失,拟合过程也能正常完成。
内容的提问来源于stack exchange,提问作者pfl1001
相关产品推荐
相关产品推荐

