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

news2025/8/3 22:05:13

  系列文章目录

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

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

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

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

文章目录

系列文章

文章目录

前言

一、牛顿法

二、高斯-牛顿法

1.由牛顿法推导

2.直接展开推导

总结


前言

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

一、牛顿法

牛顿法是采用二阶泰勒展开对\psi(x)函数进行近似,然后在近似局部域中找到局部最小值,并作为下一个迭代点,二阶展开是一条抛物线,该抛物线在展开点处与\psi(x)相切,由下图可以看到,当展开点在目标点附近时,下一步迭代点非常接近目标点。

对于一维变量,进行二阶泰勒展开,展开过程如下:

\psi(x)\approx \psi(x^{(k)}) + {\psi}'(x^{(k)})(x-x^{(k)})+\frac{1}{2}{\psi}''(x^{(k)})(x-x^{(k)})^{2}

完成如上近似后,如果要求\psi(x)的最小值,只需要令其导数为0,求出极值点即可,并要求满足该极点处的二阶导数大于零,才能保证求出的是极小值而不是驻点或极大值。

 {\psi}'(x)={\psi}'(x^{(k)})+{\psi}''(x^{(k)})(x-x^{(k)})=0

解出的x值作为下一次的迭代点:

x^{(k+1)}=x^{(k)}-\frac{​{\psi}'(x^{(k)})}{​{\psi}''(x^{(k)})}

当x是一个多维变量时,展开时有所不同,其一阶导数和二阶导数都用矩阵形式表示,一阶导数叫梯度,二阶导数叫海森矩阵,展开过程如下:

\psi(x)\approx \psi(x^{(k)})+(x-x^{(k)})^{T}\cdot \bigtriangledown \psi(x^{(k)})+\frac{1}{2}(x^{(k)})+(x-x^{(k)})^{T} \cdot \bigtriangledown \psi(x^{(k)}) \cdot (x-x^{(k)})=\psi(x^{(k)})+(x-x^{(k)})^{T}\cdot \bigtriangledown \psi(x^{(k)})+\frac{1}{2}(x^{(k)})+(x-x^{(k)})^{T} \cdot H(x^{(k)}) \cdot (x^{(k)})(x-x^{(k)})

同样,进行二阶泰勒展开后,对其求导,使导数等于零解出极值点,并要求满足该极点处的二阶导数大于零,才能保证求出的是极小值而不是驻点或极大值。

\bigtriangledown \psi(x)=\bigtriangledown \psi(x^{(k)})+H(x^{(k)})(x-x^{(k)})=0

解出的x值作为下一次的迭代点:

x^{(k+1)}=x^{(k)}-H^{-1}(x^{(k)})\cdot \bigtriangledown \psi(x^{(k)})

整个的形式是和一维变量解出的结果相同的,一维变量是除法运算,这里变成矩阵就需要进行矩阵求逆和乘法运算。

借用一下文献中的图,说明一下当变量为多维时二阶泰勒展开形成的抛物面的底部位置很接近目标点。

 牛顿法能在较少的迭代步数内使目标快速收敛,但是当变量为多维时,求海森矩阵的逆所需的计算量巨大,而且只有当展开点在目标点附近时,迭代效果才比较好,如果展开点与目标点距离较远,迭代方向可能不但不会让函数下降,反而会使结果发散。

二、高斯-牛顿法

高斯牛顿法有两个推导过程,在推导之前,需要先将代价函数做一些变形,将代价函数写成误差函数的形式,这有利于迭代过程中计算的简化,

\psi(x)=\sum \left \| y_{i}-f(x_{i}) \right \|^{2}_{\sum ^{-1}_{i}}=\sum_{i=1}^{m}\left \| e_{i}(x) \right \|^{2}=\sum_{i=1}^{m} e^{T}_{i}(x) e_{i}(x)=\sum_{i=1}^{m}\varphi _{i}(x)

然后分别进行介绍两种推导方法。

1.由牛顿法推导

对于误差求和,我们对其中的第i项进行研究,同样也是进行二阶泰勒展开,然后进行求导,我们先求一下它的一阶导(梯度)和二阶导(海森矩阵)

一阶导:

\frac{\partial \varphi_{i}(x)}{\partial x_{j}}=2\cdot e_{i}(x)\cdot\frac{\partial e_{i}(x)}{\partial x_{j}}

\frac{\partial \psi(x)}{\partial x_{j}}=\sum_{i=1}^{m}2\cdot e_{i}(x)\cdot\frac{\partial e_{i}(x)}{\partial x_{j}}

\frac{\partial e_{i}(x)}{\partial x_{j}}就是雅克比矩阵中第j行第i列的元素,于是一阶导数又可以表示成如下形式:

\frac{\partial \psi_{i}(x)}{\partial x_{j}}=2\cdot J^{T}\cdot e(x)

二阶导:

\frac{\partial ^{2}\psi(x)}{\partial x_{j}\partial x_{k}}=\frac{\partial }{\partial x_{k}} (\sum_{i=1}^{m}2\cdot e_{i}(x)\cdot\frac{\partial e_{i}(x)}{\partial x_{j}})=2\sum_{i=1}^{m}( \frac{\partial e_{i}(x)}{\partial x_{j}} \cdot \frac{\partial e_{i}(x)}{\partial x_{k}} + e_{i}(x)\cdot \frac{\partial^{2} e_{i}(x)}{\partial x_{j} \partial x_{k}} )

观察二阶导的结果,前一项中的\frac{\partial e_{i}(x)}{\partial x_{j}}\frac{\partial e_{i}(x)}{\partial x_{k}}都是雅克比矩阵中的元素,而后一项当迭代点离目标点较远时,误差和其二阶导都很小,可以忽略,所以其二阶导可以写成下式形式:

\frac{\partial ^{2}\psi(x)}{\partial x_{j}\partial x_{k}}=2\cdot J^{T} \cdot J

那么\psi(x)进行二阶展开后可以写成如下形式:

\psi(x)=\psi(x^{(k)})+2(x-x^{(k)})^{T}Je(x)+(x-x^{(k)})^{T}J^{T}J(x-x^{(k)})

同样也是对其求导,使导数等于0得:

\bigtriangledown \psi(x)=2J^{T}e(x^{(k)})+2J^{T}J(x-x^{(k)})=0

\bigtriangleup x=x-x^{(k)}则有:

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

J^{T}J求逆很复杂,往往也会使用Cholesky分解或QR分解等数值方法求出该线性方程组的解,这样就可以得到下一次的迭代点。

2.直接展开推导

上述推导过程中,有一步我们忽略了海森矩阵包含的特别小的二阶项,其实这就等价于对误差函数e(x)进行一阶泰勒展开的线性化近似。

直接对误差函数进行一阶泰勒展开:

e_{i}(x)\approx e_{i}(x^{(k)})+\bigtriangledown e_{i}(x^{(k)})\cdot (x-x^{(k)})=e_{i}(x^{(k)})+J_{i}\cdot (x-x^{(k)})

然后将其带入原式:

\psi (x)\approx \sum (e_{i}(x^{(k)})+J_{i}\cdot \bigtriangleup x)^{T}(e_{i}(x^{(k)})+J_{i}\cdot \bigtriangleup x)=e^{T}e+2\bigtriangleup x^{T}J^{T}+\bigtriangleup x^{T}J^{T} J \bigtriangleup x

对其求导,使其导数等于0后,得到一样的结果:

J^{T}J\bigtriangleup x=-J^{T}\cdot e

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] = GN(fun,dfunx,dfuny,ddfunx,ddfuny,x0,y0);    %高斯-牛顿法

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

