在数学建模课上新学习的算法,(虽然说之前学高数的时候学习过,但是好像没学会或者是忘了。这里就记一下自己关于最小二乘法的理解。
最小二乘法定义:
给定某种函数类型$y=f(x)$和m个数据点$(x_i,y_i)$的一个集合,极小化绝对偏差$|y_i-f(x_i)|$之平方和,即确定函数类型$y=f(x)$的参数从而极小化:
$$\sum_{i=1}^m |y_i-f(x_i)|^2$$
原始方法
最小二乘法最原始的做法便是利用方程求解的思想,一个个求出拟合方程中的未知量。
这里我就讲讲关于一次方程,也就是直线,通过原始方法拟合的步骤。
准备
首先假设我们有m
组原始数据,记为($x_i,y_i)(1\leq i \leq m)$.
同时我们假设拟合后的函数为$y=kx+b$.
假设绝对偏差平方和为$S=\sum_{i=1}^m |y_i-f(x_i)|^2$.
极小化
接下来我们极小化绝对偏差$S$.
我们对$S$分别求$k,b$的偏导,并使其为零:
$$
\begin{cases}
\frac {\partial S}{\partial k}=2\sum_{i=1}^m (y_i-(kx_i+b))(-x_i)=0\\
\frac {\partial S}{\partial b}=2\sum_{i=1}^m (y_i-(kx_i+b))(-1)=0\\
\end{cases}
$$
整理:
$$
\begin{cases}
\sum_{i=1}^m kx_i^2+\sum_{i=1}^m bx_i=\sum_{i=1}^m x_iy_i\\
\sum_{i=1}^m kx_i+mb=\sum_{i=1}^m y_i\\
\end{cases}
$$
求解
利用行列式求解方程组:
$$
D=
\begin{vmatrix}
\sum_{i=1}^m x_i^2&\sum_{i=1}^m x_i\\
\sum_{i=1}^m x_i&m\\
\end{vmatrix}
$$
$$
D_k=
\begin{vmatrix}
\sum_{i=1}^m x_iy_i&\sum_{i=1}^m x_i\\
\sum_{i=1}^m y_i&m\\
\end{vmatrix}
$$
$$
D_b=
\begin{vmatrix}
\sum_{i=1}^m x_i^2&\sum_{i=1}^m x_iy_i\\
\sum_{i=1}^m x_i&\sum_{i=1}^m y_i\\
\end{vmatrix}
$$
最后通过$k=\frac {D_k}{D},b=\frac {D_b}{D}$即可求出拟合后的方程中的参数。
推广
更多次函数拟合用此方法求解较为复杂,但如果头铁(我最多做了个二次曲线的拟合,那已经很麻烦了,更蠢的是,我当时忘记了MATLAB中的det函数可以直接求解行列式,我自己手动展开输入算式,都是泪)硬要做也不是不可以,更方便的方法见下。
矩阵
高次函数的拟合我们可以用矩阵更快的求出结果。
准备
为了牛逼起见,这里我们直接上N次函数的拟合(有N+1个未知数),还是m组$(x_i,y_i)(1\leq i\leq m)$。
设参数矩阵:
$$
A=
\begin{pmatrix}
a_1&a_2&a_3&\cdots &a_{N+1}\\
\end{pmatrix}
$$
设自变量矩阵:
$$
X=
\begin{pmatrix}
x_1^N&x_2^N&x_3^N&\cdots&x_m^N\\
x_1^{N-1}&x_2^{N-1}&x_3^{N-1}&\cdots&x_m^{N-1}\\
\vdots&\vdots&\vdots&\ddots&\vdots\\
x_1&x_2&x_3&\cdots&x_m\\
1&1&1&\cdots&1\\
\end{pmatrix}
$$
设因变量矩阵:
$$
Y=
\begin{pmatrix}
y_1&y_2&y_3&\cdots&y_m\\
\end{pmatrix}
$$
求解
于是我们得到方程$AX=Y$。求解步骤如下:
$$
AX=Y
$$
两边右乘X的转置
$$
AXX^T=YX^T
$$
两边右乘XX^T的逆
$$
AXX^T(XX^T)^{-1}=YX^T(XX^T)^{-1}
$$
解得
$$
A=YX^T(XX^T)^{-1}\\
$$
注:不能直接两边右乘$X$的逆,因为$X$可能不存在逆矩阵,而$XX^T$的逆一定存在。
拓展
如果要求多项式某几项为零时,则自变量矩阵不加入相对于次数的行,而参数矩阵去掉相应的参数即可。
例如,如果一个N次函数拟合时要求没有一次项,那么:
参数矩阵:
$$
A=
\begin{pmatrix}
a_1&a_2&a_3&\cdots &a_{N-1}&a_{N+1}\\
\end{pmatrix}
$$
自变量矩阵:
$$
X=
\begin{pmatrix}
x_1^N&x_2^N&x_3^N&\cdots&x_m^N\\
x_1^{N-1}&x_2^{N-1}&x_3^{N-1}&\cdots&x_m^{N-1}\\
\vdots&\vdots&\vdots&\ddots&\vdots\\
x_1^2&x_2^2&x_3^2&\cdots&x_m^2\\
1&1&1&\cdots&1\\
\end{pmatrix}
$$
因变量矩阵$Y$不变。
然后按照上述公式求解即可。
return 0;
本文链接:
https://luojinrong.github.io/2018/10/27/最小二乘法/