Levenberg-Marquardt算法浅谈

原创 2017年01月03日 10:05:16

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

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

牛顿法


如果有一点数值计算知识的同学对牛顿迭代法并不陌生,先贴个经典例图来镇楼。
这里写图片描述
一般来说我们利用牛顿法使用来求f(x)=0的解。求解方法如下:
先对f(x)一阶泰勒展开得
$$f(x+\Delta)=f(x)+f'(x)\Delta=0$$
所以我们有$$\Delta=x-x_0=-\frac{f(x_0)}{f'(x_0)},即x=x_0-\frac{f(x_0)}{f'(x_0)}$$
因此也就得到了我们的牛顿迭代公式:
$$x_n=x_{n-1}-\frac{f(x_{n-1})}{f'(x_{n-1})}$$
求解最优化问题$$min f(x)$$
牛顿法首先则是将问题转化为求 $$f'(x) = 0 $$这个方程的根。
一阶展开:$$f '(x) ≈ f '(x_0)+(x-x_0)f ''(x0)$$
令 $$f'(x_0)+(x-x_0)f ''(x_0) = 0 $$
$$求解得到x,相比于x_0,f '(x)<f'(x0)$$

高斯牛顿法


在讲牛顿法的时候,我们举的例子x是一维的,若如果我们遇到多维的x该如何办呢?这时我们就可以利用雅克比,海赛矩阵之类的来表示高维求导函数了。
比如$$f(X)=0,其中X=[x_0,x_1,...,x_n]$$
所以我们有雅克比矩阵:
$$J_f=\begin{bmatrix} \frac{\partial f}{\partial x_0}&\cdots&\frac{\partial f}{\partial x_n}\\ \vdots&\ddots&\vdots\\ \frac{\partial f}{\partial x_0}&\cdots&\frac{\partial f}{\partial x_n} \end{bmatrix}$$
有海赛矩阵:
$$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}$$

所以高维牛顿法解最优化问题又可写成:
$$X_{n+1}=X_n-H_f(x_n)^{-1}\nabla f(x_n)$$
梯度 代替了低维情况中的一阶导
Hessian矩阵代替了二阶导
求逆代替了除法
例:不妨设目标函数为:
$$s(x)=\sum_{i=0}^nf^2(x_i)$$
所以梯度向量在方向上的分量:
$$g_j=2\sum_{i=0}^nf_i\frac{\partial f_i}{\partial x_j}    (1)$$
Hessian 矩阵的元素则直接在梯度向量的基础上求导:
$$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})$$
高斯牛顿法的一个小技巧是,将二次偏导省略,于是:
$$H_jk\approx\sum_{i=0}^nJ_{ij}J_{ik}      (2)$$
其中$J_{ij}$为雅克比矩阵中的第i行j列元素
将(1)(2)改写成 矩阵相乘形式:
$$g=2J_f^Tf$$
$$H\approx2J_f^TJ_f$$
代入牛顿法高维迭代方程的基本形式,得到高斯牛顿法迭代方程:
$$x^{s+1}=x^s+\Delta,其中\Delta=-(J_f^TJ_f)^{-1}J_f^Tf$$

Levenberg-Marquardt算法


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

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

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

在此我也把算法原论文贴出来吧:Levenberg-Marquardt算法

【转】 Levenberg-Marquardt 算法快速入门教程

什么是最优化,可分为几大类? 答:Levenberg-Marquardt算法是最优化算法中的一种。最优化是寻找使得函数值最小的参数向量。它的应用领域非常广泛,如:经济学、管理优化、网络分析、最优设计、...
  • xueyinhualuo
  • xueyinhualuo
  • 2015年07月16日 11:03
  • 3250

Levenberg–Marquardt算法学习

本次是对Levenberg–Marquardt的学习总结,是为之后看懂sparse bundle ajdustment打基础。这篇笔记包含如下内容:回顾高斯牛顿算法,引入LM算法惩罚因子的计算(迭代步...
  • jinshengtao
  • jinshengtao
  • 2016年11月23日 21:07
  • 4695

Levenberg-Marquardt(列文伯格-马夸尔特)算法

 什么是最优化? Levenberg-Marquardt算法是最优化算法中的一种。最优化是寻找使得函数值最小的参数向量。它的应用领域非常广泛,如:经济学、管理优化、网络分析 、最优设计、机械或...
  • u010922186
  • u010922186
  • 2014年11月17日 19:48
  • 4203

Levenberg-Marquardt算法

  • 2010年03月11日 15:15
  • 55KB
  • 下载

Levenberg-Marquardt(LM算法)

 转自: 翠翠的博客 什么是最优化,可分为几大类? 答:Levenberg-Marquardt算法是最优化算法中的一种。最优化是寻找使得函数值最小的参数向量。它的应用领域非常广泛,如...
  • lishuandao
  • lishuandao
  • 2016年03月30日 14:18
  • 7975

Levenberg-Marquardt算法简介和C++实现

转自:Levenberg-Marquardt 什么是最优化,可分为几大类? 答:Levenberg-Marquardt算法是最优化算法中的一种。最优化是寻找使得函数值最小的参数向量。它的应用领...
  • u013035197
  • u013035197
  • 2016年05月09日 18:13
  • 1888

Levenberg-Marquardt算法基础知识

什么是最优化?Levenberg-Marquardt算法是最优化算法中的一种。最优化是寻找使得函数值最小的参数向量。它的应用领域非常广泛,如:经济学、管理优化、网络分析 、最优设计、机械或电子设计等等...
  • lgfun
  • lgfun
  • 2016年05月20日 09:56
  • 1325

利用Levenberg_Marquardt算法求解无约束的非线性最小二乘问题~

早就想写这篇文章,但是一直没抽出空,主要是画图比较麻烦,嘿嘿~ 现在介绍如何利用经典的Levenberg_Marquardt算法求解无约束的非线性最小二乘问题。Levenberg_Marquardt算...
  • wsj998689aa
  • wsj998689aa
  • 2014年11月05日 17:19
  • 3511

Levenberg–Marquardt算法

算法描述及示例引用自“Machine Learning An Algorithm Perspective 2nd Edition” 使用C++进行浮点数的比较时,一定要注意容差问题。#include...
  • sjt091110317
  • sjt091110317
  • 2016年11月24日 14:43
  • 1198

Levenberg-Marquardt算法浅谈

码字不易,转发请注明原文链接 在讲Levenberg-Marquardt算法之前我想先谈下牛顿法和高斯牛顿法。 牛顿法 如果有一点数值计算知识的同学对牛顿迭代法并不陌生,先贴...
  • roslei
  • roslei
  • 2017年04月20日 13:37
  • 1167
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Levenberg-Marquardt算法浅谈
举报原因:
原因补充:

(最多只允许输入30个字)