文章标题

   最小二乘法,通常用在我们已知数学模型,但是不知道模型参数的情况下,通过实测数据,计算数学模型,例如,在题目中,数学模型就是直线方程y=ax+b,但是不知道直线方程的a和b。
        本来呢,我们只需要两组(xi,yi),就可以解得a和b,但是由于实测数据都存在误差,所以,我们很容易想到一个办法,我们测很多组数据来让我的a和b更加准确。
    “我们测很多组数据来让我的a和b更加准确” ,那么我从数学角度如何体现这句话呢?
        比如在此例中,已知数学模型 y=ax+b 
    我们有很多组数据,那么我们要找一条直线,使得我们测得的每个数据,到这条直线的偏离量的总和最小。(这句话有点拗口,慢慢理解下)
    那么怎么用数学描述“偏离量总和最小”这个概念呢?
  数学家运用了方差!
      数学模型 y=ax+b
        设F=ax+b-y
        那么对于模型上的点(注意是模型上的点,也就是理论值),F=ax+b-y=0
        但是对于实际值来说,F=axi+b-yi 一定不等于0。那么我们就要找到一对a和b,使得F尽可能接近于0。
        也就是说,“偏离量总和最小”这个概念,在数学上实际上就是要求F的方差最小。
    即 Σ F^2→0 (F的平方和趋近于0)
        即 Σ(axi+b-yi)^2→0
        那么我们得到一个方程f(a,b)=Σ(axi+b-yi)^2,我们要找到合适的a,b使得f(a,b)最小!
  也就是说,我们要找到的实际上是f(a,b)的最小值点。(因为方差不可能小于0)
  因此我们需要求f(a,b)的极值点。我们借助数学工具偏导。
  如果有一组a,b使得
   ∂f(a,b)/∂a=0
        ∂f(a,b)/∂b=0
    那么f(a,b)就是极值点,如果a,b只有一对,那么它就是最小值点。
  即  ∂( Σ(axi+b-yi)^2 )/∂a=0
             ∂( Σ(axi+b-yi)^2 )/∂b=0
  化简得到
             a*Σxi^2 + b*Σxi = Σ(xi*yi)
             a*Σxi + b*N = Σyi
        其中N是(xi,yi)的个数。即我们测了多少组数据
 
     解上面的二元方程,我们就可以得到唯一的一组a,b啦,这就是我们所需要的a和b
 
        O(∩_∩)O~是不是蛮简单的?
Matlab最基础的程序如下:
   
   
  1. %原始数据  
  2. X=[163     123     150      123     141];  
  3. Y=[186     126     172      125     148];  
  4. n=5;                %一共5个变量  
  5.   
  6. x2=sum(X.^2);       % 求Σ(xi^2)  
  7. x1=sum(X);          % 求Σ(xi)  
  8. x1y1=sum(X.*Y);     % 求Σ(xi*yi)  
  9. y1=sum(Y);          % 求Σ(yi)  
  10.   
  11. a=(n*x1y1-x1*y1)/(n*x2-x1*x1);      %解出直线斜率b=(y1-a*x1)/n  
  12. b=(y1-a*x1)/n;                      %解出直线截距  
  13. %作图  
  14. % 先把原始数据点用蓝色十字描出来  
  15. figure  
  16. plot(X,Y,’+’);        
  17. hold on  
  18. % 用红色绘制拟合出的直线  
  19. px=linspace(120,165,45);%这里直线区间根据自己实际需求改写  
  20. py=a*px+b;  
  21. plot(px,py,’r’);  
%原始数据
X=[163     123     150      123     141];
Y=[186     126     172      125     148];
n=5;                %一共5个变量

x2=sum(X.^2);       % 求Σ(xi^2)
x1=sum(X);          % 求Σ(xi)
x1y1=sum(X.*Y);     % 求Σ(xi*yi)
y1=sum(Y);          % 求Σ(yi)

a=(n*x1y1-x1*y1)/(n*x2-x1*x1);      %解出直线斜率b=(y1-a*x1)/n
b=(y1-a*x1)/n;                      %解出直线截距
%作图
% 先把原始数据点用蓝色十字描出来
figure
plot(X,Y,'+');      
hold on
% 用红色绘制拟合出的直线
px=linspace(120,165,45);%这里直线区间根据自己实际需求改写
py=a*px+b;
plot(px,py,'r');
结果 a=1.5555  b=-66.365
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值