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

 系列文章目录

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

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

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

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

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

文章目录

系列文章

文章目录

前言

一、梯度下降法(GD)

二、最速下降法(SD)

总结


前言

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

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


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

\underset{x}{min}\sum \left \| y_{i}-f(x_{i}) \right \|^{2}_{\sum _{i}^{-1}}

其中f(x_{i})​是非线性函数,\sum{_{i}^{-1}}​表示协方差矩阵

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

\psi (x)=\sum \left \| y_{i}-f(x_{i}) \right \|^{2}_{\sum^{-1}_{i}}

一、梯度下降法(GD)

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

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

算法具体表示如下:

do\{ x^{(k+1)} = x^{(k)} - \alpha \cdot \bigtriangledown \psi (x^{(k)}) \}while(\psi (x^{(k+1)}) < \psi(x^{(k)}))

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

  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;
  end
  n = n+1;
  point(n,:) = [x y b]; 
end

实验结果:

二、最速下降法(SD)

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

\alpha _{k}=\underset{\alpha \geq 0}{argmin} \psi(x^{(k)}-\alpha \cdot \bigtriangledown \psi (x^{(k)}) )

如下图所示:

自变量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;
  end
  n = n+1;
  point(n,:) = [x y b]; 
end



 实验结果:


总结

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

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

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 第6章《非线性规划的Matlab实现》课件主要介绍了如何使用Matlab软件进行非线性规划问题的求解。 该课件分为四个部分:非线性规划问题的定义、优化算法的选择、求解非线性规划问题的步骤、以及Matlab的非线性规划求解工具箱。 课件首先介绍了非线性规划问题的基本概念和数学定义,阐述了目标函数为非线性函数、变量约束为非线性等式或非线性不等式的情况。然后介绍了常用的非线性规划求解算法,包括单纯形法、梯度下降法、牛顿法等,其中指出不同算法适用于不同类型的非线性规划问题。 接下来,课件详细介绍了非线性规划问题的求解步骤,包括问题建模、初始点的选择、收敛判据的确定等。同时,还介绍了Matlab中的非线性规划求解工具箱,例如fmincon函数、lsqnonlin函数等,这些函数可以简化非线性规划问题的求解过程。 最后,课件通过一个实例演示了如何在Matlab环境下进行非线性规划问题的求解。演示中使用了fmincon函数进行求解,首先定义目标函数、约束条件和初始点等,然后通过调用fmincon函数得到最优解。 总的来说,该课件内容丰富,结构清晰,通过Matlab软件的应用,系统介绍了非线性规划问题的求解方法。对于需要进行非线性规划问题求解的研究人员和工程师来说,该课件是一份很好的学习资料。 ### 回答2: 第6章的课件主要介绍了非线性规划的matlab实现。非线性规划是指目标函数和约束条件中存在非线性项的最优化问题。 课件首先介绍了非线性规划的基本概念和问题的表达方式,然后详细介绍了matlab中非线性规划的求解方法和函数。 在matlab中,可以使用fmincon函数来求解非线性规划问题。该函数的输入参数包括目标函数,初始点,线性约束条件、非线性约束条件等。课件通过示例代码演示了如何使用fmincon函数来求解非线性规划问题。 此外,课件还介绍了如何处理不等式约束条件和等式约束条件,以及如何设置优化算法的参数。还介绍了如何设置目标函数和约束条件的梯度函数,以提高求解效率。 课件最后还介绍了一些其他常用的非线性规划求解函数和工具箱,如lsqnonlin函数、fminunc函数和Global Optimization Toolbox等。 通过学习本章课件,我对非线性规划问题的matlab求解方法有了更深入的了解和掌握。我能够通过fmincon函数来求解非线性规划问题,并能处理不同类型的约束条件。我还掌握了如何设置优化算法的参数以及如何提高求解效率。 总的来说,第6章非线性规划的matlab实现课件内容丰富,结构清晰,通过示例代码的演示,使我能够更加熟练地运用matlab来求解非线性规划问题。这对我今后的学习和工作都具有很大的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值