利用Levenberg_Marquardt算法求解无约束的非线性最小二乘问题~

早就想写这篇文章,但是一直没抽出空,主要是画图比较麻烦,嘿嘿~ 现在介绍如何利用经典的Levenberg_Marquardt算法求解无约束的非线性最小二乘问题。Levenberg_Marquardt算法是以两位数学家命名的搜索算法,它比较于常见的最速下降(又被称作梯度下降),牛顿法等,具有较好的全局收敛性,所以得到了较多的重视与应用。

(转载请注明:http://blog.csdn.net/wsj998689aa/article/details/40826775, 作者:迷雾forest)


总所周知,在合理步长的前提下,最速下降法的搜索方向虽然始终为下降方向,但是收敛速度太慢(这个算法竟然叫做最速下降。。。)牛顿法虽然收敛速度得到了很大提升,但是搜索方向未必是函数下降方向。而Levenberg_Marquardt算法则吸取了二者的优点,通过引入一个简单的参数a,使其既能够快速的下降,又能够保证总体沿着下降方向进行搜索。并且,当陷入局部最优解时,可以调整搜索方向,跳出局部最优解。因此,该算法具有很大的概率收敛到全局最优解,即具有梦寐以求的全局收敛性。


再说说最小二乘问题,其数学形式如下:

(1)


其中,N就是观察数据个数,x当然就是所需求解的对象,如果f(x)为线性函数,如公式(2)所示,此时上述问题就是无约束的线性最小二乘问题,如果f(x)为非线性函数,例如指数函数等等,那么上述问题就被称作无约束的非线性最小二乘问题。

(2)


一般求解非线性最小二乘问题的思路都是一致的,那就是,通过泰勒展开对F(x)进行一阶泰勒近似(公式(3)),然后就顺利成章的把非线性最小二乘问题转换为线性最小二乘问题进行求解。注意,这里采用的是一阶泰勒近似,不是其它阶数,因为只有一阶的情况下,才可以得到线性函数形式,这点从公式(3)中可以明显看出。

(3)


之前做非线性最小二乘问题这块,百思不得其解,为什么线性最小二乘问题就可以直接通过求解析解的方式得到最优解,而非线性最小二乘问题就必须要迭代求取最优解,后来直接推导公式(1)才恍然大悟,原来非线性最小二乘问题,是无法构造出来一个矩阵线性方程组的,当然就无法直接求解,关于这一点,我觉得也值得好好的解释,以后有空写写。


由于关于Levenberg_Marquardt算法的算法流程文字描述比较拗口,所以我直接画了个流程图,会更直观一些,如下所示:

  


其中,Ak和fk分别代表雅克比矩阵和函数值向量,由于十分常见,这里我就不给出数学形式了。强烈提醒大家注意一点,在右侧分支那里,k并不增加,Ak和fk均为之前一步的,改变的只是参数a,我之前这里出现问题,导致我的LM算法无论如何都不收敛,让我郁闷非常,后来仔细回头看算法流程才发现自己的错误,所以我这次画了个图给大家,不要走我的弯路啊!


进一步解释一下LM算法为何牛逼,上面已经说过了,该算法吸取了最速下降法和牛顿法的优点,原因就在于那个参数a,当a趋于0时,算法实际上变成了牛顿法,当a很大时,算法实际上变成了最速下降法,剩下的,就介于二者之间,当发现陷入局部最优时,便会增大a值,使得参数变化加剧,达到跳出局部最优解的目的。


这里,我给出函数值变化的曲线图,通过这个曲线图我们明显可以发现,LM算法可以有效的避免陷入局部最优,并且,总体而言,保持下降方向。




最后,附上自己写的,Levenberg_Marquardt算法Matlab代码,有任何问题,请不吝指教,谢谢!!!不好意思,之前写的那个版本让我替换下去了,因为不够通用。

%% 函数功能:利用Levenberg_Marquardt算法求解无约束的非线性最小二乘问题
function [x_curr, iter] = Levenberg_Marquardt(Diff, f, var, x0, lamda, beita, eps)
    % 相关参数
    max_iter    = 100;
    flag        = 1;
    x_curr      = x0;

    for iter = 1 : max_iter
        if flag
            J   = double(subs(jacobian(Diff, var), var, x_curr));      % 雅可比矩阵
            H   = transpose(J) * J;                                    % 赫森矩阵    
            
            if iter == 1
                f_curr = double(subs(f, var, x_curr));
            end
        end

        % 计算新Hessen矩阵
        H_new = H + (lamda * eye(2, 2));

        % 计算步长d
        diff = double(subs(Diff, var, x_curr));
        d    = inv(H_new) * (J' * diff);
        
        % 更新参数
        x_new = x_curr - d;

        % 计算新函数值
        f_new = double(subs(f, var, x_new));
  
        if f_new < f_curr
            % 收敛条件(左侧分支)
            x_curr = x_new;
            if (norm(d) < eps)
                disp('收敛条件1')
                break;
            end
            
            f_curr = f_new;
            flag = 1;
            lamda = lamda / beita;
        else           
            % 收敛条件(右侧分支)
            if (norm(d) < eps)
                disp('收敛条件2')
                break;
            end
            
            flag = 0;
            lamda = lamda * beita;
        end
    end
end


补充:时隔一年,这一年中有不少朋友问过我关于这篇博客的一个疑问,大家总是不能正确使用Levenberg_Marquardt算法进行非线性最小二乘问题的求解,或者说得到的解总是不尽人意,其实很多人都犯了一个疏漏,就是公式(2),必须强调的是,(2)中的b指的不是函数的参数,而是观测数据,举个例子,如果线性函数是g(x) = a*x + b,那么f(x) = a*x + b - y,一些同学将f(x)错认为就是g(x),这是错误的,一定要再减去观测数据项,希望大家看到这点补充之后不要再疏忽这一点。


一年了,时间过得真快~~~



  • 20
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答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算法是一种有效的非线性最小二乘优化算法,可以用于求解具有一定复杂度的问题

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值