Numpy多项式.Polynomial.fit()给出的系数与多项式.Polyfit()不同
问题描述
我不明白为什么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)
显然,一般而言,系数[a
,b
,c
,...]是关于多项式a + b * x + c * x**2 + ...
的。但是,关键字参数domain
和window
都是缺省的[-1,1]
。我不喜欢那个课程,所以我不确定目的是什么,但很明显,重新映射发生了。现在,在polynomial.Polynomial.fit()
的情况下,我们有一个类方法,它自动接受x
数据作为域,但仍然映射到窗口。因此,在OP中[0-10]
被映射到[-1,1]
。这是由x = x' / 5 - 1
或x' -> 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.])
相关文章