Numpy多项式类没有从拟合中打印正确的系数



根据numpy文档中的建议,我正在尝试从旧的polyfitpolyval函数转移到Polynomial类。下面是一个简单的例子,说明我对此感到困惑。

import numpy as np
x = np.array([-2.3, -2.8, -2.9, -3.1])
y = np.array([2.4, 3.1, 3.3, 3.5])
poly = np.polynomial.Polynomial.fit(x, y, 1)
print(poly)
print(poly.coef)
print(poly(0))
print(poly(1) - poly(0))

它给出输出,运行numpy 1.23.3,

2.9697841726618703 - 0.5611510791366912·x¹
[ 2.96978417 -0.56115108]
-0.8179856115107942
-1.4028776978417268

从前两条线来看,拟合多项式大约是2.969-0.561x。但在x=0时对其进行评估会得到-0.817,用f(1(-f(0(对斜率进行评估会得出-1.40。考虑到我所适合的点,后者是我所期望的,但前两行输出发生了什么?

如果查看文档,您会发现多项式对象还有两个字段:poly.domainpoly.window。为了获得更好的数值性质,fit()输入的范围自变量将被重新规范化为[-1, 1](至少在默认情况下,这是你可以自己设置的poly.window(,因此你从poly.coef获得的系数在该重新规范化域上有效。为了取回";原始的";系数,你必须撤消规范化,就像我在下面的片段中所做的那样。你也可以从另一个方向对x值进行归一化,我也将其包含在这个片段中:

import matplotlib.pyplot as plt
plt.plot(t, c[0] + c[1]*t)  # line in the normalized domain
#x_normalized = (x - d[0])/(d[1] - d[0]) * 2 - 1  # points in the normalized domain
a = 2/(d[1]-d[0])
b = - 2*d[0]/(d[1]-d[0]) - 1
x_normalized = a*x + b
print('original coefficients')
print(a*c[1], c[1]*b + c[0])
plt.plot(x_normalized, y, 'o')
plt.show()

最新更新