码字不易,转发请注明原文链接

在讲Levenberg-Marquardt算法之前我想先谈下牛顿法和高斯牛顿法。

牛顿法

如果有一点数值计算知识的同学对牛顿迭代法并不陌生,先贴个经典例图来镇楼。

一般来说我们利用牛顿法来求f(x)=0的解。求解方法如下:
先对f(x)一阶泰勒展开:
f(x0+Δ)=f(x0)+f′(x0)Δ=0(1)f(x_0+\Delta)=f(x_0)+f'(x_0)\Delta=0    (1)f(x0​+Δ)=f(x0​)+f′(x0​)Δ=0    (1)
其中 Δ=x−x0\Delta=x-x_0Δ=x−x0​, 所以我们有
Δ=x−x0=−f(x0)f′(x0),即x=x0−f(x0)f′(x0)(2)\Delta=x-x_0=-\frac{f(x_0)}{f'(x_0)},即x=x_0-\frac{f(x_0)}{f'(x_0)}    (2)Δ=x−x0​=−f′(x0​)f(x0​)​,即x=x0​−f′(x0​)f(x0​)​    (2)

由式(2)可知,当 Δ\DeltaΔ 非常小时,我们可将 f(x)=0f(x)=0f(x)=0 的解析解近似于 x0x_0x0​。但是由上图可知 x0x_0x0​ 是任意的初始值,所以可能会导致初始 Δ\DeltaΔ 非常大,因此可采用牛顿迭代公式逐步逼近解析解:
xn=xn−1−f(xn−1)f′(xn−1),until∣xn−xn−1∣<ϵ(3)x_n=x_{n-1}-\frac{f(x_{n-1})}{f'(x_{n-1})} ,\ until\ \ |x_n-x_{n-1}|< \epsilon    (3)xn​=xn−1​−f′(xn−1​)f(xn−1​)​, until  ∣xn​−xn−1​∣<ϵ    (3)
接下来求解最优化问题minf(x)(4)min f(x)    (4)min f(x)    (4)
牛顿法首先则是将问题转化为求 f′(x)=0(5)f'(x) = 0     (5)f′(x)=0    (5)这个方程的根。
一阶展开:f′(x)≈f′(x0)+(x-x0)f′′(x0)(6)f '(x) ≈ f '(x_0)+(x-x_0)f ''(x0)    (6)f′(x)≈f′(x0​)+(x-x0​)f′′(x0)    (6)
令 f′(x0)+(x-x0)f′′(x0)=0(7)f'(x_0)+(x-x_0)f ''(x_0) = 0     (7)f′(x0​)+(x-x0​)f′′(x0​)=0    (7)
求解得到x,相比于x0,f(x)<f(x0)(8)求解得到x,相比于x_0,f (x)<f(x0)    (8)求解得到x,相比于x0​,f(x)<f(x0)    (8)

高斯牛顿法

在讲牛顿法的时候,我们举的例子x是一维的,若如果我们遇到多维的x该如何办呢?这时我们就可以利用雅克比,海赛矩阵之类的来表示高维求导函数了。
比如f(X)=0,其中X=[x0,x1,...,xn](9)f(X)=0,其中X=[x_0,x_1,...,x_n]    (9)f(X)=0,其中X=[x0​,x1​,...,xn​]    (9)
所以我们有雅克比矩阵(表示一阶偏导):
Jf=[∂f∂x0⋯∂f∂xn](10)J_f=\begin{bmatrix} \frac{\partial f}{\partial x_0}&\cdots&\frac{\partial f}{\partial x_n} \end{bmatrix}    (10)Jf​=[∂x0​∂f​​⋯​∂xn​∂f​​]    (10)
有海赛矩阵(表示二阶偏导):
Hf=[∂2f∂x02∂2f∂x0∂x1...∂2f∂x0∂xn∂2f∂x1∂x0∂2f∂x12...∂2f∂x1∂xn⋮⋮⋱⋮∂2f∂xn∂x0∂2f∂xn∂x1...∂2f∂xn2](11)H_f=\begin{bmatrix}\frac{\partial^2f}{\partial x_0^2}&\frac{\partial^2f}{\partial x_0 \partial x_1}&...&\frac{\partial^2f}{\partial x_0 \partial x_n}\\ \frac{\partial^2f}{\partial x_1 \partial x_0}&\frac{\partial^2f}{\partial x_1^2}&...&\frac{\partial^2f}{\partial x_1 \partial x_n}\\\vdots&\vdots&\ddots&\vdots\\ \frac{\partial^2f}{\partial x_n \partial x_0}&\frac{\partial^2f}{\partial x_n \partial x_1}&...&\frac{\partial^2f}{\partial x_n^2} \end{bmatrix}    (11)Hf​=⎣⎢⎢⎢⎢⎢⎡​∂x02​∂2f​∂x1​∂x0​∂2f​⋮∂xn​∂x0​∂2f​​∂x0​∂x1​∂2f​∂x12​∂2f​⋮∂xn​∂x1​∂2f​​......⋱...​∂x0​∂xn​∂2f​∂x1​∂xn​∂2f​⋮∂xn2​∂2f​​⎦⎥⎥⎥⎥⎥⎤​    (11)

由式(3)和式(7)可知,高维牛顿法解最优化问题又可写成:
Xn+1=Xn−Hf(xn)−1∇f(xn)(12)X_{n+1}=X_n-H_f(x_n)^{-1}\nabla f(x_n)    (12)Xn+1​=Xn​−Hf​(xn​)−1∇f(xn​)    (12)

注:

  • 雅可比矩阵代替了低维情况中的一阶导
  • Hessian矩阵代替了二阶导
  • 求逆代替了除法

例:不妨设目标函数为:
s(x)=∑i=0nf2(xi)(13)s(x)=\sum_{i=0}^nf^2(x_i)    (13)s(x)=i=0∑n​f2(xi​)    (13)
所以梯度向量在方向上的分量:
gj=2∑i=0nfi∂fi∂xj(14)g_j=2\sum_{i=0}^nf_i\frac{\partial f_i}{\partial x_j}    (14)gj​=2i=0∑n​fi​∂xj​∂fi​​    (14)
Hessian 矩阵的元素则直接在梯度向量的基础上求导:
Hjk=2∑i=0n(∂fi∂xj∂fi∂xk+fi∂2fi∂xj∂xk)(15)H_{jk}=2\sum_{i=0}^n (\frac{\partial f_i}{\partial x_j}\frac{\partial f_i}{\partial x_k}+ f_i\frac{\partial^2 f_i}{\partial x_j\partial x_k})    (15)Hjk​=2i=0∑n​(∂xj​∂fi​​∂xk​∂fi​​+fi​∂xj​∂xk​∂2fi​​)    (15)
高斯牛顿法的一个小技巧是,将二次偏导省略,于是:
Hjk≈2∑i=0nJijJik(16)H_jk\approx2\sum_{i=0}^nJ_{ij}J_{ik}    (16)Hj​k≈2i=0∑n​Jij​Jik​    (16)
其中 Jij表示雅可比矩阵的i行j列J_{ij} 表示雅可比矩阵的i行j列Jij​表示雅可比矩阵的i行j列。需要注意的是,式(10) 的雅可比矩阵只有一行是因为它只有一个多维函数f(x0,x1,...,xn)f(x_0,x_1,...,x_n)f(x0​,x1​,...,xn​)。而在式(15)中他有 n+1n+1n+1 个多维函数:f0(x0,x1,...,xn),f1(x0,x1,...,xn),...,fn(x0,x1,...,xn)f_0(x_0,x_1,...,x_n),f_1(x_0,x_1,...,x_n),...,f_n(x_0,x_1,...,x_n)f0​(x0​,x1​,...,xn​),f1​(x0​,x1​,...,xn​),...,fn​(x0​,x1​,...,xn​). 所以它的雅可比矩阵为:

Jf=[∂f0∂x0⋯∂f0∂xn⋮⋱⋮∂fn∂x0⋯∂fn∂xn](17)J_f=\begin{bmatrix} \frac{\partial f_0}{\partial x_0}&\cdots&\frac{\partial f_0}{\partial x_n}\\ \vdots&\ddots&\vdots\\ \frac{\partial f_n}{\partial x_0}&\cdots&\frac{\partial f_n}{\partial x_n} \end{bmatrix}    (17)Jf​=⎣⎢⎡​∂x0​∂f0​​⋮∂x0​∂fn​​​⋯⋱⋯​∂xn​∂f0​​⋮∂xn​∂fn​​​⎦⎥⎤​    (17)

将(14)(16)改写成 矩阵相乘形式:
g=2JfTf(18)g=2J_f^Tf    (18)g=2JfT​f    (18)
H≈2JfTJf(19)H\approx2J_f^TJ_f    (19)H≈2JfT​Jf​    (19)
代入牛顿法高维迭代方程的基本形式,得到高斯牛顿法迭代方程:
xs+1=xs+Δ,其中Δ=−(JfTJf)−1JfTf(20)x^{s+1}=x^s+\Delta,其中\Delta=-(J_f^TJ_f)^{-1}J_f^Tf    (20)xs+1=xs+Δ,其中Δ=−(JfT​Jf​)−1JfT​f    (20)

Levenberg-Marquardt算法

引用维基百科的一句话就是:

莱文贝格-马夸特方法(Levenberg–Marquardt algorithm)能提供数非线性最小化(局部最小)的数值解。此算法能借由执行时修改参数达到结合高斯-牛顿算法以及梯度下降法的优点,并对两者之不足作改善(比如高斯-牛顿算法之反矩阵不存在或是初始值离局部极小值太远)

在我看来,就是在高斯牛顿基础上修改了一点。
在高斯牛顿迭代法中,我们已经知道
Δ=−(JfTJf)−1JfTf(21)\Delta=-(J_f^TJ_f)^{-1}J_f^Tf    (21)Δ=−(JfT​Jf​)−1JfT​f    (21)
在莱文贝格-马夸特方法算法中则是
Δ=−(JfTJf+λI)−1JfTf(22)\Delta=-(J_f^TJ_f+\lambda I)^{-1}J_f^Tf    (22)Δ=−(JfT​Jf​+λI)−1JfT​f    (22)
在我看来好像就这点区别。至少我看的[维基百科][1]是这样的。
然后Levenberg-Marquardt方法的好处就是在于可以调节:
如果下降太快,使用较小的λ,使之更接近高斯牛顿法
如果下降太慢,使用较大的λ,使之更接近梯度下降法

在此我也把算法原论文贴出来吧:[Levenberg-Marquardt算法][2]
[1]:https://zh.wikipedia.org/wiki/%E8%8E%B1%E6%96%87%E8%B4%9D%E6%A0%BC%EF%BC%8D%E9%A9%AC%E5%A4%B8%E7%89%B9%E6%96%B9%E6%B3%95
[2]: http://www2.imm.dtu.dk/pubdb/views/edoc_download.php/3215/pdf/imm3215.pdf

Levenberg-Marquardt算法浅谈相关推荐

  1. LM(Levenberg–Marquardt)算法原理及其python自定义实现

    LM算法原理及其python自定义实现 LM(Levenberg–Marquardt)算法原理 LM算法python实现 实现步骤: 代码: 运行结果: LM(Levenberg–Marquardt) ...

  2. Levenberg–Marquardt算法学习

    本次是对Levenberg–Marquardt的学习总结,是为之后看懂sparse bundle ajdustment打基础.这篇笔记包含如下内容: 回顾高斯牛顿算法,引入LM算法 惩罚因子的计算(迭 ...

  3. 【python】数据结构和算法 + 浅谈单链表与双链表的区别

    有这么一句话说"程序=数据结构+算法",也有人说"如果把编程比作做菜,那么数据结构就好比食材(菜),算法就好比厨艺(做菜的技巧)". 当然这是笼统的说法,不过也 ...

  4. 2-路插入排序c语言算法,浅谈2路插入排序算法及其简单实现

    2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组,其目的是减少排序过程中的移动次数,需要增加n个记录的辅助空间. 难点可能在于对取余的考虑吧,可以把辅助数组看成一个环状空间,这样就能更好 ...

  5. 非线性最小二乘问题与Levenberg–Marquardt算法详解

    1 最小二乘问题 给定一组连续函数 f:Rn→Rm,m⩾n{\mathbf{f}}:{\mathbb{R}^n} \to {\mathbb{R}^m},{\text{ }}m \geqslant nf ...

  6. 快速排序 c++_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)

    本文始发于个人公众号:TechFlow 在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及 ...

  7. MDL估计算法程序C语言,MDLS算法浅谈

    前言 在任务计划算法方面,目前有两个比较成熟的算法:动态多维列表规划算法(MDLS)与基于分群技术的嵌套式遗传算法.前者提出较早,这两个算法都是由康涅狄格大学以Levchuk为首的研究团队提出的. 内 ...

  8. 贪心算法解决跳马问题_算法浅谈——怪盗基德的珠宝选择问题与贪心算法

    点击上方蓝字,和我一起学技术.   1   在开始今天的文章之前,我们先来讲一个故事: 在一个月黑风高的夜晚,怪盗基德潜入了一个著名的珠宝会馆.他面前有三个装着珠宝的柜子,这三个规则分别是A.B和C. ...

  9. BP反向传播算法浅谈(Error Back-propagation)

     最近在打基础,大致都和向量有关,从比较基础的人工智能常用算法开始,以下是对BP算法研究的一个小节. 本文只是自我思路的整理,其中举了个例子,已经对一些难懂的地方做了解释,有兴趣恰好学到人工智能对这块 ...

最新文章

  1. 【Python】序列解包 and * 和 ** 的区别
  2. SQLite第三课 源码编译错误以及解决
  3. UI中的响应时间:3个重要的界限
  4. 005_JSONArray对象静态方法
  5. python split 倒数第一个_请教一个在python中该如何去掉split之后的第一个单词?
  6. java 反射 私有成员_Java对类私有变量的暴力反射技术讲解
  7. 详细描述一下 Elasticsearch 搜索的过程?
  8. msmq 发送到远程专用队列不存在_不知道消息中间件是什么?RabbitMQ从头到尾详解介绍...
  9. 局域网连接MYSQL8.0报错1251的解决记录
  10. TortoiseGit推送
  11. android 分享小程序到微信,微信小程序-分享到朋友圈初体验
  12. ISO/IEC17025与ISO9000族标准的区别和联系
  13. 【观察】易捷行云EasyStack:以可进化的新一代云平台,攀登云计算的“卡瓦格博峰”...
  14. 康考迪亚计算机科学需要gre吗,康考迪亚大学研究生院化学工具专业录取条件
  15. 给大家推荐一个大大的萌妹子,算是我学计算机以来遇到的最喜欢的妹子吧!23333333
  16. 计算机桌面下面那一栏如何调节,电脑底部的任务栏不见了,你可以尝试这样做,轻松恢复它...
  17. 趋势跟踪系统的形成历程
  18. 让dede系统 正文标题以拼音显示的方法
  19. 计算机图形学第四次上机——鼠标回调图形界面交互实现
  20. 在html标签中写alert,文本不会写入页面,但会显示在alert()消息中。 JavaScript和HTML...

热门文章

  1. LCD液晶屏出现闪屏的原因及解决方法
  2. 解决百度翻译,看得到喇叭在动,但是不发音问题
  3. 软件著作权申请流程及所需准备材料说明
  4. Feign的简介及使用
  5. 6AV6381-2BD07-5AV0西门子WinCCV7.5(RT 512)
  6. Redmi Note 9 6000mAh的续航怪兽:一天一次充用3年依然能打啊!
  7. java 中文参数_关于JAVA中URL传递中文参数的问题
  8. JAVA多态/封装/接口/包/包的命名规则——java面向对象
  9. 杭绍台铁路加快迈进“1小时交通圈”
  10. 网吧无线覆盖,无线监控