如何使用(n-1)-degree多项式拟合n个数据点

时间:2016-08-22 07:30:54

标签: python-2.7 numpy

我试图将5个数据点拟合到4度多项式。这是我的代码:

linex = array([1,2,3,4,5])
liney = array([23.0, 28.521, 36.31542, 49.2312312, 78.231312])
p,sp = polyfit(linex, liney, deg=4, cov=True)
print p
print sp

当我尝试运行那么简单的事情时,我得到了

  

ValueError:操作数无法与形状(5,5)(0,)

一起广播

据说polyfit中的polynomial.py中的第608行是错误的,其中

return c, Vbase*fac

如果我改变deg = 3,那么拟合就有效,但这不是我想要的。数组linexliney都有5个点。简短的搜索没有找到解决我的问题的解决方案。

1 个答案:

答案 0 :(得分:1)

内部polyfit使用Ax = yVandermonde matrix的最小二乘法找到解A方程式。对于4度和5度点,该等式具有精确解(A具有形状5x5,x - 5x1,y - 5x1)。在这种情况下,numpy.linalg.lstsq函数返回形状为()的numpy数组作为错误估计,而不是返回带有零的向量,polyfit中的代码无法识别。然而,cov矩阵(因为它现在在那里计算)将是零矩阵,即使它会认识到这一点。因此,为了解决这个问题,您可以假设代码中的cov矩阵是所有度deg >= number_of_points - 1的零矩阵,或者如果您不需要协方差矩阵,则只需调用polyfit(linex, liney, deg=4)

摘自文档:

polyfit

The solution minimizes the squared error

.. math ::
    E = \\sum_{j=0}^k |p(x_j) - y_j|^2

in the equations::

    x[0]**n * p[0] + ... + x[0] * p[n-1] + p[n] = y[0]
    x[1]**n * p[0] + ... + x[1] * p[n-1] + p[n] = y[1]
    ...
    x[k]**n * p[0] + ... + x[k] * p[n-1] + p[n] = y[k]

The coefficient matrix of the coefficients `p` is a Vandermonde matrix.

和numpy.linalg.lstsq:

Return the least-squares solution to a linear matrix equation.

Solves the equation `a x = b` by computing a vector `x` that
minimizes the Euclidean 2-norm `|| b - a x ||^2`.  The equation may
be under-, well-, or over- determined (i.e., the number of
linearly independent rows of `a` can be less than, equal to, or
greater than its number of linearly independent columns).  If `a`
is square and of full rank, then `x` (but for round-off error) is
the "exact" solution of the equation.

Parameters
----------
a : (M, N) array_like
    "Coefficient" matrix.
     

...返回:......       残差:{(),(1,),(K,)} ndarray           残差总和;平均每列的欧几里德2范数           b - a*x。           如果a的等级是&lt; N或M <= N,这是一个空数组。           如果b是1维的,则这是(1,)形状数组。           否则形状为(K,)。