本文附的源程序是MATLAB代码,总共不到80行,实现了 求雅克比矩阵的解析解,演示了Levenberg-Marquardt最优化迭代过程,演示了如何求解拟合问题。本文用图文介绍了LM算法。转帖请注明来自蜜蜂电脑,谢谢!

作者:沈乐君(www.shenlejun.cn)

什么是最优化,可分为几大类?
答:Levenberg-Marquardt算法是最优化算法中的一种。最优化是寻找使得函数值最小的参数向量。它的应用领域非常广泛,如:经济学、管理优化、网络分析 、最优设计、机械或电子设计等等。
根据求导数的方法,可分为2大类。第一类,若f具有解析函数形式,知道x后求导数速度快。第二类,使用数值差分来求导数。
根据 使用模型不同,分为非约束最优化、约束最优化、最小二乘最优化。

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


图1 LM算法迭代过程形象描述

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

如何快速学习LM算法?

学 习该算法的主要困难是入门难。 要么国内中文教材太艰涩难懂,要么太抽象例子太少。目前,我看到的最好的英文入门教程是K. Madsen等人的《Methods for non-linear least squares problems》本来想把原文翻译一下,贴到这里。请让我偷个懒吧。能找到这里的读者,应该都是E文好手,我翻译得不清不楚,反而事倍功半了。

可在 下面的链接中找到
http://www2.imm.dtu.dk/pubdb/public/publications.php? year=&pubtype=7&pubsubtype=&section=1&cmd=full_view&lastndays=&order=author
或者直接下载pdf原文:
http://www2.imm.dtu.dk/pubdb/views/edoc_download.php/3215/pdf/imm3215.pdf

例子程序(MATLAB源程序)
本程序不到100行,实现了 求雅克比矩阵的解析解,Levenberg-Marquardt最优化迭代,演示了如何求解拟合问题。采用《数学试验》(第二版)中p190例2来演示。在MATLAB中可直接运行得到最优解。

% 计算函数f的雅克比矩阵,是解析式

syms a b y x real;

f=a*exp(-b*x);

Jsym=jacobian(f,[a b])

% 拟合用数据。参见《数学试验》,p190,例2

data_1=[0.25 0.5 1 1.5 2 3 4 6 8];

obs_1=[19.21 18.15 15.36 14.10 12.89 9.32 7.45 5.24 3.01];

% 2. LM算法

% 初始猜测s

a0=10; b0=0.5;

y_init = a0*exp(-b0*data_1);

% 数据个数

Ndata=length(obs_1);

% 参数维数

Nparams=2;

% 迭代最大次数

n_iters=50;

% LM算法的阻尼系数初值

lamda=0.01;

% step1: 变量赋值

updateJ=1;

a_est=a0;

b_est=b0;

% step2: 迭代

for it=1:n_iters

if updateJ==1

% 根据当前估计值,计算雅克比矩阵

J=zeros(Ndata,Nparams);

for i=1:length(data_1)

J(i,:)=[exp(-b_est*data_1(i)) -a_est*data_1(i)*exp(-b_est*data_1(i))];

end

% 根据当前参数,得到函数值

y_est =   a_est*exp(-b_est*data_1);

% 计算误差

d=obs_1-y_est;

% 计算(拟)海塞矩阵

H=J'*J;

% 若是第一次迭代,计算误差

if it==1

e=dot(d,d);

end

end

% 根据阻尼系数lamda混合得到H矩阵

H_lm=H+(lamda*eye(Nparams,Nparams));

% 计算步长dp,并根据步长计算新的可能的\参数估计值

