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

这篇具有很好参考价值的文章主要介绍了【算法系列】非线性最小二乘求解-梯度下降法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 系列文章目录

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

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

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

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

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

文章目录

系列文章

文章目录

前言

一、梯度下降法(GD)

二、最速下降法(SD)

总结


前言

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

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


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

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

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

一、梯度下降法(GD)

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

【算法系列】非线性最小二乘求解-梯度下降法,算法系列,算法,矩阵,线性代数,slam

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

算法具体表示如下:

【算法系列】非线性最小二乘求解-梯度下降法,算法系列,算法,矩阵,线性代数,slam

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

  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

实验结果:

【算法系列】非线性最小二乘求解-梯度下降法,算法系列,算法,矩阵,线性代数,slam

二、最速下降法(SD)

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

如下图所示:

【算法系列】非线性最小二乘求解-梯度下降法,算法系列,算法,矩阵,线性代数,slam

自变量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



 实验结果:

【算法系列】非线性最小二乘求解-梯度下降法,算法系列,算法,矩阵,线性代数,slam


总结

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

实际应用中应对这几种方法灵活选择。文章来源地址https://www.toymoban.com/news/detail-605228.html

到了这里,关于【算法系列】非线性最小二乘求解-梯度下降法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线性方程组AX=b,AX=0以及非线性方程组的最小二乘解(解方程组->优化问题)

    超定方程组无解是因为方程组包含了过多的约束条件,无法满足所有的约束条件,在这种情况下,方程组的某些方程必然是矛盾的,也就是说,他们描述的条件是不兼容的,无法同时满足。 所以求解超定方程组其实是一个拟合问题,其基本思想是最小化所有方程的误差平方和

    2024年02月08日
    浏览(48)
  • 6自由度并联机器人 运动学算法 正解 逆解6个耦合的非线性方程组求解

    6自由度并联机器人 运动学算法   正解  逆解 6个耦合的非线性方程组求解 正解快速收敛可用在机器人控制中 已实际使用 6自由度并联机器人运动学算法及其在机器人控制中的应用 随着社会科技的不断发展,机器人技术在工业自动化和服务业中的应用越来越广泛。其中,高自

    2024年04月28日
    浏览(52)
  • 机器视觉【3】非线性求解相机几何参数

    上一章节介绍学习了(DLT)线性求解相机几何参数,了解到线性求解法当中比较明显的缺点: 没有考虑到镜头畸变的影响 不能引入更多的约束条件融入到DLT算法当中优化 最关键的是,代数距离并不是计算相机矩阵的最佳距离函数 基于以上问题点,提出非线性求解方法。 将

    2024年02月21日
    浏览(55)
  • 非线性最优化问题求解器Ipopt介绍

    Ipopt(Interior Point OPTimizer) 是求解大规模非线性最优化问题的求解软件。可以求解如下形式的最优化问题的(局部)最优解。 m i n ⏟ x ∈ R n     f ( x ) s . t . g L ≤ g ( x ) ≤ g U x L ≤ x ≤ x U (0) underbrace{min}_ {x in Rⁿ} , , , f(x) \\\\ s.t. g_L ≤ g(x) ≤ g_U \\\\ x_L ≤ x ≤ x_U tag{0} x ∈ R

    2024年01月20日
    浏览(56)
  • 【单谐波非线性振动问题求解器 GUI 】使用单个谐波表示解决 MDOF 非线性振动问题(Matlab代码实现)

    目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 对于解决多自由度(MDOF)非线性振动问题,使用单个谐波表示是一种常见的近似方法。这种方法将系统的非线性部分在谐波振动的基础上线性化,从而简化求解过程。 以下是一个基于GUI的单谐波非线性振动问题

    2024年02月15日
    浏览(44)
  • python机器学习(五)逻辑回归、决策边界、代价函数、梯度下降法实现线性和非线性逻辑回归

    线性回归所解决的问题是把数据集的特征传入到模型中,预测一个值使得误差最小,预测值无限接近于真实值。比如把房子的其他特征传入到模型中,预测出房价, 房价是一系列连续的数值,线性回归解决的是有监督的学习。有很多场景预测出来的结果不一定是连续的,我们

    2024年02月15日
    浏览(87)
  • matlab实现牛顿迭代法求解非线性方程

    非线性方程是指含有未知数的方程,且方程中至少有一个未知数的次数大于一或者含有非一次幂的函数(如指数、对数、三角函数等)。例如,$f(x) = x^3 - 2x - 5 = 0$就是一个非线性方程。非线性方程通常没有显式的解析解,因此需要使用数值方法来近似求解。 牛顿迭代法(N

    2024年02月11日
    浏览(54)
  • 【数学建模】Python+Gurobi求解非线性规划模型

    目录 1 概述 2 算例  2.1 算例 2.2 参数设置 2.3 Python代码实现 2.4 求解结果 如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。 参考:(非线性规划Python)计及动态约束及节能减排环保要求的经济调度 2.1 算例 2.2 参数设置 求解NLP/非凸问题时,

    2024年02月09日
    浏览(47)
  • 详细介绍如何使用Ipopt非线性求解器求解带约束的最优化问题

       本文中将详细介绍如何使用Ipopt非线性求解器求解带约束的最优化问题,结合给出的带约束的最优化问题示例,给出相应的完整的C++程序,并给出详细的解释和注释,以及编译规则等    一、Ipopt库的安装和测试    本部分内容在之前的文章《Ubuntu20.04安装Ipopt的流程介

    2024年02月08日
    浏览(75)
  • 二次规划(QP)求解与序列二次规划(SQP)求解非线性规划问题

    二次规划(QP)是求解一种特殊的数学优化问题的过程——具体地说,是一个(线性约束)二次优化问题,即优化(最小化或最大化)多个变量的二次函数,并服从于这些变量的线性约束。二次规划是一种特殊的非线性规划。        序列二次规划(SQP,Sequental Quadratic Programming)算法是

    2024年02月02日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包