zoukankan      html  css  js  c++  java
  • 线性最小二乘法的矩阵解法

    1.公式推导

    PPT参考自:中国科学院的PPT ,矩阵解的具体推导过程见博客

    其中残差函数矩阵 f(c) 求导的过程推导如下,需要用到矩阵求导的2条结论

     

    2.两种最小二乘法的平面拟合MATLAB代码对比

    1)用传统的∑方式求平面方程z=ax + by + c的参数

     1 function [ a,b,c ]=FitPlane( input_X , input_Y , input_Z)
     2 
     3 % FileName   : FitPlane
     4 % CreatDate  : 2018/7/10
     5 % Describe    : Least square fitting plane equation
     6 % OutputPara : a,b,c
     7 % Note         : Plane equation: z=a*x+b*y+c
     8 % Author       : wellp
     9 
    10 X1=0;Y1=0;Z1=0;X2=0;Y2=0;X1Y1=0;X1Z1=0;Y1Z1=0;
    11 num=length(input_X);
    12 if num<3 % less than 3 points can't fit the plane
    13     a=-8888;
    14     b=-8888;
    15     c=-8888;
    16 else
    17 for i=1 : num
    18     X1=X1+input_X(i);
    19     Y1=Y1+input_Y(i);
    20     Z1=Z1+input_Z(i);
    21     X2=X2+input_X(i)^2;
    22     Y2=Y2+input_Y(i)^2;
    23     X1Y1=X1Y1+input_X(i)*input_Y(i);
    24     X1Z1=X1Z1+input_X(i)*input_Z(i);
    25     Y1Z1=Y1Z1+input_Y(i)*input_Z(i);
    26 end
    27 
    28 N=num;
    29 C=N*X2-X1*X1;% X2!=X1*X1 !!!!!!!
    30 D=N*X1Y1-X1*Y1;
    31 E=-(N*X1Z1-X1*Z1);
    32 G=N*Y2-Y1*Y1;
    33 H=-(N*Y1Z1-Y1*Z1);
    34 
    35 a=(H*D-E*G)/(C*G-D*D);
    36 b=(H*C-E*D)/(D*D-G*C);
    37 c=(Z1-a*X1-b*Y1)/N;
    38 
    39 end
    40 end
    View Code

    2)用矩阵的形式求解同样的问题。用多组示例测试,2)求出的Xpara确实等于1)求出的 [a, b, c]。

     1 function [ Xpara ]=FitPlane( input_X , input_Y , input_Z)
     2 % FileName   : FitPlane
     3 % CreatDate  : 2018/7/10
     4 % Describe    : Least square fitting plane equation
     5 % OutputPara : Xpara
     6 % Note         : Plane equation: z=a*x+b*y+c
     7 % Author       : wellp
     8 
     9 X = input_X';
    10 Y = input_Y';
    11 I = ones(size(input_X'));
    12 A = [X, Y, I];
    13 b = input_Z';
    14 Xpara = (A' * A) ^ -1 * A' * b; 
    15 
    16 end
    View Code

    苍了天了,矩阵也太TM的简洁了吧,上述问题的矩阵的推导如下:

     

    3.线性最小二乘和非线性最小二乘的讨论

    1)概念区别

    线性最小二乘问题:问题可以抽象成线性数学模型,例如直线拟合 y = ax + b、平面拟合 z = ax + by + c,这类线性问题也就可以写成前述的矩阵形式

    非线性最小二乘问题:问题为非线性数学模型,无法写成前述的矩阵形式

    2)正规方程

    对于线性最小二乘问题:为了获得更可靠的结果,测量次数 总要多于未知参数的数目 ,即所得误差方程式的数目总是要多于未知数的数目。因而直接用一般解代数方程的方法是无法求解这些未知参数的。最小二乘法则可以将误差方程转化为有确定解的代数方程组(其方程式数目正好等于未知数的个数),从而可求解出这些未知参数。这个有确定解的代数方程组称为最小二乘法估计的正规方程(或称为法方程)。

    3)解法区别

    线性最小二乘问题:

    a.可以直接通过对残差函数求导数(偏导),令导数(偏导)等于0获得残差函数的极小值,进而解得待求参数

    b.如果问题写成了前述的矩阵形式,则求解矩阵即可。当参数矩阵较小时,可以直接解前述的正规方程ATAx=ATb,x = (ATA)-1ATb进行求解;当参数矩阵较大时,求逆矩阵的耗时较大,一般通过QR分解,Cholesky分解,SVD分解进行求解

    非线性最小二乘问题:

    无法直接写出导数或者导数过于复杂;因为无法写成矩阵的形式,也无法通过上述矩阵分解的方法求解。一般通过一阶梯度法(最速下降法)、二阶梯度法(牛顿法)、高斯牛顿法、LM(Levenberg-Marquardt Method)法进行迭代求解。

  • 相关阅读:
    gitlab 本地 定时备份
    centos 7 部署 汉化版 gitlab
    ELK开机启动 service文件内容
    通过 kms 激活 office 2016
    让 kibana 后台启动的方案
    centos7 yum 安装 redis
    域账户登录时提示“你的账户配置不允许使用这台电脑。请试一下其他电脑” 解决方案
    gitlab 接入 openldap、AD
    VS访问不到TFS、VS连接TFS报TF30063
    php--纯静态和伪静态的区别与关系
  • 原文地址:https://www.cnblogs.com/wellp/p/9286240.html
Copyright © 2011-2022 走看看