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

news2025/4/16 13:06:48

  系列文章目录

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

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

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

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

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

文章目录

系列文章

文章目录

前言

一、列文伯格-马夸尔算法

1.LM算法

 2.LMF算法

二、狗腿算法

总结


前言

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}}

一、列文伯格-马夸尔算法

1.LM算法

前面提到GN(高斯-牛顿)算法当展开点距离目标点较远时,可能会出现迭代效果下降,甚至发散的情况,原因是J^{T}J不一定正定,而列文伯格和马夸尔两人对GN算法进行了改进,后来Fletcher又对其中的策略进行了改进,即实际中常用的LMF算法。

既然GN算法展开点距离目标点必须保持在一定范围内才有效,那么我们在进行该算法时,可以给迭代更新量\bigtriangleup x一个限制范围,以保证GN算法的收敛,那么原来的无约束最小二乘就变成了带约束的最小二乘:

\bigtriangleup x=\underset{\bigtriangleup x}{argmin}\left \| e(x^{(k)}) + J\cdot \bigtriangleup x \right \|^{2},\left \| \bigtriangleup x \right \| \leq d_{k}

对于这种问题,在高数中就学过,可以使用拉格朗日乘子\mu _{k}将上式转化为无约束的形式:

\bigtriangleup x=\underset{\bigtriangleup x}{argmin} (\left \| e(x^{(k)}) + J\cdot \bigtriangleup x \right \|^{2} + \mu_{k}\left \| \bigtriangleup x \right \|^{2})

到这里就和前面一样了,求最小值就对上式求导,使导数等于0,得到下面的线性方程:

(J^{T}J+\mu_{k}\cdot I)\bigtriangleup x=-J^{T}\cdot e

LM算法引入了\mu_{k}J^{T}J​进行了修正,可见LM算法的关键就是选取合适的\mu_{k}​使得系数矩阵保持正定,这样就可以保证每一步迭代目标函数都会下降。

LM算法是GN算法和梯度下降法的结合产物,当\mu_{k}​较大时,\mu_{k}\cdot I占主要地位,忽略J^{T}J​就变成了梯度下降法;当\mu_{k}​较小时,J^{T}J​占主要地位,忽略\mu_{k}\cdot I​就变成了GN算法。

 2.LMF算法

 既然上面提到了LM算法的关键就是选取合适的\mu_{k}​使得系数矩阵保持正定,以保证每一步迭代目标函数都会下降,那么我们如何确定\mu_{k}​的取值呢?

LMF算法给出了依据。

代价函数的变化量为:

\bigtriangleup \psi =\psi(x^{(k+1)})-\psi(x^{(k)})

 近似函数的变化量为:

\bigtriangleup \varphi =\varphi(\bigtriangleup x)-\varphi(0)=2\bigtriangleup x^{T}J^{T}e+\bigtriangleup x^{T}J^{T}J\bigtriangleup x

 然后定义一个评价量-线性度\gamma _{k}来衡量近似程度,\gamma _{k}​越接近1则证明原函数和近似后的函数变化量越接近,也就是说明展开点的线性度更好。

\gamma _{k}=\frac{\bigtriangleup \psi}{\bigtriangleup \varphi }

有了这个评价标准那么LMF算法就简单了,就是根据线性度\gamma _{k}​的值来确定\mu_{k}​的取值,当\gamma _{k}​>0.75时(接近1时)说明线性度较好,应用GN算法主导,即\mu_{k}​应该调小一点(一般减小10倍);当\gamma _{k}​<0.25时(接近0时)说明线性度较差,应用梯度下降法主导, 即\mu_{k}​应该调大一点(一般增大10倍);当\gamma _{k}​在0.25到0.75之间时,认为取值合适,不作调整;当\gamma _{k}​为负时,说明此时代价函数是上升的,应该拒绝本次迭代更新量,并将\mu_{k}调大10倍。

MATLAB实验:

主函数:

