numpy polynomial.Polynomial.fit() 给出的系数与 polynomial.polyfit() 不同

man*_*466 6 python numpy curve-fitting polynomials

我不明白为什么polynomial.Polynomial.fit()给出的系数与预期系数非常不同:

import numpy as np

x = np.linspace(0, 10, 50)
y = x**2 + 5 * x + 10

print(np.polyfit(x, y, 2))
print(np.polynomial.polynomial.polyfit(x, y, 2))
print(np.polynomial.polynomial.Polynomial.fit(x, y, 2))
Run Code Online (Sandbox Code Playgroud)

给出:

import numpy as np

x = np.linspace(0, 10, 50)
y = x**2 + 5 * x + 10

print(np.polyfit(x, y, 2))
print(np.polynomial.polynomial.polyfit(x, y, 2))
print(np.polynomial.polynomial.Polynomial.fit(x, y, 2))
Run Code Online (Sandbox Code Playgroud)

前两个结果都可以,感谢这个答案,我明白为什么两个数组的顺序相反。

但是,我不明白第三个结果的含义。尽管我以这种方式得到的多项式似乎给出了正确的预测值,但系数看起来是错误的。

mik*_*ski 6

当然,答案稍微隐藏在文档中。很class numpy.polynomial.polynomial.Polynomial(coef, domain=None, window=None) 明显,一般来说,系数 [ a, b, c, ...] 用于多项式a + b * x + c * x**2 + ...。但是,有关键字参数domain并且window都带有 default [-1,1]。我不喜欢那个课程,所以我不确定其目的,但很明显发生了重新映射。现在,有polynomial.Polynomial.fit()一种类方法可以自动将x数据作为域,但仍然映射到窗口。因此,在 OP 中[0-10]被映射到[-1,1]。这是由x = x' / 5 - 1或完成的x' -> 5 * x + 5。将后者代入OP多项式我们得到

( 5 x' + 5 )**2 + 5 * ( 5 * x' + 5 ) + 10 = 25 * x'**2 + 75 * x' + 60

瞧。

为了获得预期的结果,必须输入

print(np.polynomial.polynomial.Polynomial.fit(x, y, 2, window=[0, 10] ) )
Run Code Online (Sandbox Code Playgroud)

这给了

poly([10.  5.  1.])
Run Code Online (Sandbox Code Playgroud)