日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python小白的数学建模课-23.数据拟合全集

發(fā)布時間:2025/3/15 python 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python小白的数学建模课-23.数据拟合全集 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  • 擬合是用一個連續(xù)函數(shù)(曲線)靠近給定的離散數(shù)據(jù),使其與給定的數(shù)據(jù)相吻合。
  • 數(shù)據(jù)擬合的算法相對比較簡單,但調(diào)用不同工具和方法時的函數(shù)定義和參數(shù)設(shè)置有所差異,往往使小白感到困惑。
  • 本文基于 Scipy 工具包,對單變量、多變量線性最小二乘擬合,指數(shù)函數(shù)、多項式函數(shù)、樣條函數(shù)的非線性擬合,單變量、多變量的自定義函數(shù)擬合問題進行分析、給出完整例程和結(jié)果,數(shù)據(jù)擬合從此無憂。
  • 『Python小白的數(shù)學(xué)建模課 @ Youcans』帶你從數(shù)模小白成為國賽達人。


文章目錄

    • 1. 數(shù)據(jù)擬合
      • 1.1 數(shù)據(jù)擬合問題的分類
      • 1.2 數(shù)據(jù)擬合的原理和方法
      • 1.3 Python 數(shù)據(jù)擬合方法
    • 2. 線性最小二乘擬合
      • 2.1 線性最小二乘擬合函數(shù)說明
        • 2.1.1 scipy.optimize.leastsq 函數(shù)說明
        • 2.1.2 scipy.stats.linregress 函數(shù)說明
      • 2.2 Python 例程:單變量線性擬合
      • 2.3 Python 例程:多變量線性擬合
    • 3. 非線性函數(shù)數(shù)據(jù)擬合
      • 3.1 非線性擬合函數(shù)說明
      • 3.2 Python 例程:指數(shù)函數(shù)擬合
      • 3.3 Python 例程:多項式函數(shù)擬合
      • 3.4 Python 例程:樣條曲線擬合
    • 4. 自定義函數(shù)曲線擬合
      • 4.1 scipy.optimize.curve_fit() 函數(shù)說明
      • 4.2 Python 例程:單變量自定義函數(shù)曲線擬合
      • 4.3 Python 例程:多變量自定義函數(shù)曲線擬合

1. 數(shù)據(jù)擬合

在科學(xué)研究和工程應(yīng)用中經(jīng)常通過測量、采樣、實驗等方法獲得各種數(shù)據(jù)。對一組已知數(shù)據(jù)點集,通過調(diào)整擬合函數(shù)(曲線)的參數(shù),使該函數(shù)與已知數(shù)據(jù)點集相吻合,這個過程稱為數(shù)據(jù)擬合,又稱曲線擬合。

插值和擬合都是根據(jù)一組已知數(shù)據(jù)點,求變化規(guī)律和特征相似的近似曲線的過程。但是插值要求近似曲線完全經(jīng)過所有的給定數(shù)據(jù)點,而擬合只要求近似曲線在整體上盡可能接近數(shù)據(jù)點,并反映數(shù)據(jù)的變化規(guī)律和發(fā)展趨勢。因此插值可以看作是一種特殊的擬合,是要求誤差函數(shù)為 0 的擬合。

1.1 數(shù)據(jù)擬合問題的分類

數(shù)據(jù)擬合問題,可以從不同角度進行分類:

  • 按照擬合函數(shù)分類,分為線性函數(shù)和非線性函數(shù)。非線性函數(shù)用于數(shù)據(jù)擬合,常用的有多項式函數(shù)、樣條函數(shù)、指數(shù)函數(shù)和冪函數(shù),針對具體問題還有自定義的特殊函數(shù)顯示。
  • 按照變量個數(shù)分類,分為單變量函數(shù)和多變量函數(shù)。
  • 按照擬合模型分類,分為基于模型的數(shù)據(jù)擬合和無模型的函數(shù)擬合。基于模型的數(shù)據(jù)擬合,是通過建立數(shù)學(xué)模型描述輸入輸出變量之間的關(guān)系,擬合曲線不僅能擬合觀測數(shù)據(jù),擬合模型的參數(shù)通常具有明確的物理意義。而無模型的函數(shù)擬合,是指難以建立描述變量關(guān)系的數(shù)學(xué)模型,只能采用通用的函數(shù)和曲線擬合觀測數(shù)據(jù),例如多項式函數(shù)擬合、樣條函數(shù)擬合,也包括機器學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)模型,這種模型的參數(shù)通常沒有明確的意義。

1.2 數(shù)據(jù)擬合的原理和方法

數(shù)據(jù)擬合通過調(diào)整擬合函數(shù)中的待定參數(shù),從整體上接近已知的數(shù)據(jù)點集。

這是一個優(yōu)化問題,決策變量是擬合函數(shù)的待定參數(shù),優(yōu)化目標(biāo)是觀測數(shù)據(jù)與擬合函數(shù)的函數(shù)值之間的某種誤差指標(biāo)。典型的優(yōu)化目標(biāo)是擬合函數(shù)值與觀測值的誤差平方和;當(dāng)觀測數(shù)據(jù)的重要性不同或分布不均勻時,也可以使用加權(quán)誤差平方和作為優(yōu)化目標(biāo)。

數(shù)據(jù)擬合的基本方法是最小二乘法。對于觀測數(shù)據(jù) (xi,yi),i=1,..n(x_i,y_i),i=1,..n(xi?,yi?),i=1,..n,將觀測值 yiy_iyi? 與擬合函數(shù) y=f(x,p)y=f(x,p)y=f(x,p)的計算值 f(xi)f(x_i)f(xi?)的誤差平方和最小作為優(yōu)化問題的目標(biāo)函數(shù):
minJ(p1,?pm)=∑i=1n[yi?f(xi)]2min \; J(p_1, \cdots p_m) = \sum_{i=1}^n [y_i - f(x_i)]^2 minJ(p1?,?pm?)=i=1n?[yi??f(xi?)]2
(p1,?pm)(p_1, \cdots p_m)(p1?,?pm?) 是擬合函數(shù)中的待定參數(shù)。

