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

news/2025/2/14 7:50:01/


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



根据求导数的方法,可分为2大类。第一类,若f具有解析函数形式,知道x后求导数速度快。第二类,使用数值差分来求导数。根据使用模型不同,分为非约束最优化约束最优化最小二乘最优化


什么是Levenberg-Marquardt算法?
它是使用最广泛的非线性最小二乘算法,中文为列文伯格-马夸尔特法。它是利用梯度求最大(小)值的算法,形象的说,属于“爬山”法的一种。它同时具有梯度法牛顿法的优点。当λ很小时,步长等于牛顿法步长,当λ很大时,步长约等于梯度下降法的步长。图1显示了算法从起点,根据函数梯度信息,不断爬升直到最高点(最大值)的迭代过程。共进行了12步。(备注:图1中绿色线条为迭代过程)。



图1中,算法从山脚开始不断迭代。可以看到,它的寻优速度是比较快的,在山腰部分直接利用梯度大幅度提升(参见后文例子程序中lamda较小时),快到山顶时经过几次尝试(lamda较大时),最后达到顶峰(最大值点),算法终止。

下面给出算法流程:


LM算法的实现并不算难,它的关键是用模型函数 f 对待估参数向量p在其领域内做线性近似,忽略掉二阶以上的导数项,从而转化为线性最小二乘问题,它具有收敛速度快等优点。LM算法属于一种“信赖域法”,所谓的信赖域法,即是:在最优化算法中,都是要求一个函数的极小值,每一步迭代中,都要求目标函数值是下降的,而信赖域法,顾名思义,就是从初始点开始,先假设一个可以信赖的最大位移s,然后在以当前点为中心,以s为半径的区域内,通过寻找目标函数的一个近似函数(二次的)的最优点,来求解得到真正的位移。在得到了位移之后,再计算目标函数值,如果其使目标函数值的下降满足了一定条件,那么就说明这个位移是可靠的,则继续按此规则迭代计算下去;如果其不能使目标函数值的下降满足一定的条件,则应减小信赖域的范围,再重新求解。

LM算法需要对每一个待估参数求偏导,所以,如果你的拟合函数 f 非常复杂,或者待估参数相当地多,那么可能不适合使用LM算法,而可以选择Powell算法(Powell算法不需要求导)。

伪代码:



相关源码可以在网址http://www.ics.forth.gr/%CB%9Clourakis/levmar上获得。

为了方便理解,这里给出相应的算法原理和实现:
链接:http://pan.baidu.com/s/1pJp0BMj 密码:1u7g
有什么问题可以咨询我。

http://www.ppmy.cn/news/229023.html

相关文章

视频:扎克伯格夫妇带你参观当年哈佛宿舍 facebook诞生于此

小扎携妻子一同以自拍的视角 为我们展示并介绍了他当年在哈佛的宿舍 facebook的第一个简易版本即诞生于此 为此小扎饶有兴致地回忆起那段经历 他把自己的笔记本用作服务器 因为访客太多而时常宕机 他的恶搞行为遭到来自校方的阻挠 断网! 看小扎还能怎么着&#xff1…

2020年图灵奖Jeffrey和Alfred人物简介

本篇博文源于2020年图灵奖,旨在讲述图灵奖大佬Jeffrey David Ullman和Alfred Vaino Aho人物生平简介。读完本篇文章,大家可以轻松收获以下: Jeffrey David Ullman学业历程Jeffrey的主要著作以及荣誉称号Alfred Vaino Aho学业历程Alfred Vaino Aho主要著…

2018年图灵奖--约书亚·本吉奥、杰弗里·埃弗里斯特·辛顿和Yann LeCun简介

大家好,我是执念斩长河。今天讲述的是2018年图灵奖获得者约书亚本吉奥(Yoshua Bengio)、杰弗里埃弗里斯特辛顿(Geoffrey Hinton)和Yann LeCun.图灵奖奖励他们为深度学习做出贡献。读完本篇博文大家可以收获: 三人的研究方向三人的职位与荣耀 Geoffery H…

天才程序员法布里·贝拉德

Fabrice Bellard是法国计算机程序员,以编写FFmpeg,QEMU和Tiny C编译器而闻名。他开发了Bellard公式来计算pi的位数。 2012年,贝拉德(Bellard)与弗兰克斯皮内利(Franck Spinelli)共同创立了一家电…

IT怪杰鲍勃•麦特卡夫(Bob Metcalfe)

作为业界最丰富多彩的多面手,鲍勃麦特卡夫既是以太网之父,也是3Com公司创始人,还是一位广受欢迎的专栏作家,一位见多识广的博学者,还以发明著名的网络界的第一定律——“麦特卡夫定律”著称。最终,他要把自…

【内存管理】

本章重点 什么是动态内存 为什么要有动态内存 什么是野指针 对应到C空间布局&#xff0c; malloc 在哪里申请空间 常见的内存错误和对策 C中动态内存“管理”体现在哪 什么是动态内存 动态内存是指在程序运行时&#xff0c;根据需要动态分配的内存空间。 #include <stdio.h&…

I/O复用———常用系统调用select、poll、epoll

上周面了个实习&#xff0c;感觉自己菜的一匹&#xff0c;唉&#xff0c;理论还是没有联系实际啊&#xff0c;继续学吧。 I/O复用使得程序能同时监听多个文件描述符&#xff0c;这对提高程序的性能至关重要。通常&#xff0c;网络程序在下列情况下需要使用I/O复用技术&#xf…

串口实验(A7核/M4核)

A7核&#xff1a; 功能&#xff1a;通过串口接收字符&#xff0c;然后将接收到的字符发送回去&#xff1b;通过串口接收字符串&#xff0c;然后将接收到的字符串发送回去 头文件 uart4.h&#xff1a; #ifndef __UART4_H__ #define __UART4_H__ /*USART4_RX -------PB2USART…