非线性最小二乘问题之Levenberg-Marquardt Method

1.什么是非线性最小二乘问题

所谓“非线性最小二乘优化问题”就是指:目标函数是非线性函数平方和,具体形式为:
这里写图片描述

可以看到,目标函数为n个函数平方和

2.如何求解非线性最小二乘问题

LM算法是求解非线性最小二乘问题的一个很稳定的方法,实际应用中经常使用,之前都是自己编写程序,今天偶然发现matlab居然自带了LM优化算法

3.Matlab中的LM算法函数

matlab提供了一个求解非线性最小二乘问题的优化函数lsqnonlin

Matlab提供了2种计算方式,分别为with Jacobian和without Jacobian两种方式
以如下优化函数为例:min这里写图片描述

3.1 without Jacobian

step1:myfun.m函数

myfun函数作用是计算目标函数

% 函数输入是向量x,返回值是目标函数值
function F = myfun(x)
k = 1:10;
F = 2 + 2*k-exp(k*x(1))-exp(k*x(2));

step2: 利用lsqnonlin函数求解优化问题

x0 = [0.3,0.4]; % Starting guess
[x,resnorm,res,eflag,output1] = lsqnonlin(@myfun,x0); % Invoke optimizer

注意到,在mufun函数中,并没有计算Jacobian
经过72步迭代后,可以得到最优解x和残差resnorm
x = 0.2578 0.2578;resnorm = 124.3622

3.2 with Jacobian

step1:myfun.m函数

myfun函数作用是计算目标函数及目标函数的Jacobian

% 函数输入是向量x,返回值是目标函数值F和Jacobian
function [F,J] = myfun(x)
k = 1:10;
F = 2 + 2*k-exp(k*x(1))-exp(k*x(2));
if nargout > 1  %如果返回值为2个
    J = zeros(10,2);
    J(k,1) = -k.*exp(k*x(1));
    J(k,2) = -k.*exp(k*x(2));
end

step2:设置solver

opts = optimoptions(@lsqnonlin,’SpecifyObjectiveGradient’,true);

step3: 利用lsqnonlin函数求解优化问题

x0 = [0.3 0.4]; % Starting guess
[x,resnorm,res,eflag,output2] = lsqnonlin(@myfun,x0,[],[],opts);

经过24步迭代后,可以得到最优解x和残差resnorm
x = 0.2578 0.2578;resnorm = 124.3622

