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

使用numpy Polynomial.fit(deg=0)获意外结果,如何用其得到接近0的delta?

numpy Polynomial.fit 拟合偏差问题解答

问题场景

使用np.polynomial.polynomial.Polynomial.fit对数组f和s拟合时:

  • deg=1得到的截距delta接近0、斜率ratio接近1,符合预期;
  • deg=0得到的常数项delta数值过大(约912),但手动计算np.mean(s - f)得到的结果接近0(约-1.49)。

疑问:是否可以通过Polynomial.fit(无论是否使用deg=0)得到这个接近0的delta值?

代码复现:

import numpy as np

f = np.array(
    [481.62900766, 511.94542042, 647.40216379, 686.10402156, 849.9420538, 888.64398048, 1029.26087049, 1071.18799217,
     1210.51481107, 1266.63254274, 1409.54282743])
s = np.array(
    [457.90057373, 520.90911865, 666.19372559, 709.64898682, 862.48828125, 892.19934082, 1031.70675659, 1063.03643799,
     1206.41647339, 1239.6506958, 1386.23660278])

# deg=1拟合
series1 = np.polynomial.polynomial.Polynomial.fit(f, s, deg=1)
delta, ratio = series1.convert().coef
print(delta, ratio)  # delta=24.729..., ratio=0.9713...

# deg=0拟合(不符合预期)
series0 = np.polynomial.polynomial.Polynomial.fit(f, s, deg=0)
delta = series0.convert().coef[0]
print(delta)  # delta=912.398...

# 手动计算目标delta
delta = np.mean(s - f)
print(delta)  # delta=-1.4926...

核心原因

deg=0的拟合模型是s = delta(与f无关的常数模型),因此得到的delta是s的均值;而你需要的是s = f + delta这个模型的delta,即最小化sum((s - (f + delta))²)的最优解,此时delta等于np.mean(s - f),二者是完全不同的统计量。

另外,Polynomial.fit默认会对输入的x(f)做标准化处理(映射到[-1,1]区间),但这对deg=0的结果无本质影响——转换回原尺度后,结果仍是s的均值。

解决方案

可以通过Polynomial.fit直接得到目标delta,只需调整拟合的目标变量:

# 拟合 s - f = delta(常数模型),x用f不影响deg=0的拟合结果
series_target = np.polynomial.polynomial.Polynomial.fit(f, s - f, deg=0)
delta_target = series_target.convert().coef[0]
print(delta_target)  # 输出 -1.4926089272727112,与手动计算结果一致

该方法本质是对s - f拟合常数项,而常数项的最优解就是其均值,正好符合你的需求。


内容的提问来源于stack exchange,提问作者Dženan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:34:53