numpy.polyfit与numpy.polynomial.polynomial.polyfit的区别

11
为什么在以下测试中,numpy.polyfitnumpy.polynomial.polynomial.polyfit 会产生不同的图形?
import numpy as np
from numpy.polynomial.polynomial import polyfit
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 50)
y = 5 * x + 10 + (np.random.random(len(x)) - 0.5) * 5

plt.scatter(x, y,marker='.', label='Data for regression')
plt.plot(x, np.poly1d(np.polyfit(x, y, 1))(x), label='numpy.polyfit')
plt.plot(x, np.poly1d(polyfit(x, y, 1))(x), label='polynomial.polyfit')
plt.legend()
plt.show()

输入图像描述

1个回答

27
乍一看,文档似乎表明它们应该给出相同的结果-
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,该向量按顺序minimises平方误差deg、deg-1、… 0。

numpy.polynomial.polynomial.polyfit(x, y, deg, rcond=None, full=False, w=None)
将多项式最小二乘拟合到数据上。
返回一个多项式系数,其次数为deg,是对在点x处给定的数据值y进行最小二乘拟合。如果y是1-D,则返回的系数也将是1-D。如果y是2-D,则会进行多个拟合,每个列都有一个,所得到的系数存储在2-D返回的相应列中。拟合的多项式形式为 p(x) = c0 + c1 * x + ... + cn * x^n
但两种方法返回的系数顺序不同,至少对于所讨论的用例而言。
  • numpy.polyfit 返回的系数是按照降幂排序的,对应于生成方程
    p(x) = cn * xn + c(n-1) * x(n-1) + ... + 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

在将结果传递给poly1d()或使用np.polynomial.polynomial.Polynomial之前,将np.polynomial.polynomial.polyfit的结果翻转,可以产生预期的结果:

Matching output


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接