dp=inv(H_lm)*(J'*d(:));

g = J'*d(:);

a_lm=a_est+dp(1);

b_lm=b_est+dp(2);

% 计算新的可能估计值对应的y和计算残差e

y_est_lm =   a_lm*exp(-b_lm*data_1);

d_lm=obs_1-y_est_lm;

e_lm=dot(d_lm,d_lm);

% 根据误差,决定如何更新参数和阻尼系数

if e_lm<e

lamda=lamda/10;

a_est=a_lm;

b_est=b_lm;

e=e_lm;

disp(e);

updateJ=1;

else

updateJ=0;

lamda=lamda*10;

end

end

%显示优化的结果

a_est

b_est

演示程序求解的问题是《数学试验》(萧树铁,第二版,高等教育出版社)中p190例2。为了方便读者,提供该书籍的数据和目标函数照片(2012年4月1日)。本文来自:shenlejun.cn.

C++源码

转载于:https://www.cnblogs.com/rotten_potato/p/3275316.html

Levenberg-Marquardt快速入门教程相关推荐

  1. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

  2. ​HealthKit开发快速入门教程大学霸内部教程

    ​HealthKit开发快速入门教程大学霸内部教程 ​ ​ 国内第一本HealthKit专向教程.本教程详细讲解iOS中,如何使用HealthKit框架开发健康应用.最后,本教程结合HealthKit ...

  3. Apple Watch开发快速入门教程

     Apple Watch开发快速入门教程  试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...

  4. 指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程

    指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程 ​1.4.2  指示灯组 指示灯组的放大图如图1.5所示. 图1.5  指示灯组 各个指示灯对应的功能如下: q  RX:对应于0号端口 ...

  5. 游戏控制杆OUYA游戏开发快速入门教程

    游戏控制杆OUYA游戏开发快速入门教程 1.2.2  游戏控制杆 游戏控制杆各个角度的视图,如图1-4所示,它的硬件规格是本文选自OUYA游戏开发快速入门教程大学霸: 图1-4  游戏控制杆各个角度的 ...

  6. Arduino Yun的主要部件介绍选自Arduino Yun快速入门教程

    Arduino Yun的主要部件介绍 1.4.1  主要部件 Yun的主要部件如图1.4所示. 图1.4  Arduino Yun的主要部件 在Yun小小的板子上集成了两颗处理器.一个是ATmega3 ...

  7. 认识AndEngine选自Android 2D游戏引擎AndEngine快速入门教程

    认识AndEngine什么是AndEngine 随着Android手机.平板的盛行,Android下的游戏也不断的变得火热.而对于游戏开发有兴趣的同学们,应该也想要学习开发游戏.虽说游戏开发的引擎较多 ...

  8. OUYA游戏开发快速入门教程1.2OUYA的硬件规格

    OUYA游戏开发快速入门教程1.2OUYA的硬件规格 从官网上购买回来的OUYA产品,包含游戏主机.游戏控制杆.说明书.电源线.HDMI线.电源线和电池,如图1-2所示.本节就来简要介绍下,游戏主机和 ...

  9. Android 2D游戏引擎AndEngine快速入门教程

    Android 2D游戏引擎AndEngine快速入门教程 介绍:AndEngine是一款知名的Android 2D游戏引擎.该引擎代码开源,并且可以免费使用.本书详细讲解如何使用AndEngine引 ...

  10. OUYA游戏开发快速入门教程第1章了解OUYA及其设备

    OUYA游戏开发快速入门教程第1章了解OUYA及其设备 OUYA是基于Andorid系统的游戏主机.围绕OUYA游戏机,已经形成一个完整的生态圈.在国外,OUYA已经成为知名的游戏平台.本章会站在玩家 ...

最新文章

  1. 2019计算机应用设计大赛,2019年郑州大学软件与应用科技学院计算机设计大赛成功举办...
  2. 传感器实训心得体会_传感器实训心得
  3. python【蓝桥杯vip练习题库】ADV-69质因数(数论)
  4. C语言再学习 -- 创建excel文件
  5. python center函数对齐方式_Python如何对齐字符串
  6. Git生成patch及打patch到源代码
  7. RHCE课程-RH033Linux基础笔记五之常用文本处理命令、输入输出重定向、管道
  8. Github发现优秀的开源项目
  9. BroadCastReceive的理解和使用
  10. poj 1287 Networking (最小生成树Kruskal算法)
  11. android+京东分类菜单,Android仿京东商品分类
  12. 计算机设备码的功能,多功能修改电脑机器码序列号工具
  13. 实验05 指针及其在程序设计中的应用(2021级)
  14. 02 - 语义网络,语义网,链接数据和知识图谱
  15. 寻找AR中的Big Difference - v2.0 | MixLab AR指南
  16. mysql查询学生表的总人数_mysql数据库查询练习
  17. OpenCV 图像分块 分块图像合并
  18. Java家庭记账程序
  19. 超值干货 | 建议收藏:精美详尽的 HTTPS 原理图注意查收!
  20. Mysql主从配置步骤与各种错误

热门文章

  1. 关于__VA_ARGS__的说明
  2. 什么是原码、反码和补码?
  3. java redis 主从配置_Redis实现主从复制(MasterSlave)
  4. 计算机辅助设计课程描述,计算机辅助设计课程教学的现状与方法
  5. linux的grup文件,Linux /boot/grub/grub.conf(GRUB配置文件)内容详解
  6. 027-日期和时间组件
  7. 017_layout排版
  8. 算法导论中C语言代码,算法导论-学习笔记与进度
  9. mysql什么格式转换_MySQL日期格式转换
  10. redis 用中文做key_推荐一款Redis客户端工具