GN函数:

%% 高斯牛顿法
function [x,y,n,point] = GN(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];   
while (1) 
  a = feval(fun,x,y);                               %当前时刻值
  x = x - (feval(dfunx,x,y))/(feval(ddfunx,x,y));   %下一时刻自变量
  y = y - (feval(dfunx,x,y))/(feval(ddfunx,x,y));   %下一时刻自变量
  b = feval(fun,x,y);                               %下一时刻值   
  a
  b
  if(b>=a)
      break;
  end
  n = n+1;
  point(n,:) = [x y b]; 
end

实验结果:


总结

高斯-牛顿算法在迭代点上做展开近似,当展开点附近区域线性度好,比最速下降法快很多,但当展开点附近线性度较差时,效果不佳,高斯-牛顿不一定下降,因为J^{T}J不一定是正定矩阵,而接下来的列文伯格-马夸尔方法和狗腿算法将解决这一问题。 

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

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

相关文章

深度学习入门(四十三)计算机视觉——锚框

深度学习入门(四十三)计算机视觉——锚框前言计算机视觉——锚框课件锚框IoU交并比赋予锚框符号使用非极大值抑制(NMS)输出总结教材1 生成多个锚框2 交并比(IoU)3 在训练数据中标注锚框3.1 将真实边界框分配…

UE5笔记【二】添加实体和材质。后处理体积影响全局和局部。

材质 将平面赋予材质,显示不同的样式和纹理。 除了拖拽方式:还可以下拉列表的方式选择。 添加实例对象 可以添加引擎中关于room的内容,使得上一篇中所讲内容,更加直白查看。比如光影。 构造一个场景。 后处理体积 用途&#xff…

显示控件——半圆进度条

该控件是指定一个图标(半圆条),通过沿圆弧方向滑动实现视觉调节的效果。滑动范围对应变量地址数据,显示位置通过变量设定。可以配合“半圆进度条触控”触摸控件进行设置。 位置信息:控件在工程页面区域的位置 “X”“Y…

基于Java Web的汽车租赁系统的设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

本地环境OPC数据读写模拟[Python3+OpenOPC+MatrikonOPCSimulation]

在win10本地环境下,通过python3和OpenOPC包与MatrikonOPCServer进行读写交互,模拟工厂数据读写 Python3 第一个坑,64位的Python似乎是和后面的OpenOPC不兼容,装了调用会出类似"OpenOPC.OPCError: Dispatch: 没有注册类"…

全球电子商务交易预计将在2022年假日季增长15%,消费者情绪乐观

