文章目录

  • 一:最小二乘法(OLS)
    • 1:概述
    • 2:代数式
    • 3:矩阵式(推荐)
      • 3.1:实现代码
  • 二:加权最小二乘法(WLS)
    • 1:增加对角矩阵 W
      • 1.1:实现代码
  • 三:迭代重加权最小二乘法(IRLS)
  • 四:应用
    • 1:拟合圆(算法:迭代重新加权最小二乘)
    • 2: 直线拟合(算法:迭代重新加权最小二乘)
    • 3:曲线拟合(算法:最小二乘)
    • 4:N点标定(包括9点标定)(算法:最小二乘)
  • 五:总结

原文链接:http://t.csdn.cn/Qvvjv

个人笔记:
最小二乘法,加权最小二乘法,迭代重加权最小二乘法。结合自己需要实现功能的目的,下面主要给出推导结果、代码实现和实际一些应用。推导过程最后会放一些个人参考的一些文章和资料。

这里推荐一个视频推导过程:利用矩阵求偏导得出 xxx=(ATA)−1ATB(A^TA)^{-1}A^TB(ATA)−1ATB矩阵乘法求导视频

一:最小二乘法(OLS)

1:概述

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。
这里说个例子,比如已经确定了目标函数y=a0+a1x+a2x2y=a_0+a_1x+a_2x^2y=a0​+a1​x+a2​x2,x和yx和yx和y是确定的实际数值,xxx是自变量,yyy是因变量,需要求a0,a1,a2a_0,a_1,a_2a0​,a1​,a2​三个未知参数,这时候一般需要三个方程来组成一个方程组来求解得出这三个未知参数确定唯一的解。而实际中我们求三个未知参数一般都是在一个超定方程组(方程个数大于未知参数)中,这时候就需要用到最小二乘法来解决这个问题了,来求最优的解。下面给出代数式和矩阵式的解法。这里推荐使用矩阵式求解(非常方便)。

2:代数式

最小二乘法其思想主要是通过将理论值与预测值的距离的平方和达到最小。

举例:曲线拟合中最基本和最常用的是直线拟合。设xxx和yyy之间的函数关系为:一元一次函数y=f(a0,a1)=a0+a1xy=f(a_0,a_1)=a_0+a_1xy=f(a0​,a1​)=a0​+a1​x 代数推导:

分别对a0和a1a_0和a_1a0​和a1​求偏导,这里a0和a1a_0和a_1a0​和a1​就是未知参数

整理为方程组

然后化简得:

3:矩阵式(推荐)

举例:曲线拟合中最基本和最常用的是直线拟合。设xxx和yyy之间的函数关系为:一元一次函数y=f(a0,a1)=a0+a1xy=f(a_0,a_1)=a_0+a_1xy=f(a0​,a1​)=a0​+a1​x 使用矩阵表达:Ax=BAx = BAx=B, 求xxx向量参数

推导过程我会在最后放上链接。那么:

如果是一元多项式函数:

其中m代表多项式的阶数,离散点与该多项式的平方和 为F(a0,a1,...,am)F(a_0,a_1,..., a_m )F(a0​,a1​,...,am​)。其中nnn代表采样点数:

一元多项式矩阵表达和一元一次项矩阵表达是一样的:Ax=BAx = BAx=B


3.1:实现代码