對于線性擬合問題,設(shè)擬合函數(shù)為直線 f(x)=p0+p1?xf(x) = p_0+p_1*xf(x)=p0?+p1??x, 由極值的必要條件 $ \partial J/\partial p_j = 0,; (j=0,1)$ 可以解出系數(shù) p0,p1p_0, p_1p0?,p1?
p1=n∑i=1nxiyi?∑i=1nxi∑i=1nyin∑i=1nxi2?(∑i=1nxi)2p0=∑i=1nyin?a1∑i=1nxinp_1 = \frac{n \sum_{i=1}^n x_i y_i - \sum_{i=1}^n x_i \sum_{i=1}^n y_i} {n \sum_{i=1}^n x_i^2 - (\sum_{i=1}^n x_i)^2}\\ p_0 =\frac{\sum_{i=1}^n y_i}{n} - a_1 \frac {\sum_{i=1}^n x_i}{n} p1?=ni=1n?xi2??(i=1n?xi?)2ni=1n?xi?yi??i=1n?xi?i=1n?yi??p0?=ni=1n?yi???a1?ni=1n?xi??
對于多變量線性最小二乘問題,設(shè)擬合函數(shù)為直線 f(x)=p0+p1?x1+?+pm?xmf(x) = p_0+p_1*x_1+ \cdots +p_m*x_mf(x)=p0?+p1??x1?+?+pm??xm?, 類似地,可以解出系數(shù) p0,p1,?pmp_0, p_1, \cdots p_mp0?,p1?,?pm?

對于非線性函數(shù)的擬合問題,通常也是按照最小二乘法的思路,求解上述誤差平方和最小化這個非線性優(yōu)化問題,常用的具體算法有搜索算法和迭代算法兩類。


1.3 Python 數(shù)據(jù)擬合方法

數(shù)據(jù)擬合是常用算法,Python 語言的很多工具包都提供了數(shù)據(jù)擬合方法,常用的如 Scipy、Numpy、Statsmodel、Scikit-learn 工具包都帶有數(shù)據(jù)擬合的函數(shù)與應(yīng)用。

Scipy 是最常用的 Python 工具包,本系列中非線性規(guī)劃、插值方法也都是使用 Scipy 工具包實現(xiàn),因此仍以 Scipy 工具包講解數(shù)據(jù)擬合問題。

Scipy 工具包對于不同類型的數(shù)據(jù)擬合問題,提供了不同的函數(shù)或類。由于 Scipy 工具包是多個團隊合作完成,而且經(jīng)過了不斷更新,因此調(diào)用不同函數(shù)和方法時的函數(shù)定義和參數(shù)設(shè)置有所差異,往往使小白感到困惑。

本文對單變量、多變量線性最小二乘擬合,指數(shù)函數(shù)、多項式函數(shù)、樣條函數(shù)的非線性擬合,單變量、多變量的自定義函數(shù)擬合問題進行分析、給出完整例程和結(jié)果,數(shù)據(jù)擬合從此無憂。



2. 線性最小二乘擬合

2.1 線性最小二乘擬合函數(shù)說明

線性最小二乘擬合是最簡單和最常用的擬合方法。scipy.optimize 工具箱中的 leastsq()、lsq_linear(),scipy.stats 工具箱中的 linregress(),都可以實現(xiàn)線性最小二乘擬合。

2.1.1 scipy.optimize.leastsq 函數(shù)說明

leastsq() 根據(jù)觀測數(shù)據(jù)進行最小二乘擬合計算,只需要觀測值與擬合函數(shù)值的誤差函數(shù)和待定參數(shù) 的初值,返回擬合函數(shù)中的待定參數(shù) (p1,?pm)(p_1, \cdots p_m)(p1?,?pm?),但不能提供參數(shù)估計的統(tǒng)計信息。leastsq() 可以進行單變量或多變量線性最小二乘擬合,對變量進行預(yù)處理后也可以進行多項式函數(shù)擬合。

scipy.optimize.leastsq(func, x0, args=(), Dfun=None, full_output=0, col_deriv=0, ftol=1.49012e-08, xtol=1.49012e-08, gtol=0.0, maxfev=0, epsfcn=None, factor=100, diag=None)

主要參數(shù):

  • func:可調(diào)用的函數(shù),描述擬合函數(shù)的函數(shù)值與觀測值的誤差,形式為 error(p,x,y),具有一個或多個待定參數(shù) p。誤差函數(shù)的參數(shù)必須按照 (p,x,y) 的順序排列,不能改變。
  • x0:一維數(shù)組,待定參數(shù) (p1,?pm)(p_1, \cdots p_m)(p1?,?pm?) 的初值。
  • args:元組,線性擬合時提供觀測數(shù)據(jù)值 (xdata, ydata),觀測數(shù)據(jù) xdata 可以是一維數(shù)組(單變量問題),也可以是多維數(shù)組(多變量問題)。

返回值:

  • x:一維數(shù)組,待定參數(shù) (p1,?pm)(p_1, \cdots p_m)(p1?,?pm?) 的最小二乘估計值。

2.1.2 scipy.stats.linregress 函數(shù)說明

linregress() 根據(jù)兩組觀測數(shù)據(jù) (x,y) 進行線性最小二乘回歸,不僅返回擬合函數(shù)中的待定參數(shù) (p1,p1)(p_1, p_1)(p1?,p1?),而且可以提供參數(shù)估計的各種統(tǒng)計信息,但只能進行單變量線性擬合。

scipy.stats.linregress(x, y=None, alternative=‘two-sided’)

主要參數(shù):

  • x, y:x, y 是長度相同的一維數(shù)組。或者 x 是二維數(shù)組,且 y=none,則二維數(shù)組 x 相當(dāng)于 長度相同的一維數(shù)組 x, y。

返回值:

  • slope:斜率,直線 f(x)=p0+p1?xf(x) = p_0+p_1*xf(x)=p0?+p1??x 中的 p1p_1p1?
  • intercept:截距,直線 f(x)=p0+p1?xf(x) = p_0+p_1*xf(x)=p0?+p1??x 中的 p0p_0p0?
  • rvalue:r^2 值,統(tǒng)計量。
  • pvalue:p 值,P檢驗的統(tǒng)計量。
  • stderr:標(biāo)準(zhǔn)差,統(tǒng)計量。

2.2 Python 例程:單變量線性擬合

