利用Levenberg-Marquardt方法拟合数据

  • 正文
  • 参考资料

正文

给定一组数据

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];

假设一个拟合模型
y=aebxy=ae^{bx} y=aebx
则我们的目标是使
f=obs1−yminF=12fTff=obs_1-y\\ minF=\frac{1}{2}f^Tf f=obs1​−yminF=21​fTf
注:粗体表示向量
求解最小二乘问题,Gauss-Newton法的迭代公式是
solve(JTJ)hgn=−JTfx:=x+αhgnsolve (J^TJ)h_{gn}=-J^Tf\\ x:=x+\alpha h_{gn} solve(JTJ)hgn​=−JTfx:=x+αhgn​
Levenberg-Marquardt法是一种阻尼Gauss-Newton方法,就是讲上式加入阻尼项,使求解更加稳定。
迭代公式为
(JTJ+μI)hlm=−JTfx:=x+hlm(J^T J+\mu I)h_{lm}=- J^Tf\\ x:= x+h_{lm} (JTJ+μI)hlm​=−JTfx:=x+hlm​
其中μ\muμ在迭代中根据情况会变化,当μ\muμ较大时,此时LM方法接近于最速下降法,迭代速度最快。当收敛进行到末尾,此时μ\muμ较小,LM方法接近于牛顿迭代。
主要代码如下:

    if update==1   %下降方向for j=1:num[f(j,1),J(j,:)] = fun_LM(data_1(j),obs_1(j),x);endA = J'*J;%维数2*2g = J'*f;%维数2*1if i==1e=dot(f,f)/2;endendh = -inv(A+miu*I)*g;x_new = x + h;if (norm(x_new-x,2))<1e-10%判别停止条件break;endfor j=1:num[f(j,1),J(j,:)] = fun_LM(data_1(j),obs_1(j),x_new); %每一次进行Jacobian矩阵更新endF = dot(f,f)/2;%新的误差if F<e%如果新的误差小于上一次误差,证明确实在下降方向上,则正常循环即可x = x_new;miu = miu/2;e = F;update = 1;else%若不在下降方向上,则原地踏步,只增大阻尼系数,等到再次满足下降条件再正常运算miu = miu*4;update = 0;end

上述代码还有很大改进空间,即μ\muμ的改进,这里只是乘一个常数或除一个常数,其实可以定义一个评价因子,根据评价因子的大小灵活调整μ\muμ的变化量,那样迭代次数更少一点。
最后结果如下:


参考资料

  • [参考资料1] K.Madsen,H.B.Nielsen, O.Tingleff. Methods for non-linear least squares problems

