Python 使用Numpy的多项式系数误差

Python 使用Numpy的多项式系数误差,python,python-2.7,numpy,polynomial-math,polynomials,Python,Python 2.7,Numpy,Polynomial Math,Polynomials,我正在使用numpy.polynomy.polynomy.polynomy类(numpy库),以便使用方法fit()将某些数据拟合为多项式函数。得到的多项式是正确的,我可以绘制它并替换点,以得到“y”值,我得到正确的响应。问题是多项式类的.coef属性返回一组以某种方式规范化或更改的系数,我看不出是如何实现的。我是什么意思?守则如下: x_vid = array([0.0, 50.0, 75.0, 100.0]) y_vid = array([0.0, 30.0, 55.0, 100.0]) p

我正在使用
numpy.polynomy.polynomy.polynomy
类(numpy库),以便使用方法
fit()
将某些数据拟合为多项式函数。得到的多项式是正确的,我可以绘制它并替换点,以得到“y”值,我得到正确的响应。问题是
多项式
类的
.coef
属性返回一组以某种方式规范化或更改的系数,我看不出是如何实现的。我是什么意思?守则如下:

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

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

更多信息: Ruips

您的示例存在三个问题:

  • 你正在拟合一个只有四个数据点的五阶多项式。这是一个决策不足的案例,很可能会产生兰克瓦宁。不过,这是偶然的,而不是问题的主要部分

  • 您希望
    pol(0)
    numpy.polyval
    一样工作,但它没有。我真的不知道它是干什么的。该类提供了一个
    \uuuu调用
    ,这使得
    pol(0)
    可以工作,但据我所知,没有可调用的文档(请参阅)
    numpy.polymonery.polymonery
    包含自己版本的
    polyval
    。我将一起测试它,
    np.polyval
    和一个自制的版本
    test\u polyval

  • 最重要的是,
    多项式
    类对系数的排序不同于
    numpy.polyfit
    numpy.polyval
    。在
    多项式中
    ,如您所述,最高阶系数是列表/数组中的最后一个。但是,在
    numpy
    函数中,最高阶系数排在第一位(请参阅)

  • 下面的代码片段说明了如何在任意一组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!'
    

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

    是否尝试使用?此外,我得到的系数与你的系数不同,我的系数比你的系数大两个数量级。感谢@darthb这两种方法应该非常相似,不管怎样,多项式拟合得很好。问题是编写多项式函数的系数。我当时出于不同的原因修正了我除以100的两个数量级。我发现
    polyfit
    返回的系数是合理的,y截距与
    polyval(pol,0)
    的值相匹配。我不知道从
    polynomic.fit()方法返回的系数是什么。我还应该说,我在许多其他时间间隔(小于或大于[0100])上测试了两个
    polyval
    实现的相等性,它在其他地方也可以工作。我认为
    多项式
    类和
    numpy.polyfit
    /
    numpy.polyval
    在拟合方面存在差异,因为前者允许您指定计算剩余误差的范围。此外,我还找到了
    多项式.polyval
    。它就在我眼前:[谢谢你完整的回答,但查尔斯·哈里斯的回答完全符合我的要求。完全正确!非常感谢查尔斯·哈里斯