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

本文介绍了非线性最小二乘问题及其解决方法——LM算法,并通过Matlab自带的lsqnonlin函数进行了实例演示,对比了使用与不使用Jacobian的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.

LM算法,全称为Levenberg-Marquard算法,它可用于解决非线性最小二乘问题,多用于曲线拟合等场合。 LM算法的实现并不算难,它的关键是用模型函数 f 对待估参数向量 p 在其邻域内做线性近似,忽略掉二阶以上的导数项,从而转化为线性最小二乘问题,它具有收敛速度快等优点。LM算法属于一种“信赖域法”——所谓的信赖域法,此处稍微解释一下:在最优化算法中,都是要求一个函数的极小值,每一步迭代中,都要求目标函数值是下降的,而信赖域法,顾名思义,就是从初始点开始,先假设一个可以信赖的最大位移 s ,然后在以当前点为中心,以 s 为半径的区域内,通过寻找目标函数的一个近似函数(二次的)的最优点,来求解得到真正的位移。在得到了位移之后,再计算目标函数值,如果其使目标函数值的下降满足了一定条件,那么就说明这个位移是可靠的,则继续按此规则迭代计算下去;如果其不能使目标函数值的下降满足一定的条件,则应减小信赖域的范围,再重新求解。 事实上,你从所有可以找到的资料里看到的LM算法的说明,都可以找到类似于“如果目标函数值增大,则调整某系数再继续求解;如果目标函数值减小,则调整某系数再继续求解”的迭代过程,这种过程与上面所说的信赖域法是非常相似的,所以说LM算法是一种信赖域法。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值