Python多项式回归模型曲线拟合输出结果错误如何解决
问题原因
- 参数打印截断损失精度:你打印拟合参数时只保留了5位小数,实际
curve_fit返回的popt变量中存储的是双精度高精度浮点数,手动抄写截断后的参数代入计算时,误差会被年份的大数值以及平方运算放大,最终得到完全不符合实际的结果。而你绘图时直接调用了原始高精度参数计算拟合值,所以曲线看起来和样本点吻合。 - 自变量量级过大导致数值不稳定:你的输入自变量是1998~2019的年份值,一次项x的量级为10³,二次项x²的量级为10⁶,两者差了3个数量级,拟合求解过程的数值稳定性差,参数的低位数值精度本身就偏低,打印截断后误差会进一步放大。
解决方法
- 直接使用原始拟合参数计算
不要手动抄写打印的截断参数,直接调用拟合函数传入原始popt参数计算目标值:
# 计算2015年对应人口,直接用原始参数,避免截断误差 y_2015 = objective(2015, *popt) print(y_2015)
- 对自变量做偏移处理(更推荐)
把年份转换为相对起始年份的偏移量,缩小自变量数值范围,大幅提升拟合稳定性,修改后的完整代码如下:
import pandas as pd from numpy import arange from scipy.optimize import curve_fit from matplotlib import pyplot import numpy as np data = df.values x, y = data[:, 0], data[:, 1] # 年份偏移转换为距离1998年的年数,取值范围0~21 x_offset = x - 1998 def objective(x, a, b, c): return a * x + b * x ** 2 + c popt, _ = curve_fit(objective, x_offset, y) a, b, c = popt print('y = %.5f * x + %.5f * x^2 + %.5f' % (a, b, c)) pyplot.scatter(x, y) x_line = arange(min(x), max(x), 1) # 计算拟合值时对x做相同偏移处理 y_line = objective(x_line - 1998, a, b, c) pyplot.plot(x_line, y_line, '--', color='red') pyplot.show() # 计算2015年人口,先算偏移量2015-1998=17,代入即可 y_2015 = objective(17, *popt) print(y_2015)
修改后得到的参数数值都在常规范围内,即使保留5位小数手动计算也不会出现明显误差。
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