% 目标函数为 z=f(x,y)=(x^2+y^2)/2
clear all;
clc;
%构造函数
fun = inline('(x^4+2*y^2)/2','x','y');
dfunx = inline('2*x^3','x','y');
dfuny = inline('2*y','x','y'); 
ddfunx = inline('6*x^2','x','y');
ddfuny = inline('2','x','y'); 

x0 = 2;y0 = 2;                                  %初值

[x,y,n,point] = LMF(fun,dfunx,dfuny,ddfunx,ddfuny,x0,y0);    %LMF算法

figure
x = -2:0.1:4;
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','*');
n

LMF算法:

%% LMF算法
function [x,y,n,point] = LMF(fun,dfunx,dfuny,ddfunx,ddfuny,x,y)
%输入:fun:函数形式 dfunx(y):梯度(导数)ddfunx(y):海森矩阵(二阶导数) x(y):初值
%输出:x(y):计算出的自变量取值 n:迭代次数 point:迭代点集

%初始化
a = feval(fun,x,y);                                 %初值
n=1;                                                %迭代次数
point(n,:) = [x y a];   
mu=1;                                               %拉格朗日乘子

while (1) 
  
  a = feval(fun,x,y);                               %当前时刻值
  adfun=2*(-(feval(fun,x,y))^0.5/(feval(dfunx,x,y)+mu))*feval(dfunx,x,y)*(feval(fun,x,y))^0.5+((-(feval(fun,x,y))^0.5)/(feval(dfunx,x,y)+mu))^2*(feval(dfunx,x,y))^2;
  x = x - (feval(fun,x,y))^0.5/(feval(dfunx,x,y)+mu);   %下一时刻自变量
  y = y - (feval(fun,x,y))^0.5/(feval(dfunx,x,y)+mu);   %下一时刻自变量
  b = feval(fun,x,y);                               %下一时刻值
  afun=b-a;                                         %原函数增量
  yy=afun/adfun;                                    %线性度
  if(yy>0.75)
      mu=mu/10;
  end
  if((yy<0.25)&&(yy>=0))
      mu=mu*10;
  end
  if(yy<0)
      mu=mu*10;
      continue;
  end
  
  if(b>=a)
      break;
  end
  n = n+1;
  point(n,:) = [x y b]; 
end

实验结果:

二、狗腿算法

前面的LMF算法已经比较完善,有较好的性能了,但其中仍然存在一点瑕疵,当\gamma _{k}​为负时,说明此时代价函数是上升的,应该拒绝本次迭代更新量,这就白白浪费了求解这一步的计算代价,Powell提出的狗腿算法就很好的修正了这个问题。

在狗腿算法中,先计算最速下降法的迭代更新量和高斯-牛顿的迭代更新量:

\bigtriangleup x_{SD}=-\alpha _{k}\cdot 2 \cdot J^{T}\cdot e(x^{(k)})

\bigtriangleup x_{GN}=-(J^{T}J)^{-1}\cdot J^{T}e

在狗腿算法中也是使用线性度来调整参数,但不是调整\mu_{k}而是调整d_{k}(置信域),d_{k}\mu_{k}是负相关的,比如线性度好时,说明近似程度高,\mu_{k}应该调小点使用高斯牛顿算法,相应的d_{k}可以调大一点,扩大置信域,具体调整策略如下:

  •  当\bigtriangleup x_{GN} \leq d_{k}时,选择高斯牛顿算法,使\bigtriangleup x_{DL} =\bigtriangleup x_{GN}
  • \bigtriangleup x_{GN}超出置信域时,高斯牛顿算法不一定能让代价函数下降,而最速下降法一定能使代价函数下降,\bigtriangleup x_{DL}=d_{k}\frac{\bigtriangleup x_{SD}}{\left \| \bigtriangleup x_{SD} \right \|},取最速下降法的方向,步长取d_{k},因为步长小于\bigtriangleup x_{SD}的长度,肯定能让函数下降。
  • \bigtriangleup x_{GN}超出置信域,而\bigtriangleup x_{SD}在置信域内时,就选取二者之间折中的迭代量,\bigtriangleup x_{DL}=\bigtriangleup x_{SD}+\beta (\bigtriangleup x_{GN}-\bigtriangleup x_{SD}),选取\beta使得\bigtriangleup x_{DL}=d_{k}

 后面就是根据线性度对d_{k}进行调整:

  • \gamma _{k}>0.75时,说明线性度好,可以将置信域扩大,使d_{k+1}=max\{ d_{k},3\cdot \left \| \bigtriangleup x_{DL} \right \| \}
  • 0.25 \leq \gamma _{k}\leq 0.75时,说明置信域设置合理,不作调整,d_{k+1}=d_{k}
  • \gamma _{k}<0.25时,说明线性度较差,需要将置信域缩小,d_{k+1}=d_{k}/2

 可以看到在狗腿算法中,每次执行迭代都会使得代价函数下降,但相应的计算代价也升高。


