2016-09-30 77 views
0

給定x和y值的數組,以下代碼將計算這些數據點的迴歸曲線。如何從Numpy的polyfit派生方程?

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

如何使用上述方法推導出該曲線的實際方程?

回答

3

如果你想顯示的公式,你可以使用sympy輸出乳膠:

from sympy import S, symbols 
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 = sympy.printing.latex(poly) 

plt.plot(x_new, y_new, label="${}$".format(eq_latex)) 
plt.legend(fontsize="small") 

結果:

enter image description here

3

構造一個簡單的例子:

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係數對應於[2,-3,1,-1]我用於構造y

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)

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