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

Posted youcans

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了# Python小白的数学建模课-23.数据拟合全集相关的知识,希望对你有一定的参考价值。


  • 拟合是用一个连续函数(曲线)靠近给定的离散数据,使其与给定的数据相吻合。
  • 数据拟合的算法相对比较简单,但调用不同工具和方法时的函数定义和参数设置有所差异,往往使小白感到困惑。
  • 本文基于 Scipy 工具包,对单变量、多变量线性最小二乘拟合,指数函数、多项式函数、样条函数的非线性拟合,单变量、多变量的自定义函数拟合问题进行分析、给出完整例程和结果,数据拟合从此无忧。
  • 『Python小白的数学建模课 @ Youcans』带你从数模小白成为国赛达人。


1. 数据拟合

在科学研究和工程应用中经常通过测量、采样、实验等方法获得各种数据。对一组已知数据点集,通过调整拟合函数(曲线)的参数,使该函数与已知数据点集相吻合,这个过程称为数据拟合,又称曲线拟合。

插值和拟合都是根据一组已知数据点,求变化规律和特征相似的近似曲线的过程。但是插值要求近似曲线完全经过所有的给定数据点,而拟合只要求近似曲线在整体上尽可能接近数据点,并反映数据的变化规律和发展趋势。因此插值可以看作是一种特殊的拟合,是要求误差函数为 0 的拟合。

1.1 数据拟合问题的分类

数据拟合问题,可以从不同角度进行分类:

  • 按照拟合函数分类,分为线性函数和非线性函数。非线性函数用于数据拟合,常用的有多项式函数、样条函数、指数函数和幂函数,针对具体问题还有自定义的特殊函数显示。
  • 按照变量个数分类,分为单变量函数和多变量函数。
  • 按照拟合模型分类,分为基于模型的数据拟合和无模型的函数拟合。基于模型的数据拟合,是通过建立数学模型描述输入输出变量之间的关系,拟合曲线不仅能拟合观测数据,拟合模型的参数通常具有明确的物理意义。而无模型的函数拟合,是指难以建立描述变量关系的数学模型,只能采用通用的函数和曲线拟合观测数据,例如多项式函数拟合、样条函数拟合,也包括机器学习和神经网络模型,这种模型的参数通常没有明确的意义。

1.2 数据拟合的原理和方法

数据拟合通过调整拟合函数中的待定参数,从整体上接近已知的数据点集。

这是一个优化问题,决策变量是拟合函数的待定参数,优化目标是观测数据与拟合函数的函数值之间的某种误差指标。典型的优化目标是拟合函数值与观测值的误差平方和;当观测数据的重要性不同或分布不均匀时,也可以使用加权误差平方和作为优化目标。

数据拟合的基本方法是最小二乘法。对于观测数据 ( x i , y i ) , i = 1 , . . n (x_i,y_i),i=1,..n (xi,yi),i=1,..n,将观测值 y i y_i yi 与拟合函数 y = f ( x , p ) y=f(x,p) y=f(x,p)的计算值 f ( x i ) f(x_i) f(xi)的误差平方和最小作为优化问题的目标函数:
m i n    J ( p 1 , ⋯ p m ) = ∑ i = 1 n [ y i − f ( x i ) ] 2 min \\; J(p_1, \\cdots p_m) = \\sum_{i=1}^n [y_i - f(x_i)]^2 minJ(p1,pm)=i=1n[yif(xi)]2
( p 1 , ⋯ p m ) (p_1, \\cdots p_m) (p1,pm) 是拟合函数中的待定参数。

对于线性拟合问题,设拟合函数为直线 f ( x ) = p 0 + p 1 ∗ x f(x) = p_0+p_1*x f(x)=p0+p1x, 由极值的必要条件 $ \\partial J/\\partial p_j = 0,; (j=0,1)$ 可以解出系数 p 0 , p 1 p_0, p_1 p0,p1
p 1 = n ∑ i = 1 n x i y i − ∑ i = 1 n x i ∑ i = 1 n y i n ∑ i = 1 n x i 2 − ( ∑ i = 1 n x i ) 2 p 0 = ∑ i = 1 n y i n − a 1 ∑ i = 1 n x i n p_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=1nxi2(i=1nxi)2ni=1nxiyii=1nxii=1nyip0=ni=1nyia1ni=1nxi
对于多变量线性最小二乘问题,设拟合函数为直线 f ( x ) = p 0 + p 1 ∗ x 1 + ⋯ + p m ∗ x m f(x) = p_0+p_1*x_1+ \\cdots +p_m*x_m f(x)=p0+p1x1++pmxm, 类似地,可以解出系数 p 0 , p 1 , ⋯ p m p_0, p_1, \\cdots p_m p0,p1,pm

对于非线性函数的拟合问题,通常也是按照最小二乘法的思路,求解上述误差平方和最小化这个非线性优化问题,常用的具体算法有搜索算法和迭代算法两类。


1.3 Python 数据拟合方法

数据拟合是常用算法,Python 语言的很多工具包都提供了数据拟合方法,常用的如 Scipy、Numpy、Statsmodel、Scikit-learn 工具包都带有数据拟合的函数与应用。

Scipy 是最常用的 Python 工具包,本系列中非线性规划、插值方法也都是使用 Scipy 工具包实现,因此仍以 Scipy 工具包讲解数据拟合问题。

Scipy 工具包对于不同类型的数据拟合问题,提供了不同的函数或类。由于 Scipy 工具包是多个团队合作完成,而且经过了不断更新,因此调用不同函数和方法时的函数定义和参数设置有所差异,往往使小白感到困惑。

本文对单变量、多变量线性最小二乘拟合,指数函数、多项式函数、样条函数的非线性拟合,单变量、多变量的自定义函数拟合问题进行分析、给出完整例程和结果,数据拟合从此无忧。



2. 线性最小二乘拟合

2.1 线性最小二乘拟合函数说明

线性最小二乘拟合是最简单和最常用的拟合方法。scipy.optimize 工具箱中的 leastsq()、lsq_linear(),scipy.stats 工具箱中的 linregress(),都可以实现线性最小二乘拟合。

2.1.1 scipy.optimize.leastsq 函数说明

leastsq() 根据观测数据进行最小二乘拟合计算,只需要观测值与拟合函数值的误差函数和待定参数 的初值,返回拟合函数中的待定参数 ( p 1 , ⋯ p m ) (p_1, \\cdots p_m) (p1,pm),但不能提供参数估计的统计信息。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 ) (p_1, \\cdots p_m) (p1,pm) 的初值。
  • args:元组,线性拟合时提供观测数据值 (xdata, ydata),观测数据 xdata 可以是一维数组(单变量问题),也可以是多维数组(多变量问题)。

返回值:

  • x:一维数组,待定参数 ( p 1 , ⋯ p m ) (p_1, \\cdots p_m) (p1,pm) 的最小二乘估计值。

2.1.2 scipy.stats.linregress 函数说明

linregress() 根据两组观测数据 (x,y) 进行线性最小二乘回归,不仅返回拟合函数中的待定参数 ( p 1 , p 1 ) (p_1, p_1) (p1以上是关于# Python小白的数学建模课-23.数据拟合全集的主要内容,如果未能解决你的问题,请参考以下文章

Python小白的数学建模课-22.插值方法

Python小白的数学建模课-02.数据导入

Python小白的数学建模课-01.新手必读

Python小白的数学建模课-15.图论的基本概念

Python小白的数学建模课-05.0-1规划

Python小白的数学建模课-03.线性规划