可以看到:
The advantage to using a Jacobian is that the solver takes fewer function evaluations, 24 instead of 72.

  • 5
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
LM算法,全称为Levenberg-Marquard算法,它可用于解决非线性最小二乘问题,多用于曲线拟合等场合。 LM算法的实现并不算难,它的关键是用模型函数 f 对待估参数向量 p 在其邻域内做线性近似,忽略掉二阶以上的导数项,从而转化为线性最小二乘问题,它具有收敛速度快等优点。LM算法属于一种“信赖域法”——所谓的信赖域法,此处稍微解释一下:在最优化算法中,都是要求一个函数的极小值,每一步迭代中,都要求目标函数值是下降的,而信赖域法,顾名思义,就是从初始点开始,先假设一个可以信赖的最大位移 s ,然后在以当前点为中心,以 s 为半径的区域内,通过寻找目标函数的一个近似函数(二次的)的最优点,来求解得到真正的位移。在得到了位移之后,再计算目标函数值,如果其使目标函数值的下降满足了一定条件,那么就说明这个位移是可靠的,则继续按此规则迭代计算下去;如果其不能使目标函数值的下降满足一定的条件,则应减小信赖域的范围,再重新求解。 事实上,你从所有可以找到的资料里看到的LM算法的说明,都可以找到类似于“如果目标函数值增大,则调整某系数再继续求解;如果目标函数值减小,则调整某系数再继续求解”的迭代过程,这种过程与上面所说的信赖域法是常相似的,所以说LM算法是一种信赖域法。
### 回答1: Levenberg-Marquardt算法是一种非线性最小二乘算法,用于最小化非线性函数与观测数据之间的差异。该算法用于曲线拟合、参数估计和优化等问题。 该算法通过迭代的方式不断调整参数的值,使得非线性函数与观测数据之间的方差最小化。其基本思想是结合了高斯-牛顿法和梯度下降法的优点,在每一步迭代中通过计算特定的正则化矩阵来调整参数的值。 具体而言,Levenberg-Marquardt算法在每一步迭代中计算出一个更新的参数值,通过将目标函数的Hessian矩阵与一个正则化矩阵进行求和,然后求解一个线性方程组来获得新的参数值。正则化矩阵的大小是一个可调整的参数,用于控制算法在高斯-牛顿法和梯度下降法之间的平衡。 Levenberg-Marquardt算法具有较快的收敛速度和良好的参数估计性能,可以应对多种不同的非线性函数和观测数据。此外,该算法对于初始参数值的选择也比较鲁棒,不容易陷入局部最优。 总结来说,Levenberg-Marquardt算法是一种高效的非线性最小二乘算法,可以用于解决曲线拟合和参数估计等问题。它通过结合高斯-牛顿法和梯度下降法的优点,在每一步迭代中利用正则化矩阵调整参数值,以最小化非线性函数与观测数据之间的差异。 ### 回答2: Levenberg-Marquardt算法是一种用于求解非线性最小二乘问题的优化算法。它结合了高斯-牛顿法和梯度下降法的优点,能够更加稳定和快速地找到最优解。 该算法的基本思想是通过迭代调整模型参数来逐步逼近最小二乘问题的最优解。在每一步迭代中,算法通过计算目标函数的一阶导数(梯度)和二阶导数(雅可比矩阵的转置乘以雅可比矩阵)来确定参数的更新方向。根据参数更新的幅度和目标函数的变化情况,算法会自动调整步长,以保证迭代过程的稳定性和收敛性。 Levenberg-Marquardt算法与高斯-牛顿法的区别在于,它引入了一个调整因子,即Levenberg-Marquardt因子,用于平衡梯度下降和高斯-牛顿的比例。如果梯度下降方向过大,可能会导致迭代过程发散,而如果高斯-牛顿方向过大,可能会导致更新步长过大。通过调整因子的大小,Levenberg-Marquardt算法可以在梯度下降和高斯-牛顿之间取得平衡,从而更好地控制迭代过程。 在实际应用中,Levenberg-Marquardt算法被广泛应用于数据拟合、曲线拟合、参数估计等问题。由于其收敛速度较快且稳定性较好,被认为是求解非线性最小二乘问题的一种有效方法。 ### 回答3: Levenberg-Marquardt算法是一种用于求解非线性最小二乘问题的优化算法。它是将高斯-牛顿法和最速下降法结合起来的一种方法。 在非线性最小二乘问题中,我们要求解一个形式为F(x) = 0的方程组,其中F(x)是一个向量函数,x是待求解的参数向量。Levenberg-Marquardt算法的目标是找到使得F(x)最小的x。该算法通过反复迭代来逐步逼近最优解。 Levenberg-Marquardt算法的关键思想是结合了高斯-牛顿法和最速下降法的优点。在每一次迭代中,算法会首先计算Jacobian矩阵J,然后通过将J的转置矩阵与J相乘得到Hessian矩阵H。接下来,算法会计算一个补充项 λI,其中λ是一个正数,I是单位矩阵。然后,算法就以高斯-牛顿法的方式求解线性方程组(H + λI)∆x = -JF(x),其中∆x是参数的增量。 如果λ较小,算法的性能更接近高斯-牛顿法;如果λ较大,算法的性能更接近最速下降法。因此,λ的取值将直接影响算法的收敛速度。 Levenberg-Marquardt算法具有较快的收敛速度和良好的稳定性。然而,由于需要在每次迭代中计算Jacobian矩阵和Hessian矩阵,算法在处理大规模问题时可能会面临计算和存储的挑战。此外,算法的初值对于最终结果也具有较大的影响。 总之,Levenberg-Marquardt算法是一种有效的非线性最小二乘优化算法,可以用于求解具有一定复杂度的问题

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值