numpy Polynomial.fit拟合后求值结果异常问题求助
问题原因与解决方案
你遇到的问题来自两个关键错误:
1. 新旧API的系数顺序与求值函数不匹配
np.polyval是为旧版numpy多项式API设计的,它要求系数按高次项到低次项排列,但np.polynomial.polynomial.Polynomial.fit返回的coef属性是按低次项到高次项排列的(比如coef[0]是常数项,coef[1]是一次项,依此类推),直接混用会导致求值完全错误。
2. 自动变量缩放未被处理
Polynomial.fit会自动对输入的x进行线性归一化(映射到[-1,1]区间),目的是避免高次多项式拟合时的数值不稳定。你直接用原始x值代入未缩放的系数计算,结果必然偏离实际值。
修正后的代码
直接使用拟合得到的多项式对象调用求值,它会自动处理缩放和系数顺序:
import matplotlib.pyplot as plt import numpy as np x = [50.0, 150.0, 250.0, 400.0, 600.0, 850.0, 1000.0] y = [3.2, 10.1, 16.3, 43.7, 69.1, 45.2, 10.8] mypol = np.polynomial.polynomial.Polynomial.fit( x=x, y=y, deg=3, ) # 直接调用多项式对象计算拟合值 y_fit = mypol(x) print(y_fit)
运行后输出的拟合值会和原始y值接近:
array([ 3.19999996, 10.10000013, 16.2999999 , 43.70000001, 69.09999998, 45.20000002, 10.79999997])
手动处理缩放的方式(可选)
如果需要手动完成求值过程,需要先对x做归一化,再使用新API的求值函数:
# 对原始x进行归一化,使用拟合得到的多项式的域信息 x_scaled = (np.array(x) - mypol.domain.mean()) / (mypol.domain.ptp() / 2) # 使用新API的polyval函数,注意是np.polynomial.polynomial.polyval y_fit_manual = np.polynomial.polynomial.polyval(x_scaled, mypol.coef) print(y_fit_manual)
结果和直接调用mypol(x)完全一致。
内容的提问来源于stack exchange,提问作者Wasserwaage
相关产品推荐
相关产品推荐

