【问题标题】:Error in coefficients for a polynomial using Numpy使用 Numpy 的多项式的系数误差
【发布时间】:2014-09-05 16:24:47
【问题描述】:

我正在使用numpy.polynomial.polynomial.Polynomial 类(Numpy 库),以便将fit() 某些数据的方法与多项式函数相匹配。获得的多项式是正确的,我可以绘制它并替换点以获得“y”值,并且我得到正确的响应。问题是Polynomial 类的.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。

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

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

【问题讨论】:

  • 您是否尝试过使用numpy.polyfit?另外,我没有得到与你相同的系数,我的系数要大两个数量级。
  • 感谢@darthbith 这两种方法应该非常相似,无论如何多项式拟合得很好,问题是编写多项式函数的系数。当时出于不同的原因,我已经修正了我除以 100 的两个数量级。
  • 我发现polyfit返回的系数是合理的,并且y截距与polyval(pol, 0)的值匹配。我不知道Polynomial.fit() 方法返回的系数是什么

标签: python python-2.7 numpy polynomial-math polynomials


【解决方案1】:

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

【讨论】:

  • 没错!非常感谢查尔斯哈里斯
【解决方案2】:

Ruips。

您的示例存在三个问题:

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

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

  3. 最重要的是,Polynomial 类对系数的排序不同于 numpy.polyfitnumpy.polyval。如您所述,在Polynomial 中,最高阶系数在列表/数组中位于最后。不过,在numpy 函数中,最高阶系数排在第一位(请参阅polyval docs)。

下面的代码 sn-p 说明了如何在任意 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!'

【讨论】:

  • 我还应该说,我在许多其他间隔(小于和大于 [0,100])上测试了两个 polyval 实现的相等性,并且它也适用于其他地方。我认为Polynomial 类和numpy.polyfit/numpy.polyval 在拟合方面存在差异,因为前者允许您指定计算残差的范围。
  • 另外,我确实找到了Polynomial.polyval。它就在我的眼皮底下:[docs.scipy.org/doc/numpy/reference/generated/….
  • 感谢您的完整回答,但查尔斯哈里斯回答的正是我的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
相关资源
最近更新 更多