使用numpy拟合y=ax²+bx(c=0)时deg=[1,2]参数异常问题
Numpy多项式拟合强制过零点异常问题解答
问题根因
- 返回三个系数属于框架正常设计:
numpy.polynomial.polynomial.Polynomial的coef数组下标严格对应多项式的幂次,coef[0]对应x0(常数项)、`coef[1]`对应x1、coef[2]对应x^2。你指定deg=[1,2]时,常数项会被强制固定为0,因此返回的三个系数第一位固定为0,后两位就是你需要的一次项系数b和二次项系数a。 - 拟合效果差的核心原因是样本和约束冲突:你强制要求多项式过零点(x=0时y=0),但你提供的实测样本中x=0对应的y值为2~5,并非0。模型为了满足过零点的约束,只能牺牲其他样本点的拟合精度,最终导致整体偏差变大。
解决方案
如果你的应用场景理论上确实要求多项式必须过零点,说明x=0处的2~5属于测量噪声,可选择以下两种方案优化拟合效果:
- 拟合时移除x=0对应的样本点,再用
deg=[1,2]参数拟合 - 拟合时给x=0的点设置极低的权重,降低噪声对整体拟合结果的影响
修正后可运行代码
import numpy as np from numpy.polynomial.polynomial import Polynomial as p x = np.array([0, .1, .5, 1, 2]) y_series = np.array([[2, 319, 1693, 3713, 8695], [3, 327, 1828, 4131, 10111], [3, 304, 1653, 3617, 8678], [4,300,1675,3745,8922], [3, 298,1661,3653,8694], [5, 304,1642,3686,8670], [3, 313,1688,3724,8657], [5, 315,1736,3821,8963], [3, 247,1300,2767,6376] ]) # 方案1:移除x=0样本点拟合 x_no_zero = x[1:] for y in y_series: print('x: ', x,'y: ', y) print('原deg=2拟合系数: ', p.fit(x, y, deg=2).convert().coef) y_no_zero = y[1:] coef = p.fit(x_no_zero, y_no_zero, deg=[1,2]).convert().coef print('deg=[1,2](移除x=0点)拟合系数: ', coef) print(f"拟合公式:y = {coef[2]:.2f}x² + {coef[1]:.2f}x") # 方案2:低权重处理x=0点拟合 weights = np.array([0.01, 1, 1, 1, 1]) coef_weighted = p.fit(x, y, deg=[1,2], w=weights).convert().coef print('deg=[1,2](低权重处理x=0点)拟合系数: ', coef_weighted) print('')
内容的提问来源于stack exchange,提问作者Beat
相关产品推荐
相关产品推荐

