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数组时,它只会返回系数。
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数组时,它只会返回系数。
您可以直接调用结果系列来评估它:
from numpy.polynomial import Polynomial
poly = Polynomial.fit(x, y, 3)
new_y = poly(new_x)
请查看这个文档页面,其中有几个示例。
不幸的是,@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
。
如果我们想在点0
和1
(x = np.asarray([0, 1])
)处进行评估,我们期望分别得到4.6
和8.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()
函数提供正确的window
和domain
参数,或者可能还有其他方法。
如果有人知道这样的方法,欢迎编辑我的当前答案并添加你的代码。
calibrationCurve(x)
是正确的。问题在于你缺少了多项式的(奇怪、令人困惑、甚至没有在 format
输出中显示的)domain
和 window
。 - user2357112calibrationCurve
看起来像是y = 3.5x + 4.6。拟合的多项式看起来很奇怪,因为numpy.polynomial.Polynomial.fit
涉及自动输入缩放步骤,并且这种缩放被编码在Polynomial
对象的domain
和window
中。 - user2357112calibrationCurve(x)
将多项式应用于新的输入时,在评估多项式之前会应用相同的转换。 - user2357112converted_polynomial = calibrationCurve.convert()
。如果您这样做并检查结果,您会发现结果表示一个多项式 x + 0.1。 - user2357112