【问题标题】:numpy.polyfit vs numpy.polynomial.polynomial.polyfitnumpy.polyfit 与 numpy.polynomial.polynomial.polyfit
【发布时间】:2020-03-19 02:34:57
【问题描述】:

为什么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()

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    乍一看,文档似乎表明它们应该给出相同的结果 -

    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 将产生预期的结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-03
      • 2015-09-16
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多