系列文章目录

·【算法系列】卡尔曼滤波算法

·【算法系列】非线性最小二乘求解-直接求解法

·【算法系列】非线性最小二乘求解-梯度下降法

·【算法系列】非线性最小二乘-高斯牛顿法

·【算法系列】非线性最小二乘-列文伯格马夸尔和狗腿算法

文章目录

系列文章

文章目录

前言

一、梯度下降法(GD)

二、最速下降法(SD)

总结


前言

SLAM问题常规的解决思路有两种,一种是基于滤波器的状态估计,围绕着卡尔曼滤波展开;另一种则是基于图论(因子图)的状态估计,将SLAM问题建模为最小二乘问题,而且一般是非线性最小二乘估计去求解。

非线性最小二乘有多种解法,本篇博客介绍梯度下降法系列求解最小二乘问题。


非线性最小二乘的一般形式如下:

其中​是非线性函数,​表示协方差矩阵

为了阐述方便,进行如下表示:

一、梯度下降法(GD)

梯度下降法是使自变量x按一定步长沿梯度的反方向进行调整,对应的函数值就会下降,这样不断调整x,直到函数取值下降到最小为止,以下图进行具体说明。

这里的x是一维变量,梯度可以理解为一阶导数,初值选在x1的位置,此时一阶导数值为负,梯度的反方向为正,所以应该增加x的值,按照步长调整至x2,依次迭代;当到达x4位置时,一阶导数变为正值,梯度反方向为负,应该减小x的值,反复迭代,假设收敛到了一个最小值x5,算法结束。

算法具体表示如下:

梯度下降法的原理和实现都很简单,但它的缺点也很明显:

  1. 对初值敏感。在图中很容易发现,收敛获得的最小值,只是算法以为的最小值,是个局部最小值,而真实的最小值在橙点处,这跟初值的选取有关。
  2. 步长的选择至关重要。如果步长太小,收敛速度很慢,需要迭代很多次才能到的目标点;如果步长太大,很可能错过目标点,形成在最小值附件来回震荡的情况。

在SLAM中,状态由三维坐标和空间姿态角两部分组成,空间姿态角一般用四元数表示,由于存在内部额外约束,无法进行求导和加法迭代运算,这时就要装换到李代数上进行求导和求和运算。

MATLAB实验:

主函数:

% 目标函数为 z=f(x,y)=(x^2+y^2)/2
clear all;
clc;
%构造函数
fun = inline('(x^2+y^2)/2','x','y');
dfunx = inline('x','x','y');
dfuny = inline('y','x','y'); x0 = 2;y0 = 2;                                  %初值
p = 0.1;                                        %步长[x,y,n,point] = GD(fun,dfunx,dfuny,x0,y0,p);    %梯度下降法
%[x,y,n,point] = SD(fun,dfunx,dfuny,x0,y0);    %最速下降法figure
x = -1:0.1:2;
y = x;
[x,y] = meshgrid(x,y);
z = (x.^2+y.^2)/2;
surf(x,y,z)    %绘制三维表面图形
% hold on
% plot3(point(:,1),point(:,2),point(:,3),'linewidth',1,'color','black')
hold on
scatter3(point(:,1),point(:,2),point(:,3),'r','*');

GD函数:

%% 梯度下降法
function [x,y,n,point] = GD(fun,dfunx,dfuny,x,y,p)
%输入:fun:函数形式 dfunx(y):梯度(导数) x(y):初值 p:步长
%输出:x(y):计算出的自变量取值 n:迭代次数 point:迭代点集%初始化
a = feval(fun,x,y);
n=1;
point(n,:) = [x y a];
while (1) a = feval(fun,x,y);           %当前时刻值x = x - p*(feval(dfunx,x,y)); %下一时刻自变量y = y - p*(feval(dfuny,x,y)); %下一时刻自变量b = feval(fun,x,y);           %下一时刻值 if(b>=a)break;endn = n+1;point(n,:) = [x y b];
end

实验结果:

二、最速下降法(SD)

最速下降法解决的是梯度下降法中关于步长选取的问题,最速下降法中每次迭代都会找到一个合适的步长,使得函数沿当前梯度反方向下降,用数学语言描述如下:

如下图所示:

自变量x是二维向量,此时的梯度方向与等高线切线方向垂直,每次都会选取一个合适的步长,使得取值越来越趋近于最小值,每次的步长都不是固定值,保证了函数取值一直是下降的。

MATLAB实验:

主函数:

% 目标函数为 z=f(x,y)=(x^2+y^2)/2
clear all;
clc;
%构造函数
fun = inline('(x^2+y^2)/2','x','y');
dfunx = inline('x','x','y');
dfuny = inline('y','x','y'); x0 = 2;y0 = 2;                                  %初值
p = 0.1;                                        %步长%[x,y,n,point] = GD(fun,dfunx,dfuny,x0,y0,p);    %梯度下降法
[x,y,n,point] = SD(fun,dfunx,dfuny,x0,y0);    %最速下降法figure
x = -1:0.1:2;
y = x;
[x,y] = meshgrid(x,y);
z = (x.^2+y.^2)/2;
surf(x,y,z)    %绘制三维表面图形
% hold on
% plot3(point(:,1),point(:,2),point(:,3),'linewidth',1,'color','black')
hold on
scatter3(point(:,1),point(:,2),point(:,3),'r','*');

SD函数:

