最小二乘法是一种在误差估计、不确定度、系统辨识及预测、预报等数据处理诸多学科领域得到广泛应用的数学工具 。最小二乘法是一种机器学习算法。
关于其原理的介绍以及公式推导有很多优质资料,比如我学习最小二乘法时的两个视频课程。本文不再介绍原理,而是介绍最小二乘法的工程应用。
数学建模之数据拟合(3):最小二乘法_哔哩哔哩_bilibili
[知识梳理-04] Recursive Least Squares 递归最小二乘法 RLS_哔哩哔哩_bilibili
本文介绍函数拟合与信号预测方面的应用,学会基本的使用之后,读者可以根据自身需求应用到误差估计、参数辨识等领域,具体使用方法可以参考相关文献资料。使用Matlab作为演示,为了展示最小二乘法的向量表示,不使用Matlab的库函数。读者自己使用时也可以使用matlab的函数,比如polyfit、lsqcurvefit等,他们都是基于最小二乘法,根据需求选择函数,查看Matlab帮助文档即可。
用最小二乘求解非线性曲线拟合(数据拟合)问题 - MATLAB lsqcurvefit- MathWorks 中国
多项式曲线拟合 - MATLAB polyfit- MathWorks 中国
普通的最小二乘法只有两个公式,其中:
inv(A):求A得逆矩阵
X.' :求X得转置矩阵
function [ w ] = LS_Fitting( X, Y)
%输入: X 自变量矩阵
% Y 因变量矩阵
%输出: w 系数矩阵
%作者:飞鸟
P = inv(X.'*X );
w = P * X.' * Y;
end
最小二乘法可以转化为优化问题,我们假设目标方程为一阶线性方程,即:y = ax + b ,我们的目的是求解一个合适的a和b,使得目标函数的值最小。通过极值的方法进行求解,会涉及高数中的求偏导。当然不懂偏导也没有关系,我们直接看求解结果,会使用就行。
求解结果:
?
在c语言中,不方便进行矩阵、向量运算,可以直接使用a、b的求解结果。实际使用时,x与y均为已知量。计算为最基本的加减乘除运算,我们很容易写出运算的代码。
a、b为一阶线性方程的解,一般一阶线性方程就可以了,如果需要其他目标方程,可以去查阅相关资料,查找的资料也是直接查找对应的系数值(a、b、...)就行,不用关注推导过程。
我们已经介绍了2种最小二乘法的计算方法,可以根据数据求解出我们需要的目标方程,以下是算法实践。
目标方程:y = ax + b
系数矩阵:w = [a;b];
X = [ 1980 1
1984 1
1988 1
1992 1
1996 1
2000 1
2004 1
2008 1
2012 1
2016 1
2020 1 ];
Y = [ 10.25
9.99
9.92
9.96
9.84
9.87
9.85
9.69
9.63
9.81
9.80];
w= LS_Fitting( X, Y);
目标方程:y = ax^2 + bx + c
系数矩阵:w = [a;b;c];
X = [ 1980*1980 1980 1
1984*1984 1984 1
1988*1988 1988 1
1992*1992 1992 1
1996*1996 1996 1
2000*2000 2000 1
2004*2004 2004 1
2008*2008 2008 1
2012*2012 2012 1
2016*2016 2016 1
2020*2020 2020 1];
Y = [ 10.25
9.99
9.92
9.96
9.84
9.87
9.85
9.69
9.63
9.81
9.80];
w= LS_Fitting( X, Y);
以非线性方程拟合结果预测2024年百米冠军成绩为例,拟合方程为:
Fun =(1039712176776813*x^2)/2305843009213693952 - (8167480322080091*x)/4503599627370496 + 4031421507106269/2199023255552
带入年份x=2024,输出预测成绩:9.8228
最小二乘法应用广泛,拟合方程后的用法也不只是信号预测方面,例如还可以做智能控制,可以结合本文的拟合方法带入自己的应用场景。实际使用中,灵活选择目标方程,可以获得更好的拟合结果。
以上介绍的最小二乘法对离线数据进行拟合,而递归最小二乘法可以应用于时变系统,可以进行实时的参数估计、自适应控制等,并且占用内存资源更小,下一篇文章中介绍递归最小二乘法。
参考资料:
曹连江著,电子信息测量及其误差分析校正的研究,东北师范大学出版社,2017.09,第260页