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 + ...。但是,有关键字参数domainwindow 都默认为[-1,1]。我不属于那个班级,所以我不确定目的,但很明显发生了重新映射。现在在polynomial.Polynomial.fit() 的情况下,一个类方法自动将x 数据作为域,但仍然映射到窗口。因此,在 OP 中,[0-10] 映射到 [-1,1]。这是由x = x' / 5 - 1x' -> 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() 不同的主要内容,如果未能解决你的问题,请参考以下文章

Numpy学习

Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组split函数垂直拆分二维numpy数组

numpy使用np.printoptions函数抑制numpy对于长numpy数组的自动省略显示numpy数组中的所有数据

Python使用numpy函数hsplit水平(按列)拆分numpy数组(返回拆分后的numpy数组列表)实战:水平(按列)拆分二维numpy数组split函数水平(按列)拆分二维numpy数组

NumPy学习——numpy初级

numpy 使用