/* 普通最小二乘 Ax = B* (A^T * A) * x = A^T * B* x = (A^T * A)^-1 * A^T * B*/
Array<double,Dynamic,1> GlobleFunction::leastSquares(Matrix<double,Dynamic,Dynamic> A, Matrix<double,Dynamic,1> B)
{//获取矩阵的行数和列数int rows =  A.rows();int col = A.cols();//A的转置矩阵Matrix<double,Dynamic,Dynamic> AT;AT.resize(col,rows);//x矩阵Array<double,Dynamic,1> x;x.resize(col,1);//转置 ATAT = A.transpose();//x = (A^T * A)^-1 * A^T * Bx = ((AT * A).inverse()) * (AT * B);return x;}

Matrix是Eigen库中的一个矩阵类,这里引入Eigen库方便代数运算。

二:加权最小二乘法(WLS)

加权最小二乘法是对原模型进行加权,使之成为一个新的不存在异方差性的模型,然后采用普通最小二乘法估计其参数的一种数学优化技术。百度百科

1:增加对角矩阵 W

在最小二乘法的基础上增加一个对角矩阵WWW,对每组数据赋予不同的权重。


WT∗WW^T * WWT∗W对角矩阵每个数据的平方,消除负数。

1.1:实现代码

/* 加权最小二乘(WLS)  W为对角线矩阵* W²(Ax - B) = 0* W²Ax = W²B* (A^T * W^T * W * A) * x = A^T * W^T * W * B* x = (A^T * W^T * W * A)^-1 * A^T * W^T * W * B*/
Array<double,Dynamic,1> GlobleFunction::reweightedLeastSquares(Matrix<double,Dynamic,Dynamic> A, Matrix<double,Dynamic,1> B,Array<double,Dynamic,1> vectorW)
{//获取矩阵的行数和列数int rows =  A.rows();int col = A.cols();//vectorW为空,默认构建对角线矩阵1if(vectorW.isZero()){vectorW.resize(rows,1);for(int i=0;i<rows;++i){vectorW(i,0) = 1;}}//A的转置矩阵Matrix<double,Dynamic,Dynamic> AT;AT.resize(col,rows);//x矩阵Array<double,Dynamic,1> x;x.resize(col,1);//W的转置矩阵Matrix<double,Dynamic,Dynamic> WT,W;W.resize(rows,rows);WT.resize(rows,rows);//生成对角线矩阵W = vectorW.matrix().asDiagonal();//转置WT = W.transpose();//转置 ATAT = A.transpose();// x = (A^T * W^T * W * A)^-1 * A^T * W^T * W * Bx = ((AT * WT * W * A).inverse()) * (AT * WT * W * B);return x;
}

Matrix是Eigen库中的一个矩阵类,这里引入Eigen库方便代数运算。

三:迭代重加权最小二乘法(IRLS)

1:迭代重新加权最小二乘法(也叫迭代加权最小二乘法)( IRLS ) 的方法用于解决具有ppp范数形式的目标函数的某些优化问题:维基百科。迭代加权可以对目标函数和已知的数据来进行拟合,但是这时候有的数据对总体目标函数离得特别远,参与最小二乘法的时候就会对估计参数有很大的影响,这时候就要对参数进行优化,对数据较远的赋予较小的权重(不让它显得很重要,也就影响比较小),对数据较近的赋予较大的权重(影响大)。迭代加权最小二乘,是建立加权最小二乘上进行一个迭代来估值达到最优。

通过迭代方法,其中每一步都涉及解决以下形式的加权最小二乘问题:

2:下面引入一片论文中的一段迭代方法求解 论文地址:Burrus, C.S. (2014). Iterative Reweighted Least Squares ∗.


MATLAB代码1:

% m-file IRLS0.m to find the optimal solution to Ax=b
% minimizing the L_p norm ||Ax-b||_p, using basic IRLS.
% csb 11/10/2012
function x = IRLS0(A,b,p,KK)
if nargin < 4, KK=10; end;
x = pinv(A)*b;                     % Initial L_2 solution
E = [];
for k = 1:KK                   % Iteratee = A*x - b;              % Error vectorw = abs(e).^((p-2)/2);       % Error weights for IRLSW = diag(w/sum(w));        % Normalize weight matrixWA = W*A;                     % apply weightsx = (WA'*WA)\(WA'*W)*b;   % weighted L_2 sol.ee = norm(e,p); E = [E ee]; % Error at each iteration
end
plot(E)

MATLAB代码2:

% m-file IRLS1.m to find the optimal solution to Ax=b
% minimizing the L_p norm ||Ax-b||_p, using IRLS.
% Newton iterative update of solution, x, for M > N.
% For 2<p<infty, use homotopy parameter K = 1.01 to 2
% For 0<p<2, use K = approx 0.7 - 0.9
% csb 10/20/2012
function x = IRLS1(A,b,p,K,KK)
if nargin < 5, KK=10; end;
if nargin < 4, K = 1.5; end;
if nargin < 3, p = 10; end;
pk = 2; % Initial homotopy value
x = pinv(A)*b;                         % Initial L_2 solution
E = [];
for k = 1:KK                       % Iterateif p >= 2, pk = min([p, K*pk]);       % Homotopy change of pelse pk = max([p, K*pk]); ende = A*x - b;                       % Error vectorw = abs(e).^((pk-2)/2);          % Error weights for IRLSW = diag(w/sum(w));                % Normalize weight matrixWA = W*A;                             % apply weightsx1 = (WA'*WA)\(WA'*W)*b;          % weighted L_2 sol.q = 1/(pk-1);                       % Newton's parameterif p > 2, x = q*x1 + (1-q)*x; nn=p; % partial update for p>2else x = x1; nn=2; end              % no partial update for p<2ee = norm(e,nn); E = [E ee];        % Error at each iteration
end
plot(E)

C++代码:


/* 迭代重加权最小二乘(IRLS)  W为权重,p为范数* e = Ax - B* W = e^(p−2)/2* W²(Ax - B) = 0* W²Ax = W²B* (A^T * W^T * W * A) * x = A^T * W^T * W * B* x = (A^T * W^T * W * A)^-1 * A^T * W^T * W * B* 参考论文地址:https://www.semanticscholar.org/paper/Iterative-Reweighted-Least-Squares-%E2%88%97-Burrus/9b9218e7233f4d0b491e1582c893c9a099470a73*/
Array<double,Dynamic,1> GlobleFunction::iterativeReweightedLeastSquares(Matrix<double,Dynamic,Dynamic> A, Matrix<double,Dynamic,1> B,double p,int kk)
{/* x(k) = q x1(k) + (1-q)x(k-1)* q = 1 / (p-1)*///获取矩阵的行数和列数int rows =  A.rows();int col = A.cols();double pk = 2;//初始同伦值double K = 1.5;double epsilong = 10e-9; // εdouble delta = 10e-15; // δArray<double,Dynamic,1> x,_x,x1,e,w;x.resize(col,1);_x.resize(col,1);x1.resize(col,1);e.resize(rows,1);w.resize(rows,1);//初始x  对角矩阵w=1x = reweightedLeastSquares(A,B);//迭代  最大迭代次数kkfor(int i=0;i<kk;++i){//保留前一个x值,用作最后比较确定收敛_x = x;if(p>=2){pk = qMin(p,K*pk);}else{pk = qMax(p,K*pk);}//偏差e = (A * x.matrix()) - B;//偏差的绝对值//  求矩阵绝对值 :e = e.cwiseAbs(); 或 e.array().abs().matrix()e = e.abs();//对每个偏差值小于delta,用delta赋值给它for(int i=0;i<e.rows();++i){e(i,0) = qMax(delta,e(i,0));}//对每个偏差值进行幂操作w = e.pow(p/2.0-1);w = w / w.sum();x1 = reweightedLeastSquares(A,B,w);double q = 1 / (pk-1);if(p>2){x = x1*q + x*(1-q);}else{x = x1;}//达到精度,结束if((x-_x).abs().sum()<epsilong){return x;}}return x;
}

C++实现代码和MATLAB基本一样,不过有稍微改进,其中参考了维基百科和Burrus, C.S. (2014). Iterative Reweighted Least Squares ∗.

四:应用

以下针对超定方程组来求解的。数据个数大于未知参数。

1:拟合圆(算法:迭代重新加权最小二乘)

1:使用最小二乘效果,可以看出外部的噪点干扰还是比较大的。下面使用迭代重加权最小二乘算法优化。
2:迭代重加权最小二乘
第1次迭代

第2次迭代
第3次迭代
第4次迭代

第20次迭代

2: 直线拟合(算法:迭代重新加权最小二乘)

1: y=a0+a1xy = a_0 + a_1xy=a0​+a1​x
下面这张图使用的是最小二乘法,可以看出下面较远的数据噪点对整体密集数据有了很大的影响。
1.2:使用迭代重加权最小二乘
第1次迭代

第100次迭代
经过nnn次迭代后,噪点基本上对整体没有什么影响了,这时候的得到的参数也就是理想的。

3:曲线拟合(算法:最小二乘)

1:最小二乘曲线拟合 ,寻找最佳次项函数
最小二乘法是曲线拟合的常用方法,使用该方法对匹配函数的选取非常重要。。所谓匹配函数就是函数经过的路线在图中的点达到一个最佳匹配。
不然就会出现过拟合和欠拟合的现象。


一次函数拟合:

二次函数拟合:


三次函数拟合:

四次函数拟合:

五次函数拟合:


六次函数拟合:


七次函数拟合:

八次函数拟合:

九次函数拟合:

可以发现函数在第五次函数的时候拟合程度很好了,越往后越来过拟合了。

4:N点标定(包括9点标定)(算法:最小二乘)

9点标定是求视觉 中像素坐标和世界坐标建立的关系。
可以看到 halcon算子块 vector_to_hom_mat2d 就是用最小二乘法来计算矩阵的。图中外部算法【2】其实是本文章中的最小二乘算法实现的。内部算法【1】实现是用求偏导计算的,在这篇文章有实现N点标定

五:总结

1:工具:主要Qt + Eigen库 + QCustomPlot类
Eigen库是一个用于矩阵计算,代数计算库
QCustomPlot类是一个用于绘图和数据可视化

2:上面完整代码已上传GitHub

3:参考文献
最小二乘代数推导
最小二乘矩阵推导
最小二乘法?为神马不是差的绝对值
正则化
鲁棒学习算法
最小二乘法的原理理解

从最大似然角度理解最小二乘法

最小二乘法,加权最小二乘法,迭代重加权最小二乘法 (含代码)【最小二乘线性求解】相关推荐

  1. 迭代重加权最小二乘法的理解

    背景 在复现论文时,涉及到了迭代重加权最小二乘法,故此找了论文推导看了一下,然后加上了自己的一些理解,但不一定对. 参考文献: [1]方兴,黄李雄,曾文宪,吴云.稳健估计的一种改进迭代算法[J].测绘 ...

  2. 最小二乘、加权最小二乘(WLS)、迭代加权最小二乘(迭代重加全最小二乘)(IRLS)

    最小二乘.加权最小二乘(WLS).迭代加权最小二乘(迭代重加全最小二乘)(IRLS) 最小二乘: 最小二乘法(又称最小平方法)是一种数学优化技术.它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最 ...

  3. 光谱特征选择---竞争自适应重加权采样CARS

    多元校正模型是目前多组分光谱分析的主要分析方法,但是实际分析数据存在严重的共线性和冗余干扰问题,此外,如何去解释建模变量对实际分析过程具有重要意义.因此,无论从模型性能提升还是模型变量解释方面都有必要 ...

  4. labview最小二乘法拟合曲线报表生成,波形拟合最小二乘法

    labview最小二乘法拟合曲线报表生成,波形拟合最小二乘法 ID:18158593057297571

  5. Python 金融量化 均线系统交易策略专题(简单移动平均,加权移动平均,指数加权移动平均,异同移动平均MACD等解读与绘图)

    捕捉趋势最普遍的方法为移动平均线,根据求平均的方式不同,移动平均数又可分为简单移动平均数(Simple Moving Average, SMA),加权移动平均数(Weighted Moving Ave ...

  6. Ajax异步请求(重渲染DOM元素时,如何自动调用并执行JS自定义函数【含代码】)- 案例篇

    文章目录 Ajax异步请求(重渲染DOM元素时,如何自动调用并执行JS自定义函数[含代码])- 案例篇 效果截图: 重要代码: 附:全部HTML代码: Ajax异步请求(重渲染DOM元素时,如何自动调 ...

  7. 时间序列预测方法的使用(简单、加权时序,简单加权移动,一次二次三次指数平滑法)

    先简要介绍 1. 简单序时平均数法 也称算术平均法.即把若干历史时期的统计数值作为观察值,求出算术平均数作为下期预测值.这种方法基于下列假设:"过去这样,今后也将这样",把近期和远 ...

  8. 牛顿法与拟牛顿法(含代码实现)

    1. 牛顿法 牛顿法(英语:Newton's method)又称为牛顿-拉弗森方法(英语:Newton-Raphson method),它是一种在实数域和复数域上近似求解方程的方法. 牛顿法的基本思想 ...

  9. OpenCV与图像处理学习十三——Harris角点检测(含代码)

    OpenCV与图像处理学习十三--Harris角点检测(含代码) 一.角点的概念 二.Harris角点检测的实现过程 三.Harris代码应用 一.角点的概念 角点: 在现实世界中, 角点对应于物体的 ...

最新文章

  1. go语言学习(1)map常规使用
  2. Nginx基本数据结构之ngx_hash_t
  3. Android 支付宝 开源框架
  4. c#中using 和new
  5. 心酸血泪前端路,不断成长任我行,零碎知识点笔记(vue踩坑日记)
  6. java面试宝典第五版,《程序员面试宝典(第5版)》和《Java程序员面试宝典(第4版)》的一些看法......
  7. FileUpload1上传控件
  8. android x86 4.3 root,安装好x86安卓后(凤凰系统1.04版本),出现ANDROID root@x86:/#,进不了系统...
  9. mysql中chr_Chr()和chrb()的含义
  10. PS怎么用3D功能怎么用?如何用PS做立体字
  11. 笔记本电脑当作服务器外置显示器,我们为什么要给笔记本外接显示器,真的是多此一举?...
  12. 在电脑上安装Linux系统步骤
  13. Hbase Region的切分与合并【原理分析】
  14. Physics.OverlapSphere
  15. windows命令强制关闭登录用户
  16. Windows7SP1补丁包(Win7补丁汇总) 32位/64位版 更新截至2016年11月
  17. 从正多面体到斐波拉契网格
  18. 三种方法求递归算法的时间复杂度(递推,master定理,递归树)
  19. Qt扫盲-QSqlQuery理论总结
  20. Apue学习:高级I/O

热门文章

  1. 中国最厉害的10大CEO简历曝光[ZT]
  2. hdu 小希的迷宫 一道不一样的解法 图 树
  3. matlab中的级数怎默算_matlab无穷级数的计算
  4. 优思学院 | 质量工程师的职责有哪些?
  5. rbac数据库设计 mysql_rbac数据库设计
  6. sql取字段中的部分字符
  7. ansys mechanical 详细信息窗口找不到 参数设置
  8. js 数组删除指定多个元素值的方法
  9. 一度智信:店铺客服如何正确处理中差评情况
  10. 大陆“水货”笔记本 详细资料