Levenberg-Marquardt算法




L~M方法:

L~M(Levenberg-Marquardt)方法有些让人摸不清头脑。玉米觉得L~M让人困扰的主要原因有两点:一是L~M从何而来、二是L~M怎么样用?因为玉米也不是研究最优化理论的,所以玉米在这里用较为通俗的观点,为大家分析一下L~M方法。在数学上的不严谨之处,期望大家海涵。

一、L~M从何而来

首先,L~M方法首先是一种非线性规划方法;其次其主要用于无约束的多维非线性规划问题;最后,它是一阶牛顿法的一种改进,改进的目的是为了更快的收敛。

既然如此,那么让我们先来了解一下L~M方法的“前辈”一阶牛顿法吧。对一阶牛顿法的理解会帮助我们了解L~M方法的总体思路。

         对于无约束的多维非线性规划问题,起码我们需要一个可以令人接受的参数估计的初始解,我们设其为:Xk。(举个例子,这就是张正友标定法中通过纯粹的几何推导得出的摄像机参数)。在Xk的基础上,我们去寻找比Xk更“靠谱”的估计值。既然我们已经认为Xk可以令人接受,那么更好更精确的估计值应该在Xk的附近,在距离Xk长度为Δk的地方。那么,现在我们用一点点高等数学的知识:泰勒展开式。对于一阶牛顿法,我们用一阶泰勒展式逼近Xk附近点的f(Xkk)估计值。(这里提到的量都是矩阵形式哦比如,在张正友标定法中f(Xkk)由u和v组成)如下



        假设ε=Xk+1-Xk在某时以变化的缓慢到我们认为算法以收敛。我们称ε为终止条件。

        那么,我们就这样迭代下去,总会得到符合我们预期的Xk+1

        以上就是一阶牛顿法,说白了就是一个不断向着有利方向迭代的过程。

        L~M方法是在一阶牛顿法基础上的改进。为加快收敛,L~M把上面的正规化方程改成了增量正规化方程。如下:


         λ就是增量方程中所谓的增量。

         L~M方法中,取增量的规则如下:

         最初,设λ=0.0001,如果增量方程的解Δk导致ek减小,我们就接受这个λ,并在下一次迭代中使用λ/10代换λ。如果λ值对应的增量方程的解Δk导致ek增大,我们就舍弃这个λ,并将其代换为10λ重解增量方程。循环往复直到ek下降为止。λk+1=10λk

         L~M也是迭代循环,直到总会得到符合我们预期的Xk+1为止。

        以上就是L~M方法的原理与出处。大家一定觉得昏昏欲睡了。那么下一部分,应该是大家喜闻乐见的。玉米,将L~M算法的过程总结成算法流程图,与大家分享。||Δk||<ε

二、L~M这样用:

         该流程图就是L-M算法的算法流程。玉米就不多说什么了,流程图更清晰一些。

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

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

 

Levenberg-Marquardt


图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

 

   LM算法是介于牛顿法与梯度下降法之间的一种非线性优化方法,对于过参数化问题不敏感,能有效处理冗余参数问题,使代价函数陷入局部极小值的机会大大减小,这些特性使得LM算法在计算机视觉等领域得到广泛应用。

算法流程

          Levenberg-Marquardt

 在LM算法中,每次迭代是寻找一个合适的阻尼因子λ,当λ很小时,算法就变成了GAuss-Newton法的最优步长计算式,λ很大时,蜕化为梯度下降法的最优步长计算式。

参考文献:

[1]. 张鸿燕, 狄征. Levenberg-Marquardt算法的一种新解释. 计算机工程与应用,2009,45(19),5-8.

from: http://heleiying.blog.163.com/blog/static/3110429201081693815164/

