使用NumPy Polynomial拟合数据出现异常结果的技术咨询
问题原因与解决办法
这是因为numpy.polynomial.Polynomial.fit()方法默认会对输入的自变量x做标准化处理——它会把原始x值映射到[-1, 1]区间,目的是提升高次多项式拟合时的数值稳定性。你看到的多项式系数是基于标准化后的x变量计算的,并非原始x的系数,这就导致了看似矛盾的现象:
- 打印出的
2.0 + 2.0x + ...是标准化变量下的多项式表达式 - 调用
x.call(0)时,方法会自动将输入的0转换回标准化前的原始坐标计算,所以结果接近0,符合f(x)=x的预期
验证与解决方法
1. 查看标准化参数
可以通过以下代码查看标准化的区间范围:
print(x.domain) # 输出原始x的范围:[0. 4.] print(x.window) # 输出标准化后的目标范围:[-1. 1.]
2. 关闭标准化,直接拟合原始坐标
如果不需要标准化带来的数值优化,调用fit时指定domain=None参数,就能得到基于原始x的系数,和预期的f(x)=x完全一致:
import numpy as np from numpy.polynomial import Polynomial x = Polynomial.fit([0,1,2,3,4], [0,1,2,3,4], 4, domain=None) print(x) # 输出:0.0 + 1.0 x + 0.0 x² + 0.0 x³ + 0.0 x⁴ print(x.call(0)) # 输出:0.0
3. 保留稳定性,转换回原始坐标系数
如果需要保留标准化的数值稳定性,同时想得到原始x对应的多项式系数,可以使用convert方法转换:
orig_poly = x.convert(domain=[0,4]) print(orig_poly) # 输出接近0.0 + 1.0x的多项式,高次项为极小浮点误差,可忽略
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

