最小二乘法

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

线性最小二乘的基本公式

编辑
考虑超定方程组(超定指未知数小于方程个数):
其中m代表有m个等式,n代表有 n 个未知数
  
,m>n ;将其进行向量化后为:

  
  
  
 
显然该方程组一般而言没有解,所以为了选取最合适的
  
让该等式"尽量成立",引入残差平方和函数S
(在统计学中,残差平方和函数可以看成n倍的均方误差MSE)
  
时,
  
取最小值,记作:
  
进行微分[2]  求最值,可以得到:

如果矩阵
  
非奇异则
  
有唯一解[3]  

原理

编辑
在我们研究两个变量(x,y)之间的相互关系时,通常可以得到一系列成对的数据(x1,y1.x2,y2... xm,ym);将这些数据描绘在x -y直角坐标系中,若发现这些点在一条直线附近,可以令这条直线方程如(式1-1)。
  
(式1-1)
其中:a0、a1 是任意实数
为建立这直线方程就要确定a0和a1,应用《最小二乘法原理》,将实测值Yi与利用计算值Yj(Yj=a0+a1Xi)(式1-1)的离差(Yi-Yj)的平方和
  
最小为“优化判据”。
令:φ =
  
(式1-2)
把(式1-1)代入(式1-2)中得:
φ =
  
(式1-3)
  
最小时,可用函数 φ 对a0、a1求偏导数,令这两个偏导数等于零。
∑2(a0 + a1*Xi - Yi)=0(式1-4)
∑2Xi(a0 +a1*Xi - Yi)=0(式1-5)
亦即:
na0 + (∑Xi ) a1 = ∑Yi (式1-6)
(∑Xi ) a0 + (∑Xi^2 ) a1 = ∑(Xi*Yi) (式1-7)
得到的两个关于a0、 a1为未知数的两个方程组,解这两个方程组得出:
a0 = (∑Yi) / n - a1(∑Xi) / n (式1-8)
a1 = [n∑(Xi Yi) - (∑Xi ∑Yi)] / (n∑Xi^2 -∑Xi∑Xi)(式1-9)
这时把a0、a1代入(式1-1)中, 此时的(式1-1)就是我们回归的一元线性方程即:数学模型。
在回归过程中,回归的关联式不可能全部通过每个回归数据点(x1,y1. x2,y2...xm,ym),为了判断关联式的好坏,可借助相关系数“R”,统计量“F”,剩余标准偏差“S”进行判断;“R”越趋近于 1 越好;“F”的绝对值越大越好;“S”越趋近于 0 越好。
R = [∑XiYi - m (∑Xi / m)(∑Yi / m)]/ SQR{[∑Xi2 - m (∑Xi / m)2][∑Yi2 - m (∑Yi / m)2]} (式1-10) *
在(式1-10)中,m为样本容量,即实验次数;Xi、Yi分别为任意一组实验数据X、Y的数值。[1] 

公式                                       

拟合

编辑
对给定数据点集合
  
,在取定的函数类
  
中,求
  
,使误差的平方和
  
最小,
  
。从几何意义上讲,就是寻求与给定点集
  
的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法。[1] 
最小二乘法的矩阵形式
最小二乘法的矩阵形式为:
其中
  
  
的矩阵,
  
  
的列向量,
  
  
的列向量。如果
  
(方程的个数大于未知量的个数),这个方程系统称为矛盾方程组(Over Determined System),如果
  
(方程的个数小于未知量的个数),这个系统就是Under Determined System。
正常来看,这个方程是没有解的,但在数值计算领域,我们通常是计算
  
,解出其中的
  
。比较直观的做法是求解
  
,但通常比较低效。其中一种常见的解法是对
  
进行QR分解(
  
),其中
  
  
正交矩阵(Orthonormal Matrix),
  
  
三角矩阵(Upper Triangular Matrix),则有
用MATLAB命令
1
x=R(Q)
可解得
  
[1] 
最小二乘法的Matlab实现
① 一次函数线性拟合使用polyfit(x,y,1)
②多项式函数线性拟合使用 polyfit(x,y,n),n为次数
拟合曲线
x=[0.5,1.0,1.5,2.0,2.5,3.0],
y=[1.75,2.45,3.81,4.80,7.00,8.60]。
解:MATLAB程序如下:
1
2
3
4
5
6
x=[0.5,1.0,1.5,2.0,2.5,3.0];
y=[1.75,2.45,3.81,4.80,7.00,8.60];
p=polyfit(x,y,2)
x1=0.5:0.5:3.0;
y1=polyval(p,x1);
plot(x,y,'*r',x1,y1,'-b')
计算结果为:
1
=0.5614 0.8287 1.1560
即所得多项式为y=0.5614x^2+0.8287x+1.15560
非线性函数使用
1
2
lsqcurvefit(fun,x0,x,y)
a=nlinfit(x,y,fun,b0)




原文地址:https://www.cnblogs.com/xuxinstyle/p/9128900.html