利用Levenberg-Marquardt方法拟合数据相关推荐

  1. R语言ggplot2可视化散点图、可视化两个数值变量之间的关系、使用geom_smooth函数基于loess方法拟合数据点之间的趋势关系曲线、自定义数据点的大小、色彩、添加主标题、副标题、题注信息

    R语言ggplot2可视化散点图.可视化两个数值变量之间的关系(Scatter plot).使用geom_smooth函数基于loess方法拟合数据点之间的趋势关系曲线.自定义数据点的大小.色彩.添加 ...

  2. R语言ggplot2可视化散点图(scatter plot)、并在可视化图像的顶部和右边添加边缘直方图(Marginal Histogram)、使用geom_smooth函数基于lm方法拟合数据点之间

    R语言ggplot2可视化散点图(scatter plot).并在可视化图像的顶部和右边添加边缘直方图(Marginal Histogram).使用geom_smooth函数基于lm方法拟合数据点之间 ...

  3. R语言ggplot2可视化散点图、并使用geom_encircle函数自定义多边形圈定可视化图像中的指定区域、使用geom_smooth函数基于loess方法拟合数据点之间的趋势关系曲线

    R语言ggplot2可视化散点图.并使用geom_encircle函数自定义多边形圈定可视化图像中的指定区域(Scatterplot With Encircling).使用geom_smooth函数基 ...

  4. 高斯牛顿算法matlab代码,matlab实现高斯牛顿法、Levenberg–Marquardt方法

    高斯牛顿法: function [ x_ans ] = GaussNewton( xi, yi, ri) % input : x = the x vector of 3 points % y = th ...

  5. R语言可视化散点图、气泡图、动态气泡图、数据点重合的散点图、数据点计数图、抖动数据点图、基于lm方法或者loess方法拟合数据点之间的趋势关系曲线、自定义数据点的大小、色彩、添加主标题、副标题、题注

    R语言可视化散点图.气泡图.动态气泡图.数据点重合的散点图.数据点计数图.抖动数据点图.基于

  6. 【TensorFlow-windows】keras接口——利用tensorflow的方法加载数据

    前言 之前使用tensorflow和keras的时候,都各自有一套数据读取方法,但是遇到一个问题就是,在训练的时候,GPU的利用率忽高忽低,极大可能是由于训练过程中读取每个batch数据造成的,所以又 ...

  7. android获取区域内像素坐标,Android利用BitMap获得图片像素数据的方法

    本文实例讲述了Android利用BitMap获得图片像素数据的方法.分享给大家供大家参考,具体如下: 网上看到的参考是: int[] pixels = new int[bit.getWidth()*b ...

  8. python中的iloc函数_详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据

    pandas的DataFrame对象,本质上是二维矩阵,跟常规二维矩阵的差别在于前者额外指定了每一行和每一列的名称.这样内部数据抽取既可以用"行列名称(对应.loc[]方法)",也 ...

  9. python账单查询软件_利用Python批量识别电子账单数据的方法

    这篇文章主要介绍了利用Python批量识别电子账单数据的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 一.前言 有一定数量类似如下截图所示的账单,利用 ...

最新文章

  1. java中常用的字符串的截取方法
  2. 用Unity3D的50个技巧:Unity3D最佳实践
  3. UA MATH574M 统计学习I 监督学习理论
  4. java thread setname_Java Thread setName()方法
  5. 如何让html重点表单自动对齐,html – 如何对齐多个表单元素?
  6. python中一些特殊方法的作用
  7. C++学习之路 | PTA(天梯赛)—— L2-007 家庭房产 (25分)(带注释)(并查集)(精简)
  8. java读取request中的xml
  9. F# 与 WPF 之多语言实现MVVM(二)
  10. python对seo有什么用_现在做seo会运用到python吗
  11. android string拼接字符串_「JAVA」细述合理创建字符串,分析字符串的底层存储,你不该错过...
  12. 带权有向无环图的最短路径(使用拓扑排序的方法)
  13. Fortran入门教程(十一)—— 模块
  14. IMGUI 系统 - Dear ImGUI
  15. 解决软件注册机被win10杀灭问题
  16. D轮融资1亿美金,6亿美金估值,3位计算机学霸如何带领海归团队创造业内神话?!...
  17. 十大最好用的企业资产管理软件EAM比较
  18. 智慧屏鸿蒙,荣耀智慧屏体验评测:鸿蒙OS首款产品,真正的智慧中心
  19. 迁移erp服务器系统教程,erp迁移上云服务器
  20. 几种常用方法教你解决QQ空间无法打开问题

热门文章

  1. MobileViT模型简介
  2. oracle 表碎片化处理,oracle数据库碎片化管理
  3. 现代化温室大棚是否可以满足铁皮石斛种植条件?
  4. oracle mrp全称,【简答题】MRP和MRP2的中文和英文全称分别是什么? (20.0分)
  5. linux命令查看cpu序列号,在Linux中使用C / C ++获取机器序列号和CPU ID
  6. pandas获取月底最后一个交易日对应数据
  7. FISCO BCOS——SmartDev-Contract——MarriageEvidence结婚证书合约案例分析
  8. 百度BOS设置Referer白名单
  9. Python卡通化照片
  10. 【Linux】虚拟机网络连接的三种方式