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=1∑n[yi−f(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+p1∗x, 由极值的必要条件 $ \\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 = \\fracn \\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_in - a_1 \\frac \\sum_i=1^n x_in
p1=n∑i=1nxi2−(∑i=1nxi)2n∑i=1nxiyi−∑i=1nxi∑i=1nyip0=n∑i=1nyi−a1n∑i=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+p1∗x1+⋯+pm∗xm, 类似地,可以解出系数
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,p