总结

这几种算法,每一种都是前一种的改进,下降速度和效果越来越好,但相应的计算代价也越来越高,在实际应用中应结合具体问题合理选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

期末网页设计作业素材 (民宿 5页 带地图)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 游景点介绍 | 旅游风景区 | 家乡介绍 | 等网站的设计与制作 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 CSS&…

JSON解析看这一篇就够了

目录 文章目录[toc]一、JSON是什么 &#xff08;&#xffe3;︶&#xffe3;&#xff09;↗总而言之&#xff1a;二、为什么要用JSON三、不同的JSON解析方式3.1 gson和[fastjson](https://so.csdn.net/so/search?qfastjson&spm1001.2101.3001.7020)简而言之3.2 gson案例3.…

15.Servlet

目录 1.Servlet的日常开发 1.WebServlet(...此处填写资源路径) 1.那么什么时候Tomcat会启动失败&#xff1f; 2.响应体是文本内容&&字符集编码是uft-8 3.读取请求参数 4.资源的重定向&#xff08;redirect&#xff09; 2.面试问题&#xff1a;GET和POST有什么区…

代码随想录算法训练营三期 day 23 - 二叉树(9)

669. 修剪二叉搜索树 原文链接&#xff1a;669. 修剪二叉搜索树 题目链接&#xff1a;669. 修剪二叉搜索树 视频链接&#xff1a;669. 修剪二叉搜索树 在上图中我们发现结点 000 并不符合区间要求&#xff0c;那么将结点 000 的右孩子 结点 222 直接赋给 结点 333 的左孩子就…

Java设计模式 (1) —— Iterator迭代器模式

拿到这个话题&#xff0c;首先搞清楚&#xff1a;什么是迭代器&#xff1f; 大家都学过 for-i 循环&#xff0c;for-i循环的本质就是 通过i 或者 i-- &#xff0c;以实现 从数据的一端 一个一个地遍历数据元素&#xff0c;直到另一端的最后一个元素&#xff0c;将这里 i 的通用…

【Linux】基础IO —— 深入理解文件系统 | 软硬链接

&#x1f308;欢迎来到Linux专栏~~ 深入理解文件系统 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的…

安全需求和挑战

安全需求和挑战 从风险管理的角度讲&#xff0c;主要就是管理资产、威胁、脆弱性 和防护措施及其相关关系&#xff0c;最终保障云计算平台的持续安全&#xff0c;以及 其所支撑的业务的安全。 云计算平台是在传统 IT技术的基础上&#xff0c;增加了一个虚拟化 层&#xff0c;并…

大数据之——Hive

目录1. Hive 基本概念1.1 什么是 Hive1.2 Hive 的优缺点1.2.1 优点1.2.2 缺点1.3 Hive 架构原理2. Hive 安装2.1 Hive 安装地址2.2Hive 安装部署2.3MySQL 安装2.4 Hive 元数据配置到 MySQL2.4.1 拷贝驱动2.4.2 配置 Metastore 到 MySQL2.4.3 再次启动 Hive2.5 使用元数据服务的…

让学前端不再害怕英语单词(二)