程序說明:

  • scipy.optimize.leastsq() 與 scipy.stats.linregress() 都可以進行單變量線性擬合。leastsq() 既可以用于單變量也可以用于多變量問題;linregress() 只能用于單變量問題,但可以給出很多參數(shù)估計的統(tǒng)計結(jié)果。
  • leastsq() 要以子函數(shù)來定義觀測值與擬合函數(shù)值的誤差函數(shù),例程中分別定義了擬合函數(shù) fitfunc1(p, x) 與誤差函數(shù)error1(p, x, y) ,是為了方便調(diào)用擬合函數(shù)計算擬合曲線在數(shù)據(jù)點的函數(shù)值。注意 p 為數(shù)組 。
  • leastsq() 中誤差函數(shù)的函數(shù)名可以任意定義,但誤差函數(shù)的參數(shù)必須按照 (p,x,y) 的順序排列,不能改變次序。
  • leastsq() 中觀測數(shù)據(jù) (x, yObs) 是以動態(tài)參數(shù) args 的方式進行傳遞的。這種處理方式非常獨特,沒有為什么, leastsq() 就是這樣定義的。
  • linregress() 只要將觀測數(shù)據(jù) (x,yObs) 作為參數(shù),默認(rèn)單變量線性擬合,不需要定義子函數(shù)。
  • leastsq() 與 linregress() 進行線性擬合,得到的參數(shù)估計結(jié)果是相同的。
  • Python 例程:

    # mathmodel25_v1.py # Demo25 of mathematical modeling algorithm # Demo of curve fitting with Scipy # Copyright 2021 YouCans, XUPT # Crated:2021-08-03# 1. 單變量線性擬合:最小二乘法 scipy.optimize.leastsq import numpy as np import matplotlib.pyplot as plt # 導(dǎo)入 Matplotlib 工具包 from scipy.optimize import leastsq # 導(dǎo)入 scipy 中的最小二乘法擬合工具 from scipy.stats import linregress # 導(dǎo)入 scipy 中的線性回歸工具def fitfunc1(p, x): # 定義擬合函數(shù)為直線p0, p1 = p # 擬合函數(shù)的參數(shù)y = p0 + p1*x # 擬合函數(shù)的表達式return ydef error1(p, x, y): # 定義觀測值與擬合函數(shù)值的誤差函數(shù)err = fitfunc1(p,x) - y # 誤差return err# 創(chuàng)建給定數(shù)據(jù)點集 (x,yObs) p = [2.5, 1.5] # y = p[0] + p[1] * x x = np.array([0., 0.5, 1.5, 2.5, 4.5, 5.5, 7.5, 8.0, 8.5, 9.0, 10.0]) y = p[0] + p[1] * x # 理論值 y np.random.seed(1) yObs = y + np.random.randn(x.shape[-1]) # 生成帶有噪聲的觀測數(shù)據(jù) # print(x.shape, y.shape, yObs.shape)# 由給定數(shù)據(jù)點集 (x,y) 求擬合函數(shù)的參數(shù) pFit p0 = [1, 1] # 設(shè)置擬合函數(shù)的參數(shù)初值 pFit, info = leastsq(error1, p0, args=(x,yObs)) # 最小二乘法求擬合參數(shù) print("Data fitting with Scipy.optimize.leastsq") print("y = p[0] + p[1] * x") print("p[0] = {:.4f}\np[1] = {:.4f}".format(pFit[0], pFit[1]))# 由擬合函數(shù) fitfunc 計算擬合曲線在數(shù)據(jù)點的函數(shù)值 yFit = fitfunc1(pFit,x)# 比較:線性回歸,可以返回斜率,截距,r 值,p 值,標(biāo)準(zhǔn)誤差 slope, intercept, r_value, p_value, std = linregress(x, yObs) print("\nLinear regress with Scipy.stats.linregress") print("y = p[0] + p[1] * x") print("p[0] = {:.4f}".format(intercept)) # 輸出截距 intercept print("p[1] = {:.4f}".format(slope)) # 輸出斜率 slope print("r^2_value: {:.4f}".format(r_value**2)) # 輸出 r^2 值 print("p_value: {:.4f}".format(p_value)) # 輸出 p 值 print("std: {:.4f}".format(std)) # 輸出標(biāo)準(zhǔn)差 std# 繪圖 fig, ax = plt.subplots(figsize=(8,6)) ax.text(8,3,"youcans-xupt",color='gainsboro') ax.set_title("Data fitting with linear least squares") plt.scatter(x, yObs, label="observed data") plt.plot(x, y, 'r--', label="theoretical curve") plt.plot(x, yFit, 'b-', label="fitting curve") plt.legend(loc="best") plt.show()

    程序運行結(jié)果:

    Data fitting with Scipy.optimize.leastsq y = p[0] + p[1] * x p[0] = 2.2688 p[1] = 1.5528Linear regress with Scipy.stats.linregress y = p[0] + p[1] * x p[0] = 2.2688 p[1] = 1.5528 r^2_value: 0.9521 p_value: 0.0000 std: 0.1161



    2.3 Python 例程:多變量線性擬合

    程序說明:

  • scipy.optimize.leastsq() 既可以用于單變量也可以用于多變量問題,本例程求解一個二元線性擬合問題:y = p[0] + p[1] * x1 + p[2] * x2。
  • leastsq() 求解多變量問題的方法與單變量問題類似,以子函數(shù) error2(p, x1, x2, y) 來定義觀測值與擬合函數(shù)值的誤差函數(shù),以動態(tài)參數(shù) args 的方式傳遞觀測數(shù)據(jù) (x, yObs) 。
  • leastsq() 中誤差函數(shù)的函數(shù)名可以任意定義,但誤差函數(shù)的參數(shù)必須按照 (p,x1,x2,y) 的順序排列,不能改變次序。
  • scipy 只能做一元線性回歸,例程中通過調(diào)用 statsmodels.api 進行多元線性回歸,可以得到各種統(tǒng)計參數(shù),供讀者參考。
  • Python 例程:

    # mathmodel25_v1.py # Demo25 of mathematical modeling algorithm # Demo of curve fitting with Scipy # Copyright 2021 YouCans, XUPT # Crated:2021-08-03# 2. 多變量線性擬合:最小二乘法 scipy.optimize.leastsq import numpy as np import matplotlib.pyplot as plt # 導(dǎo)入 Matplotlib 工具包 from scipy.optimize import leastsq # 導(dǎo)入 scipy 中的最小二乘法工具def fitfunc2(p, x1, x2): # 定義擬合函數(shù)為直線p0, p1, p2 = p # 擬合函數(shù)的參數(shù)y = p0 + p1*x1 + p2*x2 # 擬合函數(shù)的表達式return ydef error2(p, x1, x2, y): # 定義觀測值與擬合函數(shù)值的誤差函數(shù)err = fitfunc2(p, x1, x2) - y # 計算殘差return err# 創(chuàng)建給定數(shù)據(jù)點集 (x,yObs) np.random.seed(1) p = [2.5, 1.5, -0.5] # y = p[0] + p[1] * x1 + p[2] * x2 x1 = np.array([0., 0.5, 1.5, 2.5, 4.5, 5.5, 7.5, 8.0, 8.5, 9.0, 10.0]) x2 = np.array([0., 1.0, 1.5, 2.2, 4.8, 5.0, 6.3, 6.8, 7.1, 7.5, 8.0]) z = p[0] + p[1]*x1 + p[2]*x2 # 理論值 z zObs = z + np.random.randn(x1.shape[-1]) # 生成帶有噪聲的觀測數(shù)據(jù) print(x1.shape, z.shape, zObs.shape)# 由給定數(shù)據(jù)點集 (x,z) 求擬合函數(shù)的參數(shù) pFit p0 = [1, 1, 1] # 設(shè)置擬合函數(shù)的參數(shù)初值 pFit, info = leastsq(error2, p0, args=(x1,x2,zObs)) # 最小二乘法求擬合參數(shù) print("Data fitting with Scipy.optimize.leastsq:") print("z = p[0] + p[1]*x1 + p[1]*x2") print("p[0]={:.4f}\np[1]={:.4f}\np[2]={:.4f}".format(pFit[0], pFit[1], pFit[2]))# 由擬合函數(shù) fitfunc 計算擬合曲線在數(shù)據(jù)點的函數(shù)值 zFit = fitfunc2(pFit, x1, x2)# 多元線性回歸:最小二乘法(OLS) import statsmodels.api as sm x0 = np.ones(x1.shape[-1]) # 截距列 x0=[1,...1] X = np.column_stack((x0, x1, x2)) # (nSample,3): [x0, x1, x2] model = sm.OLS(zObs, X) # 建立 OLS 模型: y = b0*x0 + b1*x1 + b2*x2 + e results = model.fit() # 返回模型擬合結(jié)果 zFit = results.fittedvalues # 模型擬合的 y值 print(results.summary()) # 輸出回歸分析的摘要 print("\nOLS model: y = b0*x0 + b1*x1 + b2*x2") print('Parameters: ', results.params) # 輸出:擬合模型的系數(shù)

    程序運行結(jié)果:

    Data fitting with Scipy.optimize.leastsq z = p[0] + p[1]*x1 + p[1]*x2 p[0]=2.6463 p[1]=2.2410 p[2]=-1.3710OLS Regression Results OLS model: y = b0*x0 + b1*x1 + b2*x2 Parameters: [ 2.64628055 2.24100973 -1.37104475] ==============================================================================coef std err t P>|t| [0.025 0.975] ------------------------------------------------------------------------------ const 2.6463 0.942 2.808 0.023 0.473 4.820 x1 2.2410 1.043 2.148 0.064 -0.165 4.647 x2 -1.3710 1.312 -1.045 0.326 -4.396 1.654 ==============================================================================

    3. 非線性函數(shù)數(shù)據(jù)擬合

    3.1 非線性擬合函數(shù)說明

    非線性函數(shù)是非常廣泛的概念。本節(jié)討論指數(shù)函數(shù)、多項式函數(shù)和樣條函數(shù)三種常用的通用形式的非線性函數(shù)擬合問題,分別使用了 Scipy 工具包中的 scipy.optimize.leastsq()、scipy.linalg.lstsq() 和 scipy.interpolate.UnivariateSpline() 函數(shù)。

    scipy.optimize.leastsq() 的使用方法已在本文 2.1 中進行了介紹,scipy.interpolate.UnivariateSpline() 的使用方法在《22. 插值方法》文中進行了介紹,以下介紹 scipy.linalg.lstsq() 函數(shù)。

    lstsq() 函數(shù)只要傳入觀測數(shù)據(jù) (x,yObs),并將 x 按多項式階數(shù)轉(zhuǎn)換為 X,即可求出多項式函數(shù)的系數(shù),不需要定義擬合函數(shù)或誤差函數(shù),非常適合比較不同階數(shù)的多項式函數(shù)擬合的效果。

    scipy.linalg.lstsq(a, b, cond=None, overwrite_a=False, overwrite_b=False, check_finite=True, lapack_driver=None)

    主要參數(shù):

    • a:(m,n) 數(shù)組,表示方程 Ax=b 的左側(cè)。
    • b:(m,) 數(shù)組,表示方程 Ax=b 的右側(cè)。

    返回值:

    • x:最小二乘的解,指多項式函數(shù)的系數(shù)。

    注意:lstsq() 函數(shù)中求解方程 Ax=b,A 是指由觀測數(shù)據(jù) xix_ixi? 按多項式階數(shù)轉(zhuǎn)換為矩陣 (xi0,xi1,...xim),i=1,n(x_i^0,x_i^1,...x_i^m),i=1,n(xi0?,xi1?,...xim?),i=1,n,b 是指 yi,i=1,ny_i,i=1,nyi?,i=1,n,而 x 是指多項式函數(shù)的系數(shù),詳見例程。


    3.2 Python 例程:指數(shù)函數(shù)擬合

    程序說明:

  • scipy.optimize.leastsq() 本質(zhì)上是求解帶有待定參數(shù)的誤差函數(shù)最小化問題,因此可以用于指數(shù)函數(shù)的最小二乘擬合。類似地,原理上 leastsq() 也可以用于其它形式非線性函數(shù)的擬合問題,但對于某些函數(shù)擬合誤差可能會比較大。
  • leastsq() 以子函數(shù) error3(p, x, y) 來定義觀測值與擬合函數(shù)值的誤差函數(shù),以動態(tài)參數(shù) args 的方式傳遞觀測數(shù)據(jù) (x, yObs) 。
  • leastsq() 中誤差函數(shù)的函數(shù)名可以任意定義,但誤差函數(shù)的參數(shù)必須按照 (p,x1,x2,y) 的順序排列,不能改變次序。
  • Python 例程:

    # mathmodel25_v1.py # Demo25 of mathematical modeling algorithm # Demo of curve fitting with Scipy # Copyright 2021 YouCans, XUPT # Crated:2021-08-03# 3. 非線性函數(shù)擬合:指數(shù)函數(shù)擬合(exponential function) import numpy as np import matplotlib.pyplot as plt # 導(dǎo)入 Matplotlib 工具包 from scipy.optimize import leastsq # 導(dǎo)入 scipy 中的最小二乘法工具def fitfunc3(p, x): # 定義擬合函數(shù)p0, p1, p2 = p # 擬合函數(shù)的參數(shù)y = p0 + p1 * np.exp(-p2*x) # 擬合函數(shù)的表達式return ydef error3(p, x, y): # 定義殘差函數(shù)err = fitfunc3(p,x) - y # 殘差return err# 創(chuàng)建給定數(shù)據(jù)點集 (x,yObs) p = [0.5, 2.5, 1.5] # y = p0 + p1 * np.exp(-p2*x) x = np.linspace(0, 5, 50) y = fitfunc3(p, x) np.random.seed(1) yObs = y + 0.2*np.random.randn(x.shape[-1]) # 生成帶有噪聲的觀測數(shù)據(jù) # print(x.shape, y.shape, yObs.shape)# 由給定數(shù)據(jù)點集 (x,y) 求擬合函數(shù)的參數(shù) pFit p0 = [1, 1, 1] # 設(shè)置擬合函數(shù)的參數(shù)初值 pFit, info = leastsq(error3, p0, args=(x,yObs)) # 最小二乘法求擬合參數(shù) print("Data fitting of exponential function") print("y = p0 + p1 * np.exp(-p2*x)") print("p[0] = {:.4f}\np[1] = {:.4f}\np[2] = {:.4f}".format(pFit[0], pFit[1], pFit[2]))# 由擬合函數(shù) fitfunc 計算擬合曲線在數(shù)據(jù)點的函數(shù)值 yFit = fitfunc3(pFit, x)# 繪圖 fig, ax = plt.subplots(figsize=(8,6)) ax.set_title("Data fitting of exponential function") plt.scatter(x, yObs, label="observed data") plt.plot(x, y, 'r--', label="theoretical curve") plt.plot(x, yFit, 'b-', label="fitting curve") plt.legend(loc="best") plt.show()

    程序運行結(jié)果:

    Data fitting of exponential function y = p0 + p1 * np.exp(-p2*x) p[0] = 0.5216 p[1] = 2.5742 p[2] = 1.6875


    3.3 Python 例程:多項式函數(shù)擬合

    程序說明:

  • scipy.optimize.leastsq() 本質(zhì)上是求解帶有待定參數(shù)的誤差函數(shù)最小化問題,因此可以用于多項式函數(shù)的最小二乘擬合,使用方法與線性擬合、指數(shù)擬合類似。
  • 由于 leastsq() 要以子函數(shù) error(p, x, y) 來定義觀測值與擬合函數(shù)值的誤差函數(shù),在比較不同階數(shù)的多項式函數(shù)擬合時需要定義多個對應(yīng)的誤差函數(shù),比較繁瑣。
  • scipy.linalg.lstsq() 只要傳入觀測數(shù)據(jù) (x,yObs),并將 x 按多項式階數(shù)轉(zhuǎn)換為 X,即可求出多項式函數(shù)的系數(shù),不需要定義擬合函數(shù)或誤差函數(shù),非常適合比較不同階數(shù)的多項式函數(shù)擬合的效果。
  • 對于相同階數(shù)的多項式函數(shù),leastsq() 與 lstsq() 的參數(shù)估計和擬合結(jié)果是相同的。
  • 增大多項式的階數(shù),可以減小擬合曲線與觀測數(shù)據(jù)的誤差平方和,但也更容易導(dǎo)致過擬合,雖然能更好地擬合訓(xùn)練數(shù)據(jù),但并不能真實反映數(shù)據(jù)的總體規(guī)律,因而對于訓(xùn)練數(shù)據(jù)以外的測試數(shù)據(jù)的擬合效果反而降低了。
  • Python 例程:

    # mathmodel25_v1.py # Demo25 of mathematical modeling algorithm # Demo of curve fitting with Scipy # Copyright 2021 YouCans, XUPT # Crated:2021-08-03# 4. 非線性函數(shù)擬合:多項式函數(shù)擬合(Polynomial function) import numpy as np import matplotlib.pyplot as plt # 導(dǎo)入 Matplotlib 工具包 from scipy.linalg import lstsq # 導(dǎo)入 scipy 中的 linalg, stats 函數(shù)庫 from scipy.optimize import leastsq # 導(dǎo)入 scipy 中的最小二乘法工具def fitfunc4(p, x): # 定義擬合函數(shù)p0, p1, p2, p3 = p # 擬合函數(shù)的參數(shù)y = p0 + p1*x + p2*x*x + p3*x*x*x # 擬合函數(shù)的表達式return ydef error4(p, x, y): # 定義觀測值與擬合函數(shù)值的誤差函數(shù)err = fitfunc4(p,x) - y # 殘差return err# 創(chuàng)建給定數(shù)據(jù)點集 (x,yObs) p = [1.0, 1.2, 0.5, 0.8] # y = p0 + ((x*x-p1)**2+p2) * np.sin(x*p3) func = lambda x: p[0]+((x*x-p[1])**2+p[2])*np.sin(x*p[3]) # 定義 y=f(x) x = np.linspace(-1, 2, 30) y = func(x) # 計算已知數(shù)據(jù)點的理論值 y =f(x) np.random.seed(1) yObs = y + 0.5*np.random.randn(x.shape[-1]) # 生成帶有噪聲的觀測數(shù)據(jù) yObs# 繪圖 fig, ax = plt.subplots(figsize=(8,6)) ax.set_title("Polynomial fitting with least squares") plt.scatter(x, yObs, label="observed data") plt.plot(x, y, 'c--', label="theoretical curve")# 用 scipy.optimize.leastsq() 進行多項式函數(shù)擬合 p0 = [1, 1, 1, 1] # 設(shè)置擬合函數(shù)的參數(shù)初值 pFit, info = leastsq(error4, p0, args=(x,yObs)) # 最小二乘法求擬合參數(shù) yFit = fitfunc4(pFit, x) # 由擬合函數(shù) fitfunc 計算擬合曲線在數(shù)據(jù)點的函數(shù)值 ax.plot(x, yFit, '-', label='leastsq') print("Polynomial fitting by scipy.optimize.leastsq") print("y = p[0] + p[1]*x + p[2]*x^2 +p[3]*x^3") # 擬合函數(shù)的表達式 print("p[0] = {:.4f}\np[1] = {:.4f}\np[2] = {:.4f}\np[3] = {:.4f}".format(pFit[0], pFit[1], pFit[2], pFit[3]))# 用 scipy.linalg.lstsq() 進行多項式函數(shù)擬合 print("\nPolynomial fitting by scipy.linalg.lstsq") print("y = w[0] + w[1]*x + w[2]*x^2 + ... + w[m]*x^m") # 擬合函數(shù)的表達式 # 最小二乘法多項式數(shù)據(jù)擬合,求解多項式函數(shù)的系數(shù) W=[w[0],...w[m]] for order in range(1,5):# order = 3 # 多項式階數(shù), mX = np.array([[(xi ** i) for i in range(order + 1)] for xi in x])Y = np.array(yObs).reshape((-1, 1))W, res, rnk, s = lstsq(X, Y) # 最小二乘法求解 A*W = bprint("order={:d}".format(order))for i in range(order+1): # W = [w[0],...w[order]]print("\tw[{:d}] = {:.4f}".format(i, W[i,0]))# 由擬合函數(shù) fitfunc 計算擬合曲線在數(shù)據(jù)點的函數(shù)值yFit = X.dot(W) # y = w[0] + w[1]*x + w[2]*x^2 + ... + w[m]*x^m# 繪圖:n 次多項式函數(shù)擬合曲線ax.plot(x, yFit, '-', label='order={}'.format(order))plt.legend(loc="best") plt.show()

    程序運行結(jié)果:

    Polynomial fitting by scipy.optimize.leastsq y = p[0] + p[1]*x + p[2]*x^2 +p[3]*x^3 p[0] = 0.9586 p[1] = -0.4745 p[2] = -0.3581 p[3] = 1.1721Polynomial fitting by scipy.linalg.lstsq y = w[0] + w[1]*x + w[2]*x^2 + ... + w[m]*x^m order=1w[0] = 1.0331w[1] = 1.7354 order=2w[0] = 0.2607w[1] = 0.3354w[2] = 1.4000 order=3w[0] = 0.9586w[1] = -0.4745w[2] = -0.3581w[3] = 1.1721 order=4w[0] = 1.0131w[1] = 1.6178w[2] = -1.1039w[3] = -1.5209w[4] = 1.3465


    3.4 Python 例程:樣條曲線擬合

    程序說明:

  • scipy.interpolate.UnivariateSpline() 類是一種基于固定數(shù)據(jù)點創(chuàng)建函數(shù)的方法,使用樣條曲線擬合到給定的數(shù)據(jù)點集。
  • UnivariateSpline 類由已知數(shù)據(jù)點集生成樣條插值函數(shù) y=spl(x),通過調(diào)用樣條插值函數(shù)可以計算指定 x 的函數(shù)值 f(x)。
  • UnivariateSpline 類既可以進行數(shù)據(jù)插值,也可以進行擬合。參數(shù) s=0 表示數(shù)據(jù)插值,樣條曲線必須通過所有數(shù)據(jù)點;s>0 表示數(shù)據(jù)擬合,默認(rèn) s= len(w)。
  • 通過 set_smoothing_factor(sf) 設(shè)置光滑因子,可以對樣條擬合函數(shù)進行調(diào)節(jié),使擬合曲線更好地反映觀測數(shù)據(jù)特征,避免過擬合。
  • Python 例程:

    # mathmodel25_v1.py # Demo25 of mathematical modeling algorithm # Demo of curve fitting with Scipy # Copyright 2021 YouCans, XUPT # Crated:2021-08-03# 5 非線性函數(shù)擬合:樣條函數(shù)擬合(Spline function) import numpy as np import matplotlib.pyplot as plt # 導(dǎo)入 Matplotlib 工具包 from scipy.interpolate import UnivariateSpline # 導(dǎo)入 scipy 中的樣條插值工具# 創(chuàng)建給定數(shù)據(jù)點集 (x,yObs) # y = p0 + ((x*x-p1)**2+ p2) * np.sin(x*p3) np.random.seed(1) p0, p1, p2, p3 = [1.0, 1.2, 0.5, 0.8] # 擬合函數(shù)的參數(shù) x = np.linspace(-1, 2, 30) # 生成已知數(shù)據(jù)點集的 x y = p0 + ((x*x-p1)**2+ p2) * np.sin(x*p3) # 生成理論值 y yObs = y + 0.5*np.random.randn(x.shape[-1]) # 生成帶有噪聲的觀測數(shù)據(jù)# 由給定數(shù)據(jù)點集 (x,y) 求擬合函數(shù)的參數(shù) fSpl fSpl = UnivariateSpline(x, yObs) # 三次樣條插值,默認(rèn) s= len(w) coeffs = fSpl.get_coeffs() # Return spline coefficients print("Data fitting with spline function") print("coeffs of 3rd spline function:\n ", coeffs)# 由擬合函數(shù) fitfunc 計算擬合曲線在數(shù)據(jù)點的函數(shù)值 yFit = fSpl(x) # 由插值函數(shù) fSpl1 計算插值點的函數(shù)值 yFit# 對擬合函數(shù) fitfunc 進行平滑處理 fSpl.set_smoothing_factor(10) # 設(shè)置光滑因子 sf yS = fSpl(x) # 由插值函數(shù) fSpl(sf=10) 計算插值點的函數(shù)值 ys coeffs = fSpl.get_coeffs() # 平滑處理后的參數(shù) print("coeffs of 3rd spline function (sf=10):\n ", coeffs)# 繪圖 fig, ax = plt.subplots(figsize=(8,6)) ax.set_title("Data fitting with spline function") plt.scatter(x, yObs, label="observed data") plt.plot(x, y, 'r--', label="theoretical curve") plt.plot(x, yFit, 'b-', label="3rd spline fitting") plt.plot(x, yS, 'm-', label="smoothing spline") plt.legend(loc="best") plt.show()

    程序運行結(jié)果:

    Data fitting with spline function coeffs of 3rd spline function:[-0.09707885 3.66083026 -4.20416235 7.95385344] coeffs of 3rd spline function (sf=10):[0.41218039 0.52795588 1.6248287 0.76540737 8.49462738]



    4. 自定義函數(shù)曲線擬合

    4.1 scipy.optimize.curve_fit() 函數(shù)說明

    curve_fit() 使用非線性最小二乘法將自定義的擬合函數(shù)擬合到觀測數(shù)據(jù),不僅可以用于直線、二次曲線、三次曲線的擬合,而且可以適用于任意形式的自定義函數(shù)的擬合,使用非常方便。curve_fit() 允許進行單變量或多變量的自定義函數(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) **

    主要參數(shù):

    • f:可調(diào)用的函數(shù),自定義的擬合函數(shù),具有一個或多個待定參數(shù)。擬合函數(shù)的形式為 func(x,p1,p2,…),其中參數(shù)必須按照 (x,p1,p2,…) 的順序排列,p1, p2,… 是標(biāo)量不能表達為數(shù)組。
    • xdata:n*m數(shù)組,n 為觀測數(shù)據(jù)長度,m為變量個數(shù)。觀測數(shù)據(jù) xdata 可以是一維數(shù)組(單變量問題),也可以是多維數(shù)組(多變量問題)。
    • ydata:數(shù)組,長度為觀測數(shù)據(jù)長度 n。
    • p0:可選項,待定參數(shù) [p1,p2,…] 的初值,默認(rèn)值無。

    返回值:

    • popt:待定參數(shù) (p1,?pm)(p_1, \cdots p_m)(p1?,?pm?) 的最小二乘估計值。

    • pcov:參數(shù) (p1,?pm)(p_1, \cdots p_m)(p1?,?pm?) 的估計值 popt 的協(xié)方差,其對角線是各參數(shù)的方差。


    4.2 Python 例程:單變量自定義函數(shù)曲線擬合

    程序說明:

  • 不同于 leastsq() 定義觀測值與擬合函數(shù)值的誤差函數(shù),scipy.optimize.curve_fit() 直接定義一個自定義的擬合函數(shù),更為直觀和便于理解。
  • curve_fit() 定義一個擬合函數(shù),函數(shù)名可以任意定義,但擬合函數(shù)的參數(shù)必須按照 (x,p1,p2,…) 的順序排列,不能改變次序。p1, p2,… 是標(biāo)量,不能寫成數(shù)組。注意 leastsq() 中誤差函數(shù)的參數(shù)必須按照 (p,x,y) 的順序排列,與 curve_fit() 不同。
  • leastsq() 也可以對自定義的擬合函數(shù)進行最小二乘擬合。
  • 由于本例程中自定義擬合函數(shù)使用了觀測數(shù)據(jù)的實際模型,而不是通用的多項式函數(shù)或樣條函數(shù),因此擬合結(jié)果不僅能很好的擬合觀測數(shù)據(jù),而且能更準(zhǔn)確地反映實際模型的趨勢。
  • Python 例程:

    # 6. 自定義函數(shù)曲線擬合:單變量 import numpy as np import matplotlib.pyplot as plt # 導(dǎo)入 Matplotlib 工具包 from scipy.optimize import leastsq, curve_fit # 導(dǎo)入 scipy 中的曲線擬合工具def fitfunc6(x, p0, p1, p2, p3): # 定義擬合函數(shù)為自定義函數(shù)# p0, p1, p2, p3 = p # 擬合函數(shù)的參數(shù)y = p0 + ((x*x-p1)**2+ p2) * np.sin(x*p3)return y# def error6(p, x, y): # 定義觀測值與擬合函數(shù)值的誤差函數(shù) # p0, p1, p2, p3 = p # err = fitfunc6(x, p0, p1, p2, p3) - y # 計算殘差 # return err# 創(chuàng)建給定數(shù)據(jù)點集 (x, yObs) p0, p1, p2, p3 = [1.0, 1.2, 0.5, 0.8] # y = p0 + ((x*x-p1)**2+ p2) * np.sin(x*p3) x = np.linspace(-1, 2, 30) y = fitfunc6(x, p0, p1, p2, p3) np.random.seed(1) yObs = y + 0.5*np.random.randn(x.shape[-1]) # 生成帶有噪聲的觀測數(shù)據(jù)# # 用 scipy.optimize.leastsq() 進行函數(shù)擬合 # pIni = [1, 1, 1, 1] # 設(shè)置擬合函數(shù)的參數(shù)初值 # pFit, info = leastsq(error6, pIni, args=(x, yObs)) # 最小二乘法求擬合參數(shù) # print("Data fitting of custom function by leastsq") # print("y = p0 + ((x*x-p1)**2+ p2) * np.sin(x*p3)") # print("p[0] = {:.4f}\np[1] = {:.4f}\np[2] = {:.4f}\np[3] = {:.4f}" # .format(pFit[0], pFit[1], pFit[2], pFit[3]))# 用 scipy.optimize.curve_fit() 進行自定義函數(shù)擬合(單變量) pFit, pcov = curve_fit(fitfunc6, x, yObs) print("Data fitting of custom function by curve_fit:") print("y = p0 + ((x*x-p1)**2+ p2) * np.sin(x*p3)") print("p[0] = {:.4f}\np[1] = {:.4f}\np[2] = {:.4f}\np[3] = {:.4f}".format(pFit[0], pFit[1], pFit[2], pFit[3])) print("estimated covariancepcov:\n",pcov) # 由擬合函數(shù) fitfunc 計算擬合曲線在數(shù)據(jù)點的函數(shù)值 yFit = fitfunc6(x, pFit[0], pFit[1], pFit[2], pFit[3])# 繪圖 fig, ax = plt.subplots(figsize=(8,6)) ax.set_title("Data fitting of custom function") plt.scatter(x, yObs, label="observed data") plt.plot(x, y, 'r--', label="theoretical curve") plt.plot(x, yFit, 'b-', label="fitting curve") plt.legend(loc="best") plt.show()

    程序運行結(jié)果:

    Data fitting of custom function by curve_fit: y = p0 + ((x*x-p1)**2+ p2) * np.sin(x*p3) p[0] = 0.9460 p[1] = 1.1465 p[2] = 0.8291 p[3] = 0.6008 estimated covariancepcov:[[ 0.01341654 0.00523061 -0.01645431 0.00455901][ 0.00523061 0.02648836 -0.04442234 0.02821206][-0.01645431 -0.04442234 0.20326672 -0.07482843][ 0.00455901 0.02821206 -0.07482843 0.0388316 ]]

    結(jié)果分析:


    4.3 Python 例程:多變量自定義函數(shù)曲線擬合

    程序說明:

  • scipy.optimize.curve_fit() 既可以用于單變量也可以用于多變量問題,本例程求解一個二元非線性擬合問題。
  • curve_fit() 定義一個擬合函數(shù) fitfunc7(X, p0, p1, p2, p3),函數(shù)名可以任意定義,但擬合函數(shù)的參數(shù)必須按照 (x,p1,p2,…) 的順序排列,不能改變次序。p1, p2,… 是標(biāo)量,不能寫成數(shù)組。
  • curve_fit(fitfunc7, X, yObs) 中的 X 是 (n,m) 數(shù)組,n 是觀測數(shù)據(jù)點集的長度,m 是變量個數(shù)。
  • Python 例程:

    # mathmodel25_v1.py # Demo25 of mathematical modeling algorithm # Demo of curve fitting with Scipy # Copyright 2021 YouCans, XUPT # Crated:2021-08-03# 7. 自定義函數(shù)曲線擬合:多變量 import numpy as np import matplotlib.pyplot as plt # 導(dǎo)入 Matplotlib 工具包 from scipy.optimize import curve_fit # 導(dǎo)入 scipy 中的曲線擬合工具def fitfunc7(X, p0, p1, p2, p3): # 定義多變量擬合函數(shù), X 是向量# p0, p1, p2, p3 = p # 擬合函數(shù)的參數(shù)y = p0 + p1*X[0,:] + p2*X[1,:] + p3*np.sin(X[0,:]+X[1,:]+X[0,:]**2+X[1,:]**2)return y# 創(chuàng)建給定數(shù)據(jù)點集 (x,yObs) p = [1.0, 0.5, -0.5, 5.0] # 自定義函數(shù)的參數(shù) p0, p1, p2, p3 = p # y = p0 + p1*x1 + p2*x2 + p3*np.sin(x1+x2+x1^2+x2^2) np.random.seed(1) x1 = 2.0 * np.random.rand(8) # 生成隨機數(shù)組,長度為 8 x2 = 3.0 * np.random.rand(5) # 生成隨機數(shù)組,取值范圍 (0,3.0) xmesh1, xmesh2 = np.meshgrid(x1, x2) # 生成網(wǎng)格點的坐標(biāo) xx,yy (二維數(shù)組) xx1= xmesh1.reshape(xmesh1.shape[0]*xmesh1.shape[1], ) # 將網(wǎng)格點展平為一維數(shù)組 xx2= xmesh2.reshape(xmesh2.shape[0]*xmesh2.shape[1], ) # 將網(wǎng)格點展平為一維數(shù)組 X = np.vstack((xx1,xx2)) # 生成多變量數(shù)組,行數(shù)為變量個數(shù) y = fitfunc7(X, p0, p1, p2, p3) # 理論計算值 y=f(X,p) yObs = y + 0.2*np.random.randn(y.shape[-1]) # 生成帶有噪聲的觀測數(shù)據(jù) print(x1.shape,x2.shape,xmesh1.shape,xx1.shape,X.shape)# 用 scipy.optimize.curve_fit() 進行自定義函數(shù)擬合(多變量) pFit, pcov = curve_fit(fitfunc7, X, yObs) # 非線性最小二乘法曲線擬合 print("Data fitting of multivariable custom function") print("y = p0 + p1*x1 + p2*x2 + p3*np.sin(x1+x2+x1^2+x2^2)") for i in range(4):print("p[{:d}] = {:.4f}\tp[{:d}]_fit = {:.4f}".format(i, p[i], i, pFit[i]))# 由擬合函數(shù) fitfunc 計算擬合曲線在數(shù)據(jù)點的函數(shù)值 yFit = fitfunc7(X, pFit[0], pFit[1], pFit[2], pFit[3])

    程序運行結(jié)果:

    Data fitting of multivariable custom function: y = p0 + p1*x1 + p2*x2 + p3*np.sin(x1+x2+x1^2+x2^2) p[0] = 1.0000 p[0]_fit = 1.1316 p[1] = 0.5000 p[1]_fit = 0.5020 p[2] = -0.5000 p[2]_fit = -0.5906 p[3] = 5.0000 p[3]_fit = 5.0061 estimated covariancepcov:[[ 9.51937904e-03 -2.82863223e-03 -5.26393413e-03 -8.51457970e-04][-2.82863223e-03 4.88275894e-03 9.39281331e-05 3.73832161e-04][-5.26393413e-03 9.39281331e-05 3.86701646e-03 4.65766686e-04][-8.51457970e-04 3.73832161e-04 4.65766686e-04 1.85374067e-03]]



    【本節(jié)完】


    版權(quán)聲明:

    歡迎關(guān)注『Python小白的數(shù)學(xué)建模課 @ Youcans』 原創(chuàng)作品

    原創(chuàng)作品,轉(zhuǎn)載必須標(biāo)注原文鏈接:(https://blog.csdn.net/youcans/article/details/119332590)。

    Copyright 2021 Youcans, XUPT

    Crated:2021-08-05


    歡迎關(guān)注 『Python小白的數(shù)學(xué)建模課 @ Youcans』 系列,持續(xù)更新
    Python小白的數(shù)學(xué)建模課-01.新手必讀
    Python小白的數(shù)學(xué)建模課-02.數(shù)據(jù)導(dǎo)入
    Python小白的數(shù)學(xué)建模課-03.線性規(guī)劃
    Python小白的數(shù)學(xué)建模課-04.整數(shù)規(guī)劃
    Python小白的數(shù)學(xué)建模課-05.0-1規(guī)劃
    Python小白的數(shù)學(xué)建模課-06.固定費用問題
    Python小白的數(shù)學(xué)建模課-07.選址問題
    Python小白的數(shù)學(xué)建模課-09.微分方程模型
    Python小白的數(shù)學(xué)建模課-10.微分方程邊值問題
    Python小白的數(shù)學(xué)建模課-12.非線性規(guī)劃
    Python小白的數(shù)學(xué)建模課-15.圖論的基本概念
    Python小白的數(shù)學(xué)建模課-16.最短路徑算法
    Python小白的數(shù)學(xué)建模課-17.條件最短路徑算法
    Python小白的數(shù)學(xué)建模課-18.最小生成樹問題
    Python小白的數(shù)學(xué)建模課-19.網(wǎng)絡(luò)流優(yōu)化問題
    Python小白的數(shù)學(xué)建模課-20.網(wǎng)絡(luò)流優(yōu)化案例
    Python小白的數(shù)學(xué)建模課-21.關(guān)鍵路徑法
    Python小白的數(shù)學(xué)建模課-22.插值方法
    Python小白的數(shù)學(xué)建模課-23.數(shù)據(jù)擬合全集
    Python小白的數(shù)學(xué)建模課-A1.國賽賽題類型分析
    Python小白的數(shù)學(xué)建模課-A2.2021年數(shù)維杯C題探討
    Python小白的數(shù)學(xué)建模課-A3.12個新冠疫情數(shù)模競賽賽題及短評
    Python小白的數(shù)學(xué)建模課-B2. 新冠疫情 SI模型
    Python小白的數(shù)學(xué)建模課-B3. 新冠疫情 SIS模型
    Python小白的數(shù)學(xué)建模課-B4. 新冠疫情 SIR模型
    Python小白的數(shù)學(xué)建模課-B5. 新冠疫情 SEIR模型
    Python小白的數(shù)學(xué)建模課-B6. 新冠疫情 SEIR改進模型
    Python數(shù)模筆記-PuLP庫
    Python數(shù)模筆記-StatsModels統(tǒng)計回歸
    Python數(shù)模筆記-Sklearn
    Python數(shù)模筆記-NetworkX
    Python數(shù)模筆記-模擬退火算法

    總結(jié)

    以上是生活随笔為你收集整理的Python小白的数学建模课-23.数据拟合全集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。