Levenberg-Marquardt (LM) 算法进行非线性拟合

2024-04-25 12:28

本文主要是介绍Levenberg-Marquardt (LM) 算法进行非线性拟合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


目录

  • 1. LM算法
  • 2. 调包实现
  • 3. LM算法实现
  • 4. 源码地址


1. LM算法

LM算法是一种非线性最小二乘优化算法,用于求解非线性最小化问题。LM主要用于解决具有误差函数的非线性最小二乘问题,其中误差函数是参数的非线性函数,需要通过调整参数使误差函数最小化。算法的基本思想是通过迭代的方式逐步调整参数,使得误差函数在参数空间中逐渐收敛到最小值。在每一次迭代中,算法通过求解一个线性方程组来更新参数。这个线性方程组由误差函数的雅可比矩阵和参数更新量构成。

LM算法的优点在于它能够快速收敛到局部最小值,并且对于初始参数的选择不太敏感。此外,算法还能够处理参数个数多于观测数据个数的问题,并且对于存在噪声的数据也比较鲁棒。

2. 调包实现

如图1所示,调用scipy.optimize的least_squares函数实现对测试函数 exp ⁡ ( − a x 2 − b y 2 ) \exp(-ax^2-by^2) exp(ax2by2)的拟合结果。目标参数为 [ 0.5 , 0.5 ] [0.5, 0.5] [0.5,0.5],初始参数设置为 [ 1.0 , 1.0 ] [1.0, 1.0] [1.0,1.0],经过22次迭代,由于观测值暂未添加噪声,所以最终拟合参数与目标参数完全一致。

在这里插入图片描述

Fig. 1. 三维目标拟合: $\exp(-ax^2-by^2)$

3. LM算法实现

使用Python对LM做了简单实现,并对测试函数 exp ⁡ ( a x 2 + b x + c ) \exp(ax^2+bx+c) exp(ax2+bx+c)进行拟合,观测值添加高斯噪声。目标参数为 [ 1.0 , 2.0 , 3.0 ] [1.0, 2.0, 3.0] [1.0,2.0,3.0],初始参数设置为 [ 3.0 , 9.0 , 6.0 ] [3.0, 9.0, 6.0] [3.0,9.0,6.0],经过41次迭代,拟合参数为 [ 2.0 , 0.6 , 3.5 ] [2.0, 0.6, 3.5] [2.0,0.6,3.5],MSE损失小于0.000001,符合拟合误差要求。图2绘制了第12(蓝),13(黄),15(绿)次迭代结果以及最终拟合结果(红)。

在这里插入图片描述

Fig. 2. 二维目标拟合: $\exp(ax^2+bx+c)$
# 部分函数代码:def Func(abc,iput):   # 需要拟合的函数,abc是包含三个参数的一个矩阵[[a],[b],[c]]a = abc[0,0]b = abc[1,0]c = abc[2,0]return np.exp(a*iput**2+b*iput+c)def Deriv(abc,iput,n):  # 对函数求偏导x1 = abc.copy()x2 = abc.copy()x1[n,0] -= 0.000001x2[n,0] += 0.000001p1 = Func(x1,iput)p2 = Func(x2,iput)d = (p2-p1)*1.0/(0.000002)return dxk_l = []  # 用来存放每次迭代的结果
while conve:mse,mse_tmp = 0,0step += 1  fx = Func(xk,h) - ymse += sum(fx**2)for j in range(3): J[:,j] = Deriv(xk,h,j) # 数值求导                                                    mse /= n  # 范围约束H = J.T*J + u*np.eye(3)   # 3*3dx = -H.I * J.T*fx        # xk_tmp = xk.copy()xk_tmp += dxfx_tmp =  Func(xk_tmp,h) - y  mse_tmp = sum(fx_tmp[:,0]**2)mse_tmp /= n#判断是否下降q = float((mse - mse_tmp)/((0.5*dx.T*(u*dx - J.T*fx))[0,0]))if q > 0:s = 1.0/3.0v = 2mse = mse_tmpxk = xk_tmptemp = 1 - pow(2*q-1,3)if s > temp:u = u*selse:u = u*tempelse:u = u*vv = 2*vxk = xk_tmpprint ("step = %d,abs(mse-lase_mse) = %.8f" %(step,abs(mse-lase_mse)))  if abs(mse-lase_mse)<0.000001:breaklase_mse = mse  # 记录上一个 mse 的位置conve -= 1xk_l.append(xk)

4. 源码地址

如果对您有用的话可以点点star哦~

https://github.com/Jurio0304/cs-math/blob/main/hw4_LM.ipynb


创作不易,麻烦点点赞和关注咯!

这篇关于Levenberg-Marquardt (LM) 算法进行非线性拟合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/934679

相关文章

Pandas使用AdaBoost进行分类的实现

《Pandas使用AdaBoost进行分类的实现》Pandas和AdaBoost分类算法,可以高效地进行数据预处理和分类任务,本文主要介绍了Pandas使用AdaBoost进行分类的实现,具有一定的参... 目录什么是 AdaBoost?使用 AdaBoost 的步骤安装必要的库步骤一:数据准备步骤二:模型

使用Pandas进行均值填充的实现

《使用Pandas进行均值填充的实现》缺失数据(NaN值)是一个常见的问题,我们可以通过多种方法来处理缺失数据,其中一种常用的方法是均值填充,本文主要介绍了使用Pandas进行均值填充的实现,感兴趣的... 目录什么是均值填充?为什么选择均值填充?均值填充的步骤实际代码示例总结在数据分析和处理过程中,缺失数

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础

SpringSecurity6.0 如何通过JWTtoken进行认证授权

《SpringSecurity6.0如何通过JWTtoken进行认证授权》:本文主要介绍SpringSecurity6.0通过JWTtoken进行认证授权的过程,本文给大家介绍的非常详细,感兴趣... 目录项目依赖认证UserDetailService生成JWT token权限控制小结之前写过一个文章,从S

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面