You need to enable JavaScript to run this app. Python多项式回归模型曲线拟合输出结果错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Python多项式回归模型曲线拟合输出结果错误如何解决

问题原因
  • 参数打印截断损失精度:你打印拟合参数时只保留了5位小数,实际curve_fit返回的popt变量中存储的是双精度高精度浮点数,手动抄写截断后的参数代入计算时,误差会被年份的大数值以及平方运算放大,最终得到完全不符合实际的结果。而你绘图时直接调用了原始高精度参数计算拟合值,所以曲线看起来和样本点吻合。
  • 自变量量级过大导致数值不稳定:你的输入自变量是1998~2019的年份值,一次项x的量级为10³,二次项x²的量级为10⁶,两者差了3个数量级,拟合求解过程的数值稳定性差,参数的低位数值精度本身就偏低,打印截断后误差会进一步放大。
解决方法
  1. 直接使用原始拟合参数计算
    不要手动抄写打印的截断参数,直接调用拟合函数传入原始popt参数计算目标值:
# 计算2015年对应人口,直接用原始参数,避免截断误差
y_2015 = objective(2015, *popt)
print(y_2015)
  1. 对自变量做偏移处理(更推荐)
    把年份转换为相对起始年份的偏移量,缩小自变量数值范围,大幅提升拟合稳定性,修改后的完整代码如下:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 16:36:04