使用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
相关产品推荐
相关产品推荐

