我试图将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
,那么拟合就有效,但这不是我想要的。数组linex
和liney
都有5个点。简短的搜索没有找到解决我的问题的解决方案。
答案 0 :(得分:1)
内部polyfit使用Ax = y
为Vandermonde 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,)。