写了本专栏的第一章让学前端不再害怕英语单词&#xff08;一&#xff09;后&#xff0c;反响热度还是比较高的&#xff0c;截止现在已经有20个收藏量了&#xff0c;所以趁热打铁来更第二章 第一章我们简单的介绍了html&#xff0c;css和js的部分高频单词&#xff0c;因为html要…

S32K144的GPIO使用

程序初始化前线使用Components工具对时钟和GPIO进行配置&#xff0c;然后再main函数里面初始化。 时钟配置参考&#xff1a; S32K144之时钟配置 - 明明1109 - 博客园 (cnblogs.com) gpio配置 S32K SDK使用详解之PinSettings组件配置与使用详解(S32K1xx PORT 和GPIO模块)_嵌…

jdk1.8新特性简介

一、引言 jdk1.8出来已经一段时间了&#xff0c;现在1.9也已经出来了&#xff0c;但是很多公司&#xff08;我们公司也一样&#xff09;不太愿意升级到高版本的jdk&#xff0c;主要是有老的项目要维护&#xff0c;还有升级的话配套的框架也要升级&#xff0c;要考虑的细节事情太…

实训素材纯HTML+CSS代码 (教育主题 3页 )

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 家乡旅游景点 | 家乡民生变化 | 介绍自己的家乡 | 我的家乡 | 家乡主题 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结…

SpringMVC具体工作流程(保姆教学)

目录 文章目录[toc]一、SpingMVC的常用组件二、[SpringMVC](https://so.csdn.net/so/search?qSpringMVC&spm1001.2101.3001.7020)的工作流程一、SpingMVC的常用组件 1&#xff09;DispatcherServlet 是一种前端控制器&#xff0c;由框架提供。 作用&#xff1a;统一处理请…

基于Simulink宽带单基地雷达系统仿真(附源码)

目录 一、探索示例 1.1 收发器 1.2 信号处理子系统 1.3 渠道 1.4 目标子系统 二、结果和显示 三、总结 四、程序 本示例演示如何仿真宽带雷达系统。当雷达系统的带宽超过系统中心频率的5%时&#xff0c;通常被认为是宽带的。对于此示例&#xff0c;将使用 10% 的带宽。 …

智慧供应链解决方案-最新全套文件

智慧供应链解决方案-最新全套文件一、建设背景二、建设思路三、建设方案智慧供应链具有以下特点1、高度智能化2、全流程数字化3、信息系统互联互通四、获取 - 智慧供应链全套最新解决方案合集一、建设背景 智慧供应链是结合物联网技术和现代供应链管理的理论、方法和技术&…

ES6 入门教程 16 Reflect 16.1 概述

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程16 Reflect16.1 概述16 Reflect 16.1 概述 Reflect对象与Proxy对象一样&#xff0c;也是 ES6 为了操作对象而提供的新 API…

nodejs校园二手交易管理系统vue

本系统的设计主要是为给网上用户提供购物方便&#xff0c;所以应该完成以下目标&#xff1a; (1) 登录、注册。用户要想在交易系统中购买商品&#xff0c;就必须先登录系统。如果不是会员&#xff0c;就必须先注册&#xff0c;然后才能登录系统。 (2) 查找商品。用户可以查找自…

求程序段中++x或者x++的频度,时间复杂度、执行次数

以下程序段中"x"的执行频度&#xff1f; 频度就是执行次数for i:1 to n then;for j:1 to n then;x;i1时 内圈for执行n次...in时 内圈执行n次我的理解&#xff1a;外圈for从1到n&#xff0c;有效循环是n次&#xff0c;外圈每循环一次&#xff0c;内圈循环n次&#…

C语言源代码系列-管理系统之学生籍贯信息

往期文章分享点击跳转>《导航贴》- Unity手册&#xff0c;系统实战学习点击跳转>《导航贴》- Android手册&#xff0c;重温移动开发 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过…

Python 3.11新功能:错误信息回溯

错误信息回溯 长按关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 扫码关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 Python 3.11于2022 年 10 月 24 日发布。这个最新版本的 Python 速度更快&#xff0c;对用户更友好…