【问题标题】:How to derive equation from Numpy's polyfit?如何从 Numpy polyfit 导出方程?
【发布时间】:2021-07-22 19:34:42
【问题描述】:

给定一组 x 和 y 值,以下代码将为这些数据点计算回归曲线。

# calculate polynomial
z = np.polyfit(x, y, 5)
f = np.poly1d(z)

# calculate new x's and y's
x_new = np.linspace(x[0], x[-1], 50)
y_new = f(x_new)

plt.plot(x,y,'o', x_new, y_new)
plt.xlim([x[0]-1, x[-1] + 1 ])
plt.show()

我如何使用上面的公式推导出这条曲线的实际方程?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    如果要显示方程,可以使用sympy输出latex:

    from sympy import S, symbols, printing
    from matplotlib import pyplot as plt
    import numpy as np
    
    x=np.linspace(0,1,100)
    y=np.sin(2 * np.pi * x)
    
    p = np.polyfit(x, y, 5)
    f = np.poly1d(p)
    
    # calculate new x's and y's
    x_new = np.linspace(x[0], x[-1], 50)
    y_new = f(x_new)
    
    x = symbols("x")
    poly = sum(S("{:6.2f}".format(v))*x**i for i, v in enumerate(p[::-1]))
    eq_latex = printing.latex(poly)
    
    plt.plot(x_new, y_new, label="${}$".format(eq_latex))
    plt.legend(fontsize="small")
    plt.show()
    

    结果:

    【讨论】:

    • 我收到 TypeError: unsupported operand type(s) for -: 'int' and 'slice'
    【解决方案2】:

    构造一个简单的例子:

    In [94]: x=np.linspace(0,1,100)
    In [95]: y=2*x**3-3*x**2+x-1
    
    In [96]: z=np.polyfit(x,y,3)
    In [97]: z
    Out[97]: array([ 2., -3.,  1., -1.])
    

    z 系数对应于我用来构造y 的[2,-3,1,-1]。

    In [98]: f=np.poly1d(z)
    In [99]: f
    Out[99]: poly1d([ 2., -3.,  1., -1.])
    

    fstr 或打印字符串是这个多项式方程的表示。但定义等式的是 z 系数。

    In [100]: print(f)
       3     2
    2 x - 3 x + 1 x - 1
    In [101]: str(f)
    Out[101]: '   3     2\n2 x - 3 x + 1 x - 1'
    

    “实际方程”还有什么意思?

    polyval 将在一组特定的x 上评估f。因此要重新创建y,请使用polyval(f,x)

    In [107]: np.allclose(np.polyval(f,x),y)
    Out[107]: True
    

    【讨论】:

      【解决方案3】:

      如果您只想在屏幕上查看方程式以了解方程式,您只需添加以下行:

      print(f)
      

      这里有更多细节:

      polyfit 返回多项式拟合的系数向量。 poly1d 获取该向量并从中生成多项式函数。

      例如(来自 poly1d 的 Numpy 文档):

      p = np.poly1d([1, 2, 3])
      >>> print(np.poly1d(p))
         2
      1 x + 2 x + 3
      

      【讨论】:

      • 在提供答案时,请务必附上解释,以便其他人可以从您的回答中学习。请编辑您的回复,以更完整地说明您推荐的解决方案如何解决此问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 2015-03-30
      • 1970-01-01
      相关资源
      最近更新 更多