本文由 发布,转载请注明出处,如有问题请联系我们! 发布时间: 2021-08-01非线性函数的性质-讲解线性函数的定义
1.数据拟合。
在科研和工程项目使用中,常常根据精确测量,抽样和试验的方法得到各种各样数据信息。针对一组已经知道数据,根据调节拟合函数(曲线图)的主要参数,使涵数与已经知道数据一致。这一全过程称为数据拟合和拟合曲线。
而插值法和线性拟合全是依据一组已经知道的数据信息点找寻变化趋势和特点类似的类似曲线图的全过程。但插值法规定类似曲线图彻底越过全部给出的数据信息点,而线性拟合只规定类似曲线图总体上尽量贴近数据信息点,体现数据信息的变化趋势和发展趋向。因此插值法能够看做是一种独特的线性拟合,必须误差函数为0。
1.1数据拟合难题的归类。
数据拟合难题能够从不一样的方向开展归类:
依照拟合函数归类,分成线性方程和非线性函数。非线性函数用以数据拟合,常见的有多项式函数,样条涵数,对数函数和指数函数,对于实际难题也有自定的特殊函数表明。依照自变量数量归类,分成单自变量涵数和多自变量涵数。依照拟合模型归类,分成根据实体模型的数据拟合和无实体模型的函数拟合。根据实体模型的数据拟合,是根据创建数学分析模型叙述I/O自变量中间的关联,拟合曲线不但能线性拟合检测数据信息,拟合模型的主要参数一般具备确立的物理意义。而无实体模型的函数拟合,就是指无法创建叙述自变量关联的数学分析模型,只有选用通用性的涵数和拟合曲线观察数据信息,比如代数式函数拟合,样条函数拟合,也包含深度学习和神经元网络实体模型,这类实体模型的主要参数一般沒有确定的实际意义。1.2数据拟合的标准和方式。
数据拟合根据调节拟合函数中的未确定主要参数,将已经知道数据信息点集做为一个总体靠近。
这是一个优化问题,管理决策自变量是拟合函数的未确定主要参数,提升的目标是观察数据信息与拟合函数函数中间的某一偏差指标值。典型性的提升的目标是拟合函数值和观测值中间的偏差平均数。当观察数据信息的必要性不一样或遍布不匀称时,偏差的权重计算平均数还可以做为调整总体目标。
数据拟合的主要方式是最小二乘法。针对观察数据信息(x I,y i),I = 1,...n,优化问题的目标函数是降到最低拟合函数y = f (x,p)的观测值y(I)和测算值f (x i)中间的偏差平均数:
(p 1,p m)是拟合函数中的一个未确定主要参数。针对线性拟合难题,假定拟合函数为平行线f (x) = p 0 p 1 x,由极大值$ partial J/partial p_j = 0的必备条件构成,;(j=0,1)$能够求得指数p 0,p 1:
针对多元化线形最小二乘难题,假定拟合函数为平行线f (x) = p 0 p 1 x 1 p m x m,一样,指数p 0,p 1,p m还可以求得。针对非线性函数的曲线拟合难题,一般选用最小二乘法来处理偏差平均数最少的离散系统优化问题。常见的优化算法有优化算法和迭代算法。
1.3 Python数据拟合方式。
数据拟合是一种普遍的优化算法,Python语言表达中的许多工具箱都保证了数据拟合的方式。常见的工具箱如Scipy,Numpy,Statsmodel,Scikit-learn都是有数据拟合的基本功能和运用。
Scipy是最常见的Python工具箱,本系列产品中的离散系统程序编写和插值法方式也是由Scipy工具箱完成的,因此大家或是用Scipy工具箱来表述数据拟合难题。
Scipy工具箱为不一样种类的数据拟合难题带来了不一样的涵数或类。因为Scipy Toolkit是由许多精英团队进行的,而且一直在不断创新,因此在启用不一样的涵数和方案时,函数定义和基本参数是不一样的,这常常会让新手觉得疑惑。
文中对一元和多元化线形最小二乘线性拟合,对数函数,多项式函数,样条涵数非线性拟合及其一元和多元化自定义函数线性拟合开展了剖析,并得出了完善的流程和結果,使数据拟合此后越来越非常容易。
2.线形最小二乘线性拟合。
2.1线形最小二乘拟合函数的叙述。
线形最小二乘线性拟合是非常简单,最常见的线性拟合方式。scipy.optimize辅助工具中的leastsq()和lsq_linear()及其scipy.stats辅助工具中的linregress()都能够完成线形最小二乘线性拟合。
2 . 1 . 1 scipy . optimize . least sq涵数的叙述。
依据观察数据信息,leastsq()开展最小二乘线性拟合测算,只必须观测值与拟合函数值中间的误差函数和未确定主要参数的初值,并在拟合函数中回到未确定主要参数(p ^ 1,p ^ m),但不可以给予参数估计的统计数据。leastsq()可以用一元或多元化线形最小二乘法线性拟合,还可以在对自变量开展预备处理后用代数式函数拟合。
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)
基本参数:
func:可启用的涵数,叙述拟合函数的函数与观测值的偏差,方式为 error(p,x,y),具备一个或好几个未确定主要参数 p。误差函数的主要参数需要依照 (p,x,y) 的排列顺序,不可以更改。x0:一维数组,未确定主要参数 ( p 1 , ⋯ p m ) 的初始值。args:元组,线性拟合时给予观察数据信息值 (xdata, ydata),观察数据信息 xdata 能够是一维数组(单自变量难题),还可以是多维数组(多自变量难题)。传参:
x:一维数组,未确定主要参数 ( p 1 , ⋯ p m )的最小二乘预测值。2 . 1 . 2 scipy . stats . Lin return函数的叙述。
Linregress()依据2组观察数据信息(x,y)开展线形最小二乘重归,不但回到拟合函数中的未确定主要参数(p 1,p 1),还给予参数估计的各种各样统计数据,但只有开展单自变量线性拟合。
scipy . stats . Lin return(x,y =无,取代= '两面')
基本参数:
x, y:x, y 是长短同样的一维数组。或是 x 是二维数组,且 y=none,则二维数组 x 等同于 长短同样的一维数组 x, y。传参:
slope:切线斜率,平行线 f ( x ) = p 0 p 1 ∗ x中的 p 1。intercept:截距,平行线 f ( x ) = p 0 p 1 ∗ x中的 p 0 。rvalue:r^2 值,统计量。pvalue:p 值,P检测的统计量。stderr:标准偏差,统计量。2.2 Python方法:单自变量线性拟合。
程序流程叙述:
scipy.optimize.leastsq() 与 scipy.stats.linregress() 都能够开展单自变量线性拟合。leastsq() 既能够用以单自变量还可以用以多自变量难题;linregress() 只有用以单自变量难题,但能够得出许多参数估计的统计分析結果。leastsq() 要以子函数来界定观测值与拟合函数值的误差函数,方法中各自界定了拟合函数 fitfunc1(p, x) 与误差函数error1(p, x, y) ,是因为便捷启用拟合函数测算拟合曲线在数据信息点的函数。留意 p 为二维数组 。leastsq() 中误差函数的涵数名能够随意界定,但误差函数的主要参数需要依照 (p,x,y) 的排列顺序,不可以更改顺序。leastsq() 中观察数据信息 (x, yObs) 是以动态性主要参数 args 的形式开展传送的。这类处理方法十分与众不同,沒有为何, leastsq() 就这样界定的。linregress() 只需将观察数据信息 (x,yObs) 做为主要参数,默认设置单自变量线性拟合,不用界定子函数。leastsq() 与 linregress() 开展线性拟合,获得的参数估计結果是同样的。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.leastsqimport numpy as npimport matplotlib.pyplot as plt # 导进 Matplotlib 工具箱from scipy.optimize import leastsq # 导进 scipy 中的最小二乘法线性拟合专用工具from scipy.stats import linregress # 导进 scipy 中的回归分析专用工具def fitfunc1(p, x): # 界定拟合函数为平行线 p0, p1 = p # 拟合函数的主要参数 y = p0 p1*x # 拟合函数的关系式 return ydef error1(p, x, y): # 界定观测值与拟合函数值的误差函数 err = fitfunc1(p,x) - y # 偏差 return err# 建立给出数据信息点集 (x,yObs)p = [2.5, 1.5] # y = p[0] p[1] * xx = 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 # 标准偏差 ynp.random.seed(1)yObs = y np.random.randn(x.shape[-1]) # 转化成含有噪音的观察数据信息# print(x.shape, y.shape, yObs.shape)# 由给出数据信息点集 (x,y) 求拟合函数的主要参数 pFitp0 = [1, 1] # 设定拟合函数的主要参数初始值pFit, info = leastsq(error1, p0, args=(x,yObs)) # 最小二乘法求线性拟合主要参数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]))# 由拟合函数 fitfunc 测算拟合曲线在数据信息点的函数yFit = fitfunc1(pFit,x)# 较为:回归分析,能够回到切线斜率,截距,r 值,p 值,标准误差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)) # 輸出截距 interceptprint("p[1] = {:.4f}".format(slope)) # 輸出切线斜率 slopeprint("r^2_value: {:.4f}".format(r_value**2)) # 輸出 r^2 值print("p_value: {:.4f}".format(p_value)) # 輸出 p 值print("std: {:.4f}".format(std)) # 輸出标准偏差 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()程序执行結果:
Data fitting with Scipy.optimize.leastsqy = p[0] p[1] * xp[0] = 2.2688p[1] = 1.5528Linear regress with Scipy.stats.linregressy = p[0] p[1] * xp[0] = 2.2688p[1] = 1.5528r^2_value: 0.9521p_value: 0.0000std: 0.1161
2.3 Python方法:多自变量线性拟合。程序流程叙述:
scipy.optimize.leastsq() 既能够用以单自变量还可以用以多自变量难题,本方法求得一个二元线性拟合难题:y = p[0] p[1] * x1 p[2] * x2。leastsq() 求得多自变量难题的方式与单自变量难题相近,以子函数 error2(p, x1, x2, y) 来界定观测值与拟合函数值的误差函数,以动态性主要参数 args 的方法传送观察数据信息 (x, yObs) 。leastsq() 中误差函数的涵数名能够随意界定,但误差函数的主要参数需要依照 (p,x1,x2,y) 的排列顺序,不可以更改顺序。scipy 只有做一元回归分析,方法中根据启用 statsmodels.api 开展多元化回归分析,能够获得各种各样统计分析主要参数,供大家参照。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.leastsqimport numpy as npimport matplotlib.pyplot as plt # 导进 Matplotlib 工具箱from scipy.optimize import leastsq # 导进 scipy 中的最小二乘法专用工具def fitfunc2(p, x1, x2): # 界定拟合函数为平行线 p0, p1, p2 = p # 拟合函数的主要参数 y = p0 p1*x1 p2*x2 # 拟合函数的关系式 return ydef error2(p, x1, x2, y): # 界定观测值与拟合函数值的误差函数 err = fitfunc2(p, x1, x2) - y # 测算方差 return err# 建立给出数据信息点集 (x,yObs)np.random.seed(1)p = [2.5, 1.5, -0.5] # y = p[0] p[1] * x1 p[2] * x2x1 = 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 # 标准偏差 zzObs = z np.random.randn(x1.shape[-1]) # 转化成含有噪音的观察数据信息print(x1.shape, z.shape, zObs.shape)# 由给出数据信息点集 (x,z) 求拟合函数的主要参数 pFitp0 = [1, 1, 1] # 设定拟合函数的主要参数初始值pFit, info = leastsq(error2, p0, args=(x1,x2,zObs)) # 最小二乘法求线性拟合主要参数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]))# 由拟合函数 fitfunc 测算拟合曲线在数据信息点的函数zFit = fitfunc2(pFit, x1, x2)# 多元化回归分析:最小二乘法(OLS)import statsmodels.api as smx0 = 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 eresults = model.fit() # 回到实体模型线性拟合結果zFit = results.fittedvalues # 实体模型线性拟合的 y值print(results.summary()) # 輸出多元回归分析的引言print("nOLS model: y = b0*x0 b1*x1 b2*x2")print('Parameters: ', results.params) # 輸出:拟合模型的指数程序执行結果:
Data fitting with Scipy.optimize.leastsqz = p[0] p[1]*x1 p[1]*x2p[0]=2.6463p[1]=2.2410p[2]=-1.3710OLS Regression Results OLS model: y = b0*x0 b1*x1 b2*x2Parameters: [ 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.820x1 2.2410 1.043 2.148 0.064 -0.165 4.647x2 -1.3710 1.312 -1.045 0.326 -4.396 1.654==============================================================================3.非线性函数数据拟合。
3.1离散系统拟合函数的叙述。
非线性函数是一个十分广泛的定义。在这里一节中,大家探讨了对数函数,多项式函数和样条涵数的离散系统函数拟合,并采用了Scipy的涵数。提升。leastsq(),scipy.linalg.lstsq()和scipy。插值法。scipy工具箱中的单自变量样条涵数()。
文中2.1详细介绍了scipy.optimize.leastsq()的操作方法,22详细介绍了scipy . insert .单自变量样条()的操作方法。插值法方式。下边详细介绍scipy.linalg.lstsq()的作用。
Lstsq()涵数能够根据键入观察数据信息(x,yObs)并依据代数式级别将x变换为x来得到多项式函数的指数,不用界定拟合函数或误差函数,因而特别适合较为不一样级别多项式函数的线性拟合实际效果。
scipy.linalg.lstsq(a,b,cond =无,overwrite _ a =假,overwrite _ b =假,check _ limited =真,lapack _ driver =无)
基本参数:
a:(m,n) 二维数组,表明方程式 Ax=b 的左边。b:(m,) 二维数组,表明方程式 Ax=b 的右边。传参:
x:最小二乘的解,指多项式函数的指数。留意:在lstsq()涵数中,列方程Ax=b,a代表着观察数据信息x i x_ix转换为引流矩阵(x I 0,x I 1,...x I m)依据代数式阶次,i = 1,,n,b表明y i,I = 1,,n,而x指的是多项式函数的指数,详细方法。
3.2 Python方法:指数值函数拟合。
程序流程叙述:
scipy.optimize.leastsq() 实质上是求得含有未确定主要参数的误差函数降到最低难题,因而能够用以对数函数的最小二乘线性拟合。相近地,基本原理上 leastsq() 还可以用以其他方式非线性函数的曲线拟合难题,但针对一些函数拟合偏差几率会非常大。leastsq() 以子函数 error3(p, x, y) 来界定观测值与拟合函数值的误差函数,以动态性主要参数 args 的方法传送观察数据信息 (x, yObs) 。leastsq() 中误差函数的涵数名能够随意界定,但误差函数的主要参数需要依照 (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. 离散系统函数拟合:指数值函数拟合(exponential function)import numpy as npimport matplotlib.pyplot as plt # 导进 Matplotlib 工具箱from scipy.optimize import leastsq # 导进 scipy 中的最小二乘法专用工具def fitfunc3(p, x): # 界定拟合函数 p0, p1, p2 = p # 拟合函数的主要参数 y = p0 p1 * np.exp(-p2*x) # 拟合函数的关系式 return ydef error3(p, x, y): # 界定方差涵数 err = fitfunc3(p,x) - y # 方差 return err# 建立给出数据信息点集 (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]) # 转化成含有噪音的观察数据信息# print(x.shape, y.shape, yObs.shape)# 由给出数据信息点集 (x,y) 求拟合函数的主要参数 pFitp0 = [1, 1, 1] # 设定拟合函数的主要参数初始值pFit, info = leastsq(error3, p0, args=(x,yObs)) # 最小二乘法求线性拟合主要参数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]))# 由拟合函数 fitfunc 测算拟合曲线在数据信息点的函数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()程序执行結果:
Data fitting of exponential functiony = p0 p1 * np.exp(-p2*x)p[0] = 0.5216p[1] = 2.5742p[2] = 1.6875
3.3 Python方法:代数式函数拟合。程序流程叙述:
scipy.optimize.leastsq() 实质上是求得含有未确定主要参数的误差函数降到最低难题,因而能够用以多项式函数的最小二乘线性拟合,操作方法与线性拟合,指数值线性拟合相近。因为 leastsq() 要以子函数 error(p, x, y) 来界定观测值与拟合函数值的误差函数,在较为不一样级别的代数式函数拟合时必须界定好几个匹配的误差函数,较为繁杂。scipy.linalg.lstsq() 只需传到观察数据信息 (x,yObs),并将 x 按代数式级别变换为 X,就可以求出多项式函数的指数,不用界定线性拟合函数或误差函数,特别适合较为不一样级别的代数式函数拟合的实际效果。针对同样级别的多项式函数,leastsq() 与 lstsq() 的参数估计和线性拟合結果是同样的。扩大代数式的级别,能够减少拟合曲线与观察数据信息的偏差平均数,但也更非常容易造成多重共线性,尽管能能够更好地线性拟合练习数据信息,但并不可以真正体现数据信息的整体规律性,因此针对培训数据信息之外的数据测试的线性拟合实际效果反倒减少了。Python方法:
# mathmodel25_v1.py# Demo25 of mathematical modeling algorithm# Demo of curve fitting with Scipy# Copyright 2021 YouCans, XUPT# Crated:2021-08-03# 4. 离散系统函数拟合:代数式函数拟合(Polynomial function)import numpy as npimport matplotlib.pyplot as plt # 导进 Matplotlib 工具箱from scipy.linalg import lstsq # 导进 scipy 中的 linalg, stats 库函数from scipy.optimize import leastsq # 导进 scipy 中的最小二乘法专用工具def fitfunc4(p, x): # 界定拟合函数 p0, p1, p2, p3 = p # 拟合函数的主要参数 y = p0 p1*x p2*x*x p3*x*x*x # 拟合函数的关系式 return ydef error4(p, x, y): # 界定观测值与拟合函数值的误差函数 err = fitfunc4(p,x) - y # 方差 return err# 建立给出数据信息点集 (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) # 测算已经知道数据信息点的标准偏差 y =f(x)np.random.seed(1)yObs = y 0.5*np.random.randn(x.shape[-1]) # 转化成含有噪音的观察数据信息 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() 开展代数式函数拟合p0 = [1, 1, 1, 1] # 设定拟合函数的主要参数初始值pFit, info = leastsq(error4, p0, args=(x,yObs)) # 最小二乘法求线性拟合主要参数yFit = fitfunc4(pFit, x) # 由拟合函数 fitfunc 测算拟合曲线在数据信息点的函数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") # 拟合函数的关系式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() 开展代数式函数拟合print("nPolynomial fitting by scipy.linalg.lstsq")print("y = w[0] w[1]*x w[2]*x^2 ... w[m]*x^m") # 拟合函数的关系式# 最小二乘法代数式数据拟合,求得多项式函数的指数 W=[w[0],...w[m]]for order in range(1,5): # order = 3 # 代数式级别, m X = 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 = b print("order={:d}".format(order)) for i in range(order 1): # W = [w[0],...w[order]] print("tw[{:d}] = {:.4f}".format(i, W[i,0])) # 由拟合函数 fitfunc 测算拟合曲线在数据信息点的函数 yFit = X.dot(W) # y = w[0] w[1]*x w[2]*x^2 ... w[m]*x^m # 制图:n 次多项式函数拟合曲线 ax.plot(x, yFit, '-', label='order={}'.format(order))plt.legend(loc="best")plt.show()程序执行結果:
Polynomial fitting by scipy.optimize.leastsqy = p[0] p[1]*x p[2]*x^2 p[3]*x^3p[0] = 0.9586p[1] = -0.4745p[2] = -0.3581p[3] = 1.1721Polynomial fitting by scipy.linalg.lstsqy = w[0] w[1]*x w[2]*x^2 ... w[m]*x^morder=1w[0] = 1.0331w[1] = 1.7354order=2w[0] = 0.2607w[1] = 0.3354w[2] = 1.4000order=3w[0] = 0.9586w[1] = -0.4745w[2] = -0.3581w[3] = 1.1721order=4w[0] = 1.0131w[1] = 1.6178w[2] = -1.1039w[3] = -1.5209w[4] = 1.3465
3.4 Python方法:样条拟合曲线。程序流程叙述:
Scipy。插值法。一元样条()类是一种根据固定不动数据信息点建立涵数的方式,它应用样条曲线来线性拟合给出的数据信息点集。
唯一性样条类从已经知道数据转化成样条插值涵数y=spl(x),根据启用样条插值涵数能够计算出特定x的函数f(x)。
轮生线类可用以数据信息插值法和线性拟合。主要参数s=0表明数据信息插值法,样条曲线务必通过全部数据信息点;S>0表明数据拟合,初始值为s= len(w)。
根据set _ smooth _ factor(SF)设定光滑因素,能够调节样条拟合函数,使拟合曲线能够更好地体现观察数据信息的特点,防止多重共线性。
Python方法:
# mathmodel25_v1.py# Demo25 of mathematical modeling algorithm# Demo of curve fitting with Scipy# Copyright 2021 YouCans, XUPT# Crated:2021-08-03# 5 离散系统函数拟合:样条函数拟合(Spline function)import numpy as npimport matplotlib.pyplot as plt # 导进 Matplotlib 工具箱from scipy.interpolate import UnivariateSpline # 导进 scipy 中的样条插值专用工具# 建立给出数据信息点集 (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] # 拟合函数的主要参数x = np.linspace(-1, 2, 30) # 转化成已经知道数据信息点集的 xy = p0 ((x*x-p1)**2 p2) * np.sin(x*p3) # 转化成标准偏差 yyObs = y 0.5*np.random.randn(x.shape[-1]) # 转化成含有噪音的观察数据信息# 由给出数据信息点集 (x,y) 求拟合函数的主要参数 fSplfSpl = UnivariateSpline(x, yObs) # 三次样条插值,默认设置 s= len(w)coeffs = fSpl.get_coeffs() # Return spline coefficientsprint("Data fitting with spline function")print("coeffs of 3rd spline function:n ", coeffs)# 由拟合函数 fitfunc 测算拟合曲线在数据信息点的函数yFit = fSpl(x) # 由插值法涵数 fSpl1 测算插值法点的函数 yFit# 对拟合函数 fitfunc 开展平滑处理fSpl.set_smoothing_factor(10) # 设定光洁因素 sfyS = fSpl(x) # 由插值法涵数 fSpl(sf=10) 测算插值法点的函数 yscoeffs = fSpl.get_coeffs() # 平滑处理后的主要参数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()程序执行結果:
Data fitting with spline functioncoeffs 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.自定义函数拟合曲线。4.1 scipy . optimize . curve _ fit()涵数的叙述。
Curve_fit()运用离散系统最小二乘法将自定拟合函数线性拟合到观察数据信息,不但能够拟合直线,二次曲线,三次曲线图,还能够线性拟合随意类型的自定义函数,应用特别便捷。Curve_fit()容许单自变量或多自变量自定义函数线性拟合。
**scipy.optimize.curve_fit(f,xdata,ydata,p0=None,sigma=None,absolute_sigma=False,check _ limited = True,bounds=(-inf,inf),method=None,jac=None,kwargs) **
基本参数:
f:可启用的涵数,自定的拟合函数,具备一个或好几个未确定主要参数。拟合函数的方式为 func(x,p1,p2,…),在其中主要参数需要依照 (x,p1,p2,…) 的排列顺序,p1, p2,… 是标量不可以表述为二维数组。xdata:n*m二维数组,n 为观察数据信息长短,m为自变量数量。观察数据信息 xdata 能够是一维数组(单自变量难题),还可以是多维数组(多自变量难题)。ydata:二维数组,长短为观察数据信息长短 n。p0:选择项,未确定主要参数 [p1,p2,…] 的初始值,初始值无。传参:
popt:未确定主要参数 ( p 1 , ⋯ p m ) 的最小二乘预测值。pcov:主要参数 ( p 1 , ⋯ p m )的预测值 popt 的协方差矩阵,其对角是各主要参数的标准差。4.2 Python方法:单自变量自定义函数的拟合曲线。
程序流程叙述:
有别于 leastsq() 界定观测值与拟合函数值的误差函数,scipy.optimize.curve_fit() 立即界定一个自定的拟合函数,更加形象化和有利于了解。curve_fit() 界定一个拟合函数,涵数名能够随意界定,但拟合函数的主要参数需要依照 (x,p1,p2,…) 的排列顺序,不可以更改顺序。p1, p2,… 是标量,不可以写出二维数组。留意 leastsq() 中误差函数的主要参数需要依照 (p,x,y) 的排列顺序,与 curve_fit() 不一样。leastsq() 还可以对自定的拟合函数开展最小二乘线性拟合。因为本方法中自定拟合函数应用了观察数据信息的现实实体模型,而不是通用性的多项式函数或样条涵数,因而线性拟合結果不能不错的线性拟合检测数据信息,并且能更精确地体现具体绘图的发展趋势。Python方法:
# 6. 自定义函数拟合曲线:单自变量import numpy as npimport matplotlib.pyplot as plt # 导进 Matplotlib 工具箱from scipy.optimize import leastsq, curve_fit # 导进 scipy 中的拟合曲线专用工具def fitfunc6(x, p0, p1, p2, p3): # 界定拟合函数为自定义函数 # p0, p1, p2, p3 = p # 拟合函数的主要参数 y = p0 ((x*x-p1)**2 p2) * np.sin(x*p3) return y# def error6(p, x, y): # 界定观测值与拟合函数值的误差函数# p0, p1, p2, p3 = p# err = fitfunc6(x, p0, p1, p2, p3) - y # 测算方差# return err# 建立给出数据信息点集 (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]) # 转化成含有噪音的观察数据信息# # 用 scipy.optimize.leastsq() 开展函数拟合# pIni = [1, 1, 1, 1] # 设定拟合函数的主要参数初始值# pFit, info = leastsq(error6, pIni, args=(x, yObs)) # 最小二乘法求线性拟合主要参数# 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() 开展自定义函数线性拟合(单自变量)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)# 由拟合函数 fitfunc 测算拟合曲线在数据信息点的函数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()程序执行結果:
Data fitting of custom function by curve_fit:y = p0 ((x*x-p1)**2 p2) * np.sin(x*p3)p[0] = 0.9460p[1] = 1.1465p[2] = 0.8291p[3] = 0.6008estimated 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 ]]結果剖析:
4.3 Python方法:多自变量自定义函数拟合曲线。程序流程叙述:
Scipy.optimize.curve_fit()可用以单自变量和多自变量难题。这一方法解决了二元非线性拟合难题。
Curve_fit()界定拟合函数fitfunc7(X,p0,p1,p2,p3)。涵数的名字能够随意界定,但拟合函数的主要参数务必按(x,p1,p2,…)的排列顺序,次序不可以更改。P1.p2.…是标量,不可以写出二维数组。
curve_fit(fitfunc7,X,yObs)中的X为(n,m)二维数组,n为观察数据信息点集的长短,m为自变量数量。
Python方法:
# mathmodel25_v1.py# Demo25 of mathematical modeling algorithm# Demo of curve fitting with Scipy# Copyright 2021 YouCans, XUPT# Crated:2021-08-03# 7. 自定义函数拟合曲线:多自变量import numpy as npimport matplotlib.pyplot as plt # 导进 Matplotlib 工具箱from scipy.optimize import curve_fit # 导进 scipy 中的拟合曲线专用工具def fitfunc7(X, p0, p1, p2, p3): # 界定多自变量拟合函数, X 是空间向量 # p0, p1, p2, p3 = p # 拟合函数的主要参数 y = p0 p1*X[0,:] p2*X[1,:] p3*np.sin(X[0,:] X[1,:] X[0,:]**2 X[1,:]**2) return y# 建立给出数据信息点集 (x,yObs)p = [1.0, 0.5, -0.5, 5.0] # 自定义函数的主要参数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) # 生成随机数组,长短为 8x2 = 3.0 * np.random.rand(5) # 生成随机数组,取值范围 (0,3.0)xmesh1, xmesh2 = np.meshgrid(x1, x2) # 转化成网格图点的座标 xx,yy (二维数组)xx1= xmesh1.reshape(xmesh1.shape[0]*xmesh1.shape[1], ) # 将网格图点展开为一维数组xx2= xmesh2.reshape(xmesh2.shape[0]*xmesh2.shape[1], ) # 将网格图点展开为一维数组X = np.vstack((xx1,xx2)) # 转化成多自变量二维数组,个数为自变量数量y = fitfunc7(X, p0, p1, p2, p3) # 基础理论测算值 y=f(X,p)yObs = y 0.2*np.random.randn(y.shape[-1]) # 转化成含有噪音的观察数据信息print(x1.shape,x2.shape,xmesh1.shape,xx1.shape,X.shape)# 用 scipy.optimize.curve_fit() 开展自定义函数线性拟合(多自变量)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]))# 由拟合函数 fitfunc 测算拟合曲线在数据信息点的函数yFit = fitfunc7(X, pFit[0], pFit[1], pFit[2], pFit[3])程序执行結果:
Data fitting of multivariable custom function:y = p0 p1*x1 p2*x2 p3*np.sin(x1 x2 x1^2 x2^2)p[0] = 1.0000p[0]_fit = 1.1316p[1] = 0.5000p[1]_fit = 0.5020p[2] = -0.5000p[2]_fit = -0.5906p[3] = 5.0000p[3]_fit = 5.0061estimated 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]]