• 感恩节到网购星期一之间的电子商务交易预计将增长10%• 新冠疫情限制措施解除后,旅游和票务行业持续保持强劲增长• 受通货膨胀与库存有限的共同影响,2022年的零售销售与2021年相比略显疲软• 欺诈者瞄准电子产品、旅游和活动等高价值品类&#xff0c…

Libuv实现帧率控制

Libuv实现帧率控制 概念 服务端帧率控制,保证在一段固定的时间内执行完所有事情(包括网络I/O等),如果有空余时间,那么我们Sleep等待一段时间。如果超时我们需要追帧。 注意点 只要在程序中只有一个进程的情况下控制服…

pytorch MNIST 手写数字识别 + 使用自己的测试集 + 数据增强后再训练

文章目录1. MNIST 手写数字识别2. 聚焦数据集扩充后的模型训练3. pytorch 手写数字识别基本实现3.1完整代码及 MNIST 测试集测试结果3.1.1代码3.1.2 MNIST 测试集测试结果3.2 使用自己的图片进行测试3.2.1 测试图片预处理代码3.2.2 测试图片结果4. 数据增强4.1 手动读取 MNIST …

11月更新!一口气上线20+新功能,3D架构拓扑图更具趣味性

优维EasyOps全平台又双叒叕上新功能了! 不瞒各位小伙伴 写今天这篇文章时 我的手一直在抖 是激动的,这次要介绍的更新太牛了 尽管鹿小U已经 非常认真地研究过这20多个新功能 仍然无法用文字描述出 这次功能批量上新 「厉害程度」的十分之一 啥也…

【软件工程】实验1

文章目录实验一 软件需求分析实验目的实验内容「软件开发文档管理」软件开发过程涉及的文档软件开发阶段开发过程文档「软件开发文档管理」需求获取1. 功能需求2. 非功能需求「软件开发文档管理」需求分析、需求规格说明1. 需求概述1.1 功能需求1.2 非功能需求2. 用例模型2.1 用…

中证1000期指上市带来的交易机会

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学,点击下方链接报名: 量化投资速成营(入门课程) Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

玩转UE4/UE5动画系统:UE5的运行时(动态)重定向治好了我的精神内耗

本文参考了油管UP主:AngelV的教程 前言 UE5中新的动画资源的(静态)重定向方法比UE4好用很多,但这种静态的重定向方式依然很让人头疼,因为我们需要对于每一个需要的动画资源为每一个目标骨架生成一套资源备份。尽管个过…

我参加NVIDIA Sky Hackathon 环境安装(编程环境)

强烈建议使用conda 第一个坑: 不使用 conda 进行 Python 环境管理直接使用本地的 Python 环境容易导致混乱 conda 安装 指定下载源 export DL_SITEhttps://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda 使用 wget 进行下载 wget -c $DL_SITE/Miniconda3-py…

德鲁克《卓有成效的管理者》学习笔记-掌握时间的学习和实践

针对德鲁克先生《卓有成效的管理者》书中提到了掌握时间部分学习的一些记录以及在日常工作中的实践。 1、为什么学习掌握时间 时间是最特殊的资源,为什么说它特殊呢?他租不到、顾不到、买不到,更不能以其他任何手段来获得。时间的供给丝毫没…

CC++指针实训(国防科大)

第1关:去掉字符串首尾空格 200 任务要求参考答案评论285 任务描述相关知识 定义指针变量指针的性质编程要求测试说明任务描述 本关任务:文本匹配的时候经常会因为空格个数的不同而匹配失败,现在要求你编写程序对输入的字符串进行处理&…

JUnit 5 单元测试教程

点赞再看,动力无限。 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章。 在软件开发过程中,我们通常都需要测试自己的代码运行是否正常,可能对一个函数进行简单测试…

传奇开服教程——legend/blue引擎替换和登陆器生成教程

1. 下载好legend/blue引擎的服务端解压到D盘 2. 下载legend/blue引擎和登陆器配置器 3. 解压legend/blue引擎和配置器到任意目录,运行对应引擎中的 开始更新程序.bat 就完成引擎替换,接着往下看 4. 打开登陆器配置器(Blue-LEG)中的 登陆器配置器-…

区块链软件开发中的虚拟机(virtual machine)

一、什么是虚拟机 虚拟机(英语:virtual machine),在计算机科学中的体系结构里,是指一种特殊的软件,可以在计算机平台和终端用户之间创建一种环境,而终端用户则是基于虚拟机这个软件所创建的环境…

ORACLE 19C pdb修改的参数保存在哪个数据字典中?

PDB关闭后,保存在: pdb_spfile$中。 下面举例: 在PDB1中修改 ddl_lock_timeout10 SQL> alter session set containerpdb1; Session altered. SQL> show parameter ddl_ NAME TYPE VALUE ------------------------------------ --------…

路由进阶:双点双向路由重发布实验配置

实验拓扑 网络拓扑及IP编址如上图所示;设备的互联地址为192.168.xy.0/24。其中x、y为设备编号。例如R1-R3之间互联的链路网段为192.168.13.0/24,并且R1的接口地址为192.168.13.1,R3的接口地址为192.168.13.3,也就是说IP地址的最后…