Levenberg-Marquardt快速入门教程(荐)
例子程序(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        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

************************************************************

转自:http://www.shenlejun.cn/my/article/show.asp?id=17&page=2





  • 7
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
LM算法,全称为Levenberg-Marquard算法,它可用于解决非线性最小二乘问题,多用于曲线拟合等场合。 LM算法实现并不算难,它的关键是用模型函数 f 对待估参数向量 p 在其邻域内做线性近似,忽略掉二阶以上的导数项,从而转化为线性最小二乘问题,它具有收敛速度快等优点。LM算法属于一种“信赖域法”——所谓的信赖域法,此处稍微解释一下:在最优化算法中,都是要求一个函数的极小值,每一步迭代中,都要求目标函数值是下降的,而信赖域法,顾名思义,就是从初始点开始,先假设一个可以信赖的最大位移 s ,然后在以当前点为中心,以 s 为半径的区域内,通过寻找目标函数的一个近似函数(二次的)的最优点,来求解得到真正的位移。在得到了位移之后,再计算目标函数值,如果其使目标函数值的下降满足了一定条件,那么就说明这个位移是可靠的,则继续按此规则迭代计算下去;如果其不能使目标函数值的下降满足一定的条件,则应减小信赖域的范围,再重新求解。 事实上,你从所有可以找到的资料里看到的LM算法的说明,都可以找到类似于“如果目标函数值增大,则调整某系数再继续求解;如果目标函数值减小,则调整某系数再继续求解”的迭代过程,这种过程与上面所说的信赖域法是非常相似的,所以说LM算法是一种信赖域法。
### 回答1: Levenberg-Marquardt算法是一种非线性最小二乘优化算法,通常用于解决非线性最小二乘问题。Matlab中提供了lsqnonlin函数来实现Levenberg-Marquardt算法。 使用lsqnonlin函数的一般步骤如下: 1. 定义函数:首先定义一个函数,这个函数应该返回要最小化的残差(residual)的向量。残差是指实际观测值与预测值之间的差异。 2. 设置初值:为变量设置初值,并确定要最小化的残差的类型。 3. 调用lsqnonlin函数:使用lsqnonlin函数来执行Levenberg-Marquardt算法,该函数接受上述函数、初值和其他选项参数作为输入,并返回最小化残差的变量值。 4. 处理输出:处理输出变量并检查算法是否收敛。 以下是一个使用Matlab实现Levenberg-Marquardt算法的示例代码: ``` function [x,resnorm,residual,exitflag,output] = myfun() % Define function fun = @(x)myfunc(x); % Set initial guess x0 = [1,1]; % Define options options = optimoptions('lsqnonlin','Display','iter'); % Call lsqnonlin [x,resnorm,residual,exitflag,output] = lsqnonlin(fun,x0,[],[],options); % Check convergence if exitflag < 0 disp(['No convergence. Exitflag = ' num2str(exitflag)]) end % Define function myfunc function F = myfunc(x) F(1) = x(1)^2 - x(2) + exp(x(1)); F(2) = x(1)*x(2) + sin(x(2)); end ``` 在这个示例中,我们定义了一个名为myfunc的函数,该函数返回一个2维向量,表示我们要最小化的残差。我们设置了一个初值x0=[1,1],并使用optimoptions函数设置了一些选项参数,例如显示优化过程。然后我们调用lsqnonlin函数来执行Levenberg-Marquardt算法,并将最终结果保存在x、resnorm、residual、exitflag和output变量中。最后,我们检查是否收敛,如果exitflag小于0,则表示算法没有收敛。 ### 回答2: Levenberg-Marquardt 算法是一种用于解决非线性最小二乘问题(非线性拟合)的优化算法。在 Matlab 中,可以使用 "lsqcurvefit" 函数来实现 Levenberg-Marquardt 算法。 这个算法的主要思想是将标准的最小二乘问题转化成带有正则化项的问题,用来提高算法的鲁棒性和收敛性。 该算法的一个关键参数是 $\lambda$,它在不同的迭代中会动态地改变,用于控制拟合函数的平滑性和拟合程度。当 $\lambda$ 较小时,算法类似于常规的最小二乘法;当 $\lambda$ 较大时,算法类似于梯度下降法,从而可以跳出局部最小值,达到更好的全局最小值。 在 Matlab 中,可以通过指定一些参数来调整 Levenberg-Marquardt 算法的行为,例如迭代次数、收敛阈值和初始猜测值。这些参数的设置有助于提高算法的稳定性和精度。 总之,Levenberg-Marquardt 算法是一种常用的非线性拟合算法,在 Matlab 中得到了广泛的应用。通过调整算法的参数,可以得到更好的拟合结果。 ### 回答3: Levenberg-Marquardt算法是一种用于非线性最小二乘问题的求解方法。在Matlab中,Levenberg-Marquardt算法可以通过使用内置函数lsqcurvefit来实现。该算法通过在每一步上使用正则化参数调整来平衡牛顿步长和梯度下降步长,从而在不降低性能的情况下改进收敛速度。 要使用Matlab中的Levenberg-Marquardt算法,需要提供一个待求解参数的初始猜测值、目标函数以及任何必要的限制条件。目标函数通常是由用户定义的,并在每个求解迭代中计算函数残差的平方。该算法通过不断更新参数矩阵来最小化残差。 Levenberg-Marquardt算法的优点在于它通常可以快速收敛,即使初始猜测值相对较远离真实值也是如此。此外,该算法还可以处理各种类型的非线性问题,包括具有参数非线性性的问题和带有诸如噪声等扰动的问题。 在Matlab中,Levenberg-Marquardt算法常用于求解最小化误差的问题,如曲线拟合、函数逼近和数值优化等。使用该算法,用户可以通过调整参数来获得最佳的模型拟合,从而提高预测精度和模型的可靠性。 总之,Levenberg-Marquardt算法在Matlab中具有广泛的应用,并且可以通过使用内置的lsqcurvefit函数实现。该算法的优点包括快速的收敛速度和能够处理各种类型的非线性问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值