Python 多項式擬合的兩種實現和擬合誤差

import numpy as npimport matplotlib.pyplot as pltfrom scipy.optimize import curve_fitfitEquation = r"$y= a*x + b$" #這是要擬合的公式def NumpyFit(x=[2.069, 5.862],y=[0.716972, 0.724464]): #使用 Numpy 的 Polyfit 進行擬合,只能進行多項式擬合,隨便多少次都可以,不過一般不建議用太高次的 x=np.array(x) y=np.array(y) opt , cov= np.polyfit(x, y, 1,cov=True)#要獲得擬合誤差,這裡就要添加 cov 這個協方差矩陣 sigma = np.sqrt(np.diag(cov)) # 對協方差矩陣的對角線求平方根得到的就是 sigma p = np.poly1d(opt) curveFit = p(x) #得到擬合曲線的 y 值 a, aerr, b, berr = opt[0], sigma[0], opt[1], sigma[1]#得到擬合參數和誤差 label = a = +str(a) + $pm$+str(aerr)+
b=+ str(b) + $pm$+str(berr) plt.plot(x, curveFit, linewidth=2.5, color = red, alpha = 0.3, label = label) def FitFunc(x, a, b):# 用於 SciPy 的 Curve Fit 的公式 return a*x+bdef ScipyFit(x=[2.069, 5.862],y=[0.716972, 0.724464]):#使用 SciPy 的 Curve Fit 進行擬合,好處是支持各種函數,不過需要自己寫公式 x=np.array(x) y=np.array(y) opt, cov = curve_fit(FitFunc, x, y) # popt = OPTimal Parameters for fit; COVariance matrix 擬合參數和協方差矩陣 sigma =np.sqrt(np.diag(cov)) # 對協方差矩陣的對角線求平方根得到的就是 sigma curveFit = FitFunc(x,opt[0], opt[1] ) #得到擬合曲線的 y 值 a,aerr,b,berr=opt[0], sigma[0], opt[1], sigma[1]#得到擬合參數和誤差 label = a = +str(a) + $pm$+str(aerr)+
b=+ str(b) + $pm$+str(berr) plt.plot(x, curveFit, linewidth=2.5, color = blue, alpha = 0.3, label = label) x=[2.069, 5.862, 7.281, 3.336, 0.0723, 3.908, 0.1367, 11.29, 7.384, 2.861, 4.396, 9.231, 0.8056]y=[0.716972, 0.724464, 0.727566, 0.719333, 0.712823, 0.720578, 0.712962, 0.735598, 0.727391, 0.718462, 0.721609, 0.731475, 0.714279]plt.plot(x, y, o,color=grey,label = Data Points, alpha=0.3)#投原始數據點ScipyFit(x,y)NumpyFit(x,y)plt.legend(loc=upper left)plt.title(fitEquation)plt.show()


以上代碼參考了GeoPyTool中的銣鍶等時線年齡的擬合方法。

其實也要感謝 @yang元祐 的Python SciPy庫——擬合與插值這篇文章的啟發。

另外有一個用Python做數值計算和符號計算beta 的文章,也很有參考價值。


推薦閱讀:

如何根據已有的數據擬合出多項式函數(多項式插值)?

TAG:Python | 多項式擬合 | 誤差 |