2

我正在使用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。

我认为多项式函数可能被归一化或置换。我可能在这里面临一个数学问题而不是编程问题,但是任何帮助都是非常受欢迎的,因为我需要写下多项式并且我不确定它的正确形式。谢谢。

更多信息: http ://docs.scipy.org/doc/numpy/reference/generated/numpy.polynomial.polynomial.Polynomial.html#numpy.polynomial.polynomial.Polynomial

4

2 回答 2

4

多项式系数用于缩放和偏移多项式,以提高数值稳定性。您可以转换为“正常”多项式,或者如果您替换off + scl*xxwhereoffscl由 . 返回,则直接使用该系列pol.mapparms。要转换为标准格式(不推荐),请执行pol.convert(domain=[-1, 1]).

于 2014-09-07T17:45:04.310 回答
1

废墟。

您的示例存在三个问题:

  1. 您正在拟合只有四个数据点的五阶多项式。这是一个不确定的情况,它可能会产生 RankWarnings。不过,这是偶然的,而不是您问题的主要部分。

  2. 您希望pol(0)像 一样工作numpy.polyval,但事实并非如此。我实际上不确定它的作用。该类提供了 a __call__,它可以pol(0)工作,但据我所知,没有可调用的文档(请参阅Polynomial docs)。numpy.polynomial.polynomial包含自己的polyval. 我将对其进行测试,np.polyval并与自制版本test_polyval一起测试。

  3. 最重要的是,Polynomial类对系数的排序与numpy.polyfit和不同numpy.polyval。正如您所描述的,在Polynomial列表/数组中,最高阶系数位于最后。但是,在numpy函数中,最高阶系数是第一位的(请参阅polyval 文档)。

下面的代码片段说明了如何Polynomial在任意一组 x 值处评估由您的对象表示的多项式,并且还表明为了从 中获得相同的行为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!'
于 2014-09-05T22:31:01.443 回答