%% 梯度下降法
function [x,y,n,point] = SD(fun,dfunx,dfuny,x,y)
%输入:fun:函数形式 dfunx(y):梯度(导数) x(y):初值
%输出:x(y):计算出的自变量取值 n:迭代次数 point:迭代点集%初始化
a = feval(fun,x,y);
n=1;
point(n,:) = [x y a];
p=0.01:0.01:0.1;       %步长范围while (1) [m,i]=min(x - p*(feval(dfunx,x,y)));  %求解合适的步长a = feval(fun,x,y);                   %当前时刻值x = x - p(i)*(feval(dfunx,x,y));      %下一时刻自变量y = y - p(i)*(feval(dfuny,x,y));      %下一时刻自变量b = feval(fun,x,y);                   %下一时刻值if(b>=a)break;endn = n+1;point(n,:) = [x y b];
end

实验结果:


总结

虽然最速下降法解决了步长选取的问题,但是在实际使用中,不可避免的会出现初值选取不合适导致获得局部最小值的问题,接下来将介绍高斯-牛顿的方法、裂纹伯格-马夸尔的方法及其变种。

实际应用中应对这几种方法灵活选择。

【算法系列】非线性最小二乘求解-梯度下降法相关推荐

  1. 线性回归介绍及分别使用最小二乘法和梯度下降法对线性回归C++实现

    回归:在这类任务中,计算机程序需要对给定输入预测数值.为了解决这个任务,学习算法需要输出函数f:Rn→R.除了返回结果的形式不一样外,这类问题和分类问题是很像的.这类任务的一个示例是预测投保人的索赔金 ...

  2. 最小二乘法和梯度下降法有哪些区别?

    为什么要比较这两种方法呢?很多人可能不知道,我先简单的介绍一下 机器学习有两种,一种是监督学习,另一种是非监督学习.监督学习就是我告诉计算机你把班上同学分个类,分类标准是按照性别,男生和女生:非监督分 ...

  3. 线性回归中的最小二乘法和梯度下降法比较

    为什么要比较这两种方法呢?很多人可能不知道,我先简单的介绍一下 机器学习有两种,一种是监督学习,另一种是非监督学习.监督学习就是我告诉计算机你把班上同学分个类,分类标准是按照性别,男生和女生:非监督分 ...

  4. 最小二乘:梯度下降法、牛顿法、高斯-牛顿法

    1.线性预测器最佳预测系数线性方程推导 2.最小二乘法 2.1 简介 最小二乘法(又称最小平方法)是一种数学优化技术.它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最小二乘法可以简便地求得未知的 ...

  5. 【数学与算法】步长一维搜索、梯度下降法、最速下降法、牛顿法

    更详细的推导,可以参考这篇博客:一维搜索.最速下降(梯度下降)与牛顿法(拟牛顿法) 1.求解最优步长的方法: f(x)f(x)f(x)可以理解为目标函数,损失函数.我们的目标是最小化这个损失函数,最小 ...

  6. 梯度下降 最小二乘法 matlab,最小二乘法和梯度下降法的理解

    最小二乘法 在线性回归中,听的最多的应该算是最小二乘法了.最小二乘法在具体实现过程中保留核心思想的同时,会在算法上进行不同程度的改进,因此,最小二乘法有很多演变体,例如:递推最小二乘法,加权最小二乘法 ...

  7. python迭代算法_Python实现简单的梯度下降法

    Python 实现简单的梯度下降法 机器学习算法常常可以归结为求解一个最优化问题,而梯度下降法就是求解最优化问题的一个方法. 梯度下降法(gradient descent)或最速下降法(steepes ...

  8. 机器学习之数学系列(二)梯度下降法(参数更新公式的由来)

    一.引言 下山问题   如下图所示,假设我们位于黄山的某个山腰处,山势连绵不绝,不知道怎么下山.于是决定走一步算一步,也就是每次选个方向往山下走一步,这样一步一步走下去,一直走到觉得我们已经到了山脚. ...

  9. 线性回归最小二乘法和梯度下降法-详细

    原文: https://blog.csdn.net/y990041769/article/details/69567838 问题描述 首先我们定义问题,线性回归要解决的问题就是根据给出的数据学习出一个 ...

最新文章

  1. 转: mysql create view 创建视图
  2. python+OpenCv+dlib实现人脸68个关键点检测
  3. 用jQuery写的最简单的表单验证
  4. 轻松掌握开发必会的docker套路-yaml语法与docker compose.yml
  5. Springboot微服务开发教程系列:开发入门
  6. IPRO_DOCXCC_FILLIN_SIMPLEVARS
  7. NetBeans 7.2 beta:更快,更有用
  8. 【机器学习-西瓜书】六、支持向量机(SVM):最大间隔;对偶问题;KKT条件
  9. hadoop入门学习教程--DKHadoop完整安装步骤
  10. 写入Visual Studio的输出窗口
  11. 我是怎么找电子书的?
  12. IDEA+Maven搭建JavaWeb项目
  13. 数字电路与系统设计(一)
  14. LidarSLAM(三):EVO- SLAM轨迹精度评价工具
  15. mac adb安装和使用
  16. 电商项目测试实战(四)手机注册页面用例设计
  17. Docker可视化工具——Portainer全解
  18. [转载野猪的一篇文章] 设计模式--简单工厂模式在unity3d里面的使用
  19. C语言·XDOJ练习·拼数字
  20. [机器学习入门] 李宏毅机器学习笔记-21(Transfer Learning part 1 ; 迁移学习 part 1)

热门文章

  1. Java输出、变量、数据类型及其转换
  2. 亚马逊、eBay、速卖通、lazada、Shopee等跨境平台,如何快速打造爆款
  3. iPhone4升级iOS7输入卡顿的完美解决办法
  4. 电音风格之Future Bass【待续】
  5. fufu笔记之多线程
  6. eNSP启动一直出#号的一种参考方法
  7. 孤独的宇宙中,人类是个例外吗?
  8. 原生态水平和垂直拉伸的JQUERY插件
  9. ASP 、PHP 代码加密的安全性逻辑思考
  10. 完美解决“The identity used to sign the executable is no longer valid.”问题