numpy polynomial.Polynomial.fit() 给出的系数与 polynomial.polyfit() 不同
Posted
技术标签:
【中文标题】numpy polynomial.Polynomial.fit() 给出的系数与 polynomial.polyfit() 不同【英文标题】:numpy polynomial.Polynomial.fit() gives different coefficients than polynomial.polyfit() 【发布时间】:2021-07-26 00:33:59 【问题描述】:我不明白为什么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.])
前两个结果都OK,感谢this answer我明白为什么两个数组顺序相反了。
但是,我不明白第三个结果的含义。尽管我以这种方式得到的多项式似乎给出了正确的预测值,但系数看起来是错误的。
【问题讨论】:
【参考方案1】:当然,答案稍微隐藏在文档中。看着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
完成的。将后者置于 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] ) )
给了
poly([10. 5. 1.])
【讨论】:
我已经通过使用domain=[]
获得了预期的结果,但我仍然不明白默认结果。你的解释很清楚。
在文档中说:“在 NumPy 1.4 中默认值为类域,在更高版本中为无”。我不知道他们为什么要更改它,以便默认值现在给出正确但意外的结果。【参考方案2】:
隐藏在文档中:
请注意,系数是在由窗口和域之间的线性映射定义的缩放域中给出的。 convert 可用于获取未缩放数据域中的系数。
所以使用:
poly.convert()
这会将您的系数重新调整为您可能期望的值。
从 1 + 2x + 3x^2 生成的数据示例:
from numpy.polynomial import Polynomial
test_poly = Polynomial.fit([0, 1, 2, 3, 4, 5],
[1, 6, 17, 34, 57, 86],
2)
print(test_poly)
print(test_poly.convert())
输出:
poly([24.75 42.5 18.75])
poly([1. 2. 3.])
【讨论】:
以上是关于numpy polynomial.Polynomial.fit() 给出的系数与 polynomial.polyfit() 不同的主要内容,如果未能解决你的问题,请参考以下文章
Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组split函数垂直拆分二维numpy数组
numpy使用np.printoptions函数抑制numpy对于长numpy数组的自动省略显示numpy数组中的所有数据
Python使用numpy函数hsplit水平(按列)拆分numpy数组(返回拆分后的numpy数组列表)实战:水平(按列)拆分二维numpy数组split函数水平(按列)拆分二维numpy数组