如何使用NumPy 1.4的多项式类拟合数值

6
如何使用numpy中的新多项式子包来给定新的x值,并获得y值输出? https://numpy.org/doc/stable/reference/routines.polynomials.package.html 在早期版本的numpy中,它大致是这样的:
poly = np.poly1d(np.polyfit(x, y, 3)
new_x = np.linspace(0, 100)
new_y = poly(new_x)

我正在努力给出一些x值,以便得到每个y值的新版本?

from numpy.polynomial import Polynomial

poly = Polynomial(Polynomial.fit(x, y, 3))

当我给它一个x数组时,它只会返回系数。


rh109019,有没有什么进展可以分享?我也卡在这里了。谢谢。 - H.L.
1
@H.L. - 下面有一个用户回答得很正确。没有必要在Polynomial中包装fit方法。您可以拟合,然后使用新的x数组调用对象,它将返回一个y值数组。 - rh109019
2个回答

5

您可以直接调用结果系列来评估它:

from numpy.polynomial import Polynomial
poly = Polynomial.fit(x, y, 3)

new_y = poly(new_x)

请查看这个文档页面,其中有几个示例。


-2

不幸的是,@Joan Charmant的回答和支持性评论@rh109019无法解决问题。

@Joan Charmant提出的直觉方法基本上就是这个问题的关键:它行不通。

显然,在numpy.polynomial.polynomial中引入了一种新的方法专门用于评估多项式。请参见 here

以下是我的代码,我正在比较这两种方法。

import numpy as np

Pgauge = np.asarray([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0])
NIST = np.asarray([1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1])

calibrationCurve = np.polynomial.polynomial.Polynomial.fit(Pgauge,
                                                           NIST,
                                                           deg=1
)

print("The polynomial: {}".format(calibrationCurve))

x = np.asarray([0, 1]) # values of x to evaluate the polynomial at
c = calibrationCurve.coef # coefficients of the polynomial

print("The intuitive (wrong) way: {}".format(calibrationCurve(x)))
print("The correct way: {}".format(np.polynomial.polynomial.polyval(x, c)))

第一个print命令打印出多项式:4.6+3.5x

如果我们想在点01x = np.asarray([0, 1]))处进行评估,我们期望分别得到4.68.1

第二个print命令(读作“直观(错误)的方法”)使用了@Joan Charmant建议的方法。它给出[0.1, 1.1]作为结果。这是错误的。虽然看起来似乎没问题:它给出了两个预期的数字。但这些数字本身是错误的。我不知道这些数字是如何计算出来的。但如果我有一系列更大的数据,我不会通过计算器进行计算并假设我得到了正确的结果。

最后一个print命令使用了我引用的用户手册中建议的polyval方法。它完美地工作。它给出[4.6, 8.1]作为结果。



恰好我的答案也是错误的(请参见下面所有由@user2357112支持Monica的评论)。

但是,我仍然会将其留在这里,供像我一样受到混乱的新numpy.polynomial库影响的人们使用。

首先:为什么我的代码是错的?

它的一切都很好。但是,行print("The polynomial: {}".format(calibrationCurve))没有给我我认为应该给我的东西。它获取了正确的多项式,以某种方式更改其系数,并打印出具有更改系数的新多项式。但是,它确实将正确的多项式存储在其内存中,当您执行@Joan Charmant建议的操作时,如果您正确地询问它,它可能会给您正确的答案。

第二:如何使用新的numpy.polynomial库以获得正确的结果?

由于这种特殊性,您必须引入一行新代码。即,执行Polynomial.fit(),然后立即使用.convert()方法。然后仅使用转换后的多项式进行操作。

这是现在可以正常工作的代码。

import numpy as np

Pgauge = np.asarray([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0])
NIST = np.asarray([1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1])

calibrationCurveMessedUp = np.polynomial.polynomial.Polynomial.fit(Pgauge,
                                                                   NIST,
                                                                   deg=1
)

calibrationCurve = calibrationCurveMessedUp.convert()

print("The polynomial: {}".format(calibrationCurve))
print("The rounded polynomial coefficients: {}".format(calibrationCurve.coef))

x = np.asarray([0, 1]) # values of x to evaluate the polynomial at
print(calibrationCurve(x))

第三点:小提示。

显然,有可能在不需要额外的代码行的情况下获得正确的多项式。也许你必须给Polynomial.fit()函数提供正确的windowdomain参数,或者可能还有其他方法。

如果有人知道这样的方法,欢迎编辑我的当前答案并添加你的代码。


1
不,calibrationCurve(x) 是正确的。问题在于你缺少了多项式的(奇怪、令人困惑、甚至没有在 format 输出中显示的)domainwindow - user2357112
1
如果您自己适配这些输入和输出(很容易,因为它只是一个简单的线性函数),您会发现关系是y = x + 0.1,远离calibrationCurve看起来像是y = 3.5x + 4.6。拟合的多项式看起来很奇怪,因为numpy.polynomial.Polynomial.fit涉及自动输入缩放步骤,并且这种缩放被编码在Polynomial对象的domainwindow中。 - user2357112
1
多项式表示对转换后的输入进行拟合,使用 calibrationCurve(x) 将多项式应用于新的输入时,在评估多项式之前会应用相同的转换。 - user2357112
1
请参阅此文档部分,了解有关“窗口”和“域”的动机的更多信息。 - user2357112
1
要得到一个没有缩放和移位的多项式,您可以使用 converted_polynomial = calibrationCurve.convert()。如果您这样做并检查结果,您会发现结果表示一个多项式 x + 0.1。 - user2357112
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接