我正在使用numpy.polynomial.polynomial.Polynomial
类(Numpy库)以使方法fit()
符合多项式函数的某些数据。获得的多项式是正确的,我可以绘制它并替换点以获得'y'值,并得到正确的响应。问题是.coef
类的Polynomial
属性返回一组以某种方式归一化或改变的系数,我不知道如何。我的意思是什么?代码如下:
x_vid = array([0.0, 50.0, 75.0, 100.0])
y_vid = array([0.0, 30.0, 55.0, 100.0])
pol = Polynomial.fit(x_vid, y_vid, 5) # The polynomial is OK!!
print pol.coef
.coef
属性返回下一个数组:
30 38.16 17.93 9.98 2.06 1.85
系数按升序排列,因此这些系数代表以下多项式函数:
30 + 38.16x + 17.93x ^ 2 + 9.98x ^ 3 + 2.06x ^ 4 + 1.85x ^ 5
然而,问题就出现了,如果我从我的值范围[0-100]中替换任何值,它将不会返回正确的值,尽管如果我这样做的话:
pol(0)
→我会得到一个0,这是正常的,但很明显,在我写的多项式中,它不会在x = 0时返回0。
我认为多项式函数可能被归一化或移位。我可能在这里遇到一个数学问题,而不是编程问题,但任何帮助都非常受欢迎,因为我需要写下多项式,我不确定它的正确形式。感谢。
答案 0 :(得分:1)
Ruips。
您的示例有三个问题:
您仅使用四个数据点拟合五阶多项式。这是一个不确定的情况,它可能会产生RankWarnings。但这是偶然的,而不是问题的主要部分。
您希望pol(0)
的工作方式与numpy.polyval
相同,但并非如此。{li>
我实际上不确定它的作用。该类提供了__call__
,这使得pol(0)
可以工作,但据我所知,没有可调用的文档(请参阅Polynomial docs)。 numpy.polynomial.polynomial
包含自己的polyval
版本。我将测试它,np.polyval
和自制版本test_polyval
。
最重要的是,Polynomial
班级的系数与numpy.polyfit
和numpy.polyval
不同。在Polynomial
中,如您所述,最高阶系数在列表/数组中是最后一个。但是,在numpy
函数中,最高阶系数是第一个(参见polyval docs)。
下面的代码片段说明了如何在任意一组x值下评估Polynomial
对象所表示的多项式,并且还显示为了从numpy.polyval
中获得相同的行为,你必须使用coef[::-1]
来反转系数的顺序。我可以等效地使用numpy.fliplr
来反转系数顺序。
import numpy as np
from numpy.polynomial.polynomial import Polynomial,polyval
from numpy import array
import sys
x_vid = array([0.0, 50.0, 75.0, 100.0])
y_vid = array([0.0, 30.0, 55.0, 100.0])
pol = Polynomial.fit(x_vid, y_vid, 5) # The polynomial is OK!!
# I've written this, which should do what numpy.polynomial.polynomial.polyval
# does, as a sanity check:
def test_polyval(polynomialInstance,xArray):
# check that xArray is a numpy.ndarray, using ndarray.shape
try:
y = np.zeros(xArray.shape)
except Exception as e:
sys.exit('polyval error: %s'%e)
# manually sum the polynomial terms on xArray
for exp,c in enumerate(polynomialInstance.coef):
y = y + c*x**exp
return y
# Define some random x values for testing, in the range of points used
# for fitting:
x = np.random.rand(100)*100
# Compute, using our own polyval function, then Polynomial.polyval,
# and finally using numpy.polyval, making sure to reverse the
# coefficient order for the last:
y_test_polyval = test_polyval(pol,x)
y_Polynomial_polyval = polyval(x,pol.coef)
y_numpy_polyval = np.polyval(pol.coef[::-1],x)
# Make sure the two results are within machine epsilon:
if np.allclose(y_test_polyval,y_numpy_polyval) and \
np.allclose(y_test_polyval,y_Polynomial_polyval):
print 'Hurray!'
答案 1 :(得分:1)
多项式系数用于缩放和偏移多项式,以提高数值稳定性。您可以转换为"正常"多项式,或者如果您将off + scl*x
替换为x
,off
返回scl
和pol.mapparms
,则直接使用该系列。要转换为标准表单(不推荐),请执行pol.convert(domain=[-1, 1])
。