Python 如何从Numpy';什么是polyfit?

Python 如何从Numpy';什么是polyfit?,python,numpy,Python,Numpy,给定一个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(

给定一个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()

如何使用上述公式推导该曲线的实际方程式?

构造一个简单的示例:

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.])
str
f
的打印字符串是该多项式方程的表示形式。但定义方程的是
z
coeff

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)


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

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()
结果是:

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()