You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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属于测量噪声,可选择以下两种方案优化拟合效果:

  1. 拟合时移除x=0对应的样本点,再用deg=[1,2]参数拟合
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:54:03