乍一看,文档似乎表明它们应该给出相同的结果 -
numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)
最小二乘多项式拟合。
将度为 deg 的多项式 p(x) = p[0] * x**deg + ... + p[deg] 拟合到点 (x, y)。返回一个系数向量 p,以 deg, deg-1, ... 0 的顺序最小化平方误差。
和
numpy.polynomial.polynomial.polyfit(x, y, deg, rcond=None, full=False, w=None)
多项式与数据的最小二乘拟合。
返回 deg 多项式的系数,该多项式是与在点 x 处给定的数据值 y 拟合的最小二乘。如果 y 是一维的,则返回的系数也将是一维的。如果 y 是 2-D 多次拟合,则对 y 的每一列进行一次拟合,结果系数存储在 2-D 返回的相应列中。拟合多项式的形式为
p(x) = c0 + c1 * x + ... + cn * xn
但区别在于两种方法返回的系数的顺序,至少对于所讨论的用例而言。
-
numpy.polyfit 根据生成方程以降序的程度返回系数
p(x) = cn * xn + c(n-1) * x(n-1) sup> + ... + c1 * x + c0
-
numpy.polynomial.polynomial.polyfit 根据生成方程以 升序 的程度返回系数
p(x) = c0 + c1 * x + ... + c(n-1) * x( n-1) + cn * xn
虽然在数学上相同,但这两个方程在ndarray 表示中并不相同。这可能会因在文档中使用不同的符号而被混淆。为了演示,请考虑以下
import numpy as np
x = np.linspace(0, 10, 50)
y = x**2 + 5 * x + 10
print(np.polyfit(x, y, 2))
print(np.polynomial.polynomial.polyfit(x, y, 2))
[ 1. 5. 10.]
[10. 5. 1.]
两种方法得到相同的结果,但顺序相反,前者是np.poly1d() 所期望的,
print(np.poly1d(np.polyfit(x, y, 2)))
print(np.poly1d(np.polynomial.polynomial.polyfit(x, y, 2)))
2
1 x + 5 x + 10
2
10 x + 5 x + 1
后者是 np.polynomial.polynomial.Polynomial() 构造函数所期望的。,
print(np.polynomial.polynomial.Polynomial(np.polynomial.polynomial.polyfit(x, y, 2)))
print(np.polynomial.polynomial.Polynomial(np.polyfit(x, y, 2)))
poly([10. 5. 1.]) # 10 + 5 * x + 1 * x**2
poly([ 1. 5. 10.]) # 1 + 5 * x + 10 * x**2
Flipping 将来自np.polynomial.polynomial.polyfit 的结果传递给poly1d() 或使用np.polynomial.polynomial.Polynomial 将产生预期的结果: