Numpy多项式.Polynomial.fit()给出的系数与多项式.Polyfit()不同

2022-05-23 00:00:00 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))

给予:

[ 1.  5. 10.]
[10.  5.  1.]
poly([60. 75. 25.])

前两个结果都是正常的,感谢this answer我理解了为什么这两个数组的顺序相反。

然而,我不明白第三个结果的意义。系数看起来是错的,虽然我用这种方法得到的多项式似乎给出了正确的预测值。


解决方案

当然,答案稍微隐藏在文档中。查看class numpy.polynomial.polynomial.Polynomial(coef, domain=None, window=None) 显然,一般而言,系数[abc,...]是关于多项式a + b * x + c * x**2 + ...的。但是,关键字参数domainwindow都是缺省的[-1,1]。我不喜欢那个课程,所以我不确定目的是什么,但很明显,重新映射发生了。现在,在polynomial.Polynomial.fit()的情况下,我们有一个类方法,它自动接受x数据作为域,但仍然映射到窗口。因此,在OP中[0-10]被映射到[-1,1]。这是由x = x' / 5 - 1x' -> 5 * x + 5完成的。把后者放在运算多项式中,我们得到

( 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] ) )

其中

poly([10.  5.  1.])

相关文章