scipy.optimize.curve_fit-曲线拟合
Scipy是一個用于數(shù)學、科學、工程領域的常用軟件包,可以處理插值、積分、優(yōu)化、圖像處理、常微分方程數(shù)值解的求解、信號處理等問題。它用于有效計算Numpy矩陣,使Numpy和Scipy協(xié)同工作,高效解決問題。
scipy.optimize中有curve_fit方法可以擬合自定義的曲線,如指數(shù)函數(shù)擬合,冪指函數(shù)擬合和多項式擬合,下面導入相應的包進行擬合的一個例子:
導入需要的包
from scipy.optimize import curve_fit import matplotlib.pyplot as plt import numpy as np import pandas as pdplt.rcParams['font.family'] = ['sans-serif'] plt.rcParams['font.sans-serif'] = ['SimHei'] %matplotlib inline # jupyter notebook圖像顯示設置 %config InlineBackend.figure_format = 'svg' # jupyter notebook圖像矢量圖設置自定義函數(shù)擬合
# 自定義函數(shù),curve_fit支持自定義函數(shù)的形式進行擬合,這里定義的是指數(shù)函數(shù)的形式 # 包括自變量x和a,b,c三個參數(shù) def func(x, a, b, c):return a * np.exp(-b * x) + c# 產生數(shù)據(jù) xdata = np.linspace(0, 4, 50) # x從0到4取50個點 y = func(xdata, 2.5, 1.3, 0.5) # 在x取xdata,a,b,c分別取2.5, 1.3, 0.5條件下,運用自定義函數(shù)計算y的值# 在y上產生一些擾動模擬真實數(shù)據(jù) np.random.seed(1729) # 產生均值為0,標準差為1,維度為xdata大小的正態(tài)分布隨機抽樣0.2倍的擾動 y_noise = 0.2 * np.random.normal(size=xdata.size) ydata = y + y_noise plt.plot(xdata, ydata, 'b-', label='data')# 利用“真實”數(shù)據(jù)進行曲線擬合 popt, pcov = curve_fit(func, xdata, ydata) # 擬合方程,參數(shù)包括func,xdata,ydata, # 有popt和pcov兩個個參數(shù),其中popt參數(shù)為a,b,c,pcov為擬合參數(shù)的協(xié)方差# plot出擬合曲線,其中的y使用擬合方程和xdata求出 plt.plot(xdata, func(xdata, *popt), 'r-',label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))# 如果參數(shù)本身有范圍,則可以設置參數(shù)的范圍,如 0 <= a <= 3, # 0 <= b <= 1 and 0 <= c <= 0.5: popt, pcov = curve_fit(func, xdata, ydata, bounds=(0, [3., 1., 0.5])) # bounds為限定a,b,c參數(shù)的范圍plt.plot(xdata, func(xdata, *popt), 'g--',label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))plt.xlabel('x') plt.ylabel('y') plt.legend() plt.show()結果展示
popt為限定參數(shù)a,b,c的參數(shù)擬合值
函數(shù)參數(shù)設置
scipy.optimize.curve_fit(f,?xdata,?ydata,?p0=None,?sigma=None,?absolute_sigma=False,?check_finite=True,?bounds=- inf, inf,?method=None,?jac=None,?**kwargs)[source]
f: 函數(shù)形式
xdata:自變量x,一般為數(shù)組或者向量
ydata:應變量y,一般為一維數(shù)組
bounds:參數(shù)的范圍設置
具體參數(shù)設置見:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html
散點圖顯示擬合方程及R2
# 畫散點圖并標記擬合方程以及R2 from scipy.optimize import curve_fit def curve_fitting(data, x_col,y_col):# 自定義函數(shù),curve_fit支持自定義函數(shù)的形式進行擬合,這里定義的是指數(shù)函數(shù)的形式def func(x, a, b):return a * x + bxdata = data[x_col]ydata = data[y_col]# 利用“真實”數(shù)據(jù)進行曲線擬合popt, pcov = curve_fit(func, xdata, ydata) # 擬合方程,參數(shù)包括func,xdata,ydata# 有popt和pcov兩個個參數(shù),其中popt參數(shù)為a,b,c,pcov為擬合參數(shù)的協(xié)方差plt.scatter(xdata,ydata)plt.plot(xdata, func(xdata, *popt), 'b-',label='y = %5.2f * x + %5.2f' % (tuple(popt)))plt.plot(xdata, func(xdata, *popt), 'b-',label='R2:%5.2f' % (np.corrcoef(ydata,func(xdata,*popt))[0,1]**2))plt.xlabel(x_col)plt.ylabel(y_col)plt.legend()# 調用函數(shù) # data為畫圖數(shù)據(jù)的dataframe,x_col='單均騎手耗時',y_col = '非預定單均配送時長' fig,ax = plt.subplots(1,2,figsize=(10,4)) plt.subplot(121) curve_fitting(data,'單均騎手耗時','非預定單均配送時長')plt.subplot(122) curve_fitting(data,'平均od距離','非預定單均配送時長')?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的scipy.optimize.curve_fit-曲线拟合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: word在编辑的时候自动添加的虚线下划线
- 下一篇: 联想阿木:新消费趋势下 只有智能化赋能品