非线性最小二乘问题例题_非线性自适应控制算法

非线性最小二乘问题例题_非线性自适应控制算法摘录的一篇有关求解非线性最小二乘问题的算法–LM算法的文章,当中也加入了一些我个人在求解高精度最小二乘问题时候的一些感触:LM算法,全称为Levenberg-Marquard算法,它可用于解决非线性最小二乘问题,多用于曲线拟合等场合。LM算法的实现并不算难,它的关键是用模型函数 f 对待估参数向量p在其邻域内做线性近似,忽略掉二阶以上的导数项,从而转化为线性最小二乘问题,它具有收敛速度快

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

摘录的一篇有关求解非线性最小二乘问题的算法–LM算法的文章,当中也加入了一些我个人在求解高精度最小二乘问题时候的一些感触:

LM算法,全称为Levenberg-Marquard算法,它可用于解决非线性最小二乘问题,多用于曲线拟合等场合。

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

事实上,你从所有可以找到的资料里看到的LM算法的说明,都可以找到类似于“如果目标函数值增大,则调整某系数再继续求解;如果目标函数值减小,则调整某系数再继续求解”的迭代过程,这种过程与上面所说的信赖域法是非常相似的,所以说LM算法是一种信赖域法。

 

LM算法需要对每一个待估参数求偏导,所以,如果你的目标函数f非常复杂,或者待估参数相当地多,那么可能不适合使用LM算法,而可以选择Powell算法——Powell算法不需要求导。

 

至于这个求导过程是如何实现的,我还不能给出建议,我使用过的方法是拿到函数的方程,然后手工计算出其偏导数方程,进而在函数中直接使用,这样做是最直接,求导误差也最小的方式。不过,在你不知道函数的形式之前,你当然就不能这样做了——例如,你提供给了用户在界面上输入数学函数式的机会,然后在程序中解析其输入的函数,再做后面的处理。在这种情况下,我猜是需要使用数值求导算法的,但我没有亲自试验过这样做的效率,因为一些优秀的求导算法——例如Ridders算法——在一次求导数值过程中,需要计算的函数值次数也会达到5次以上。这样的话,它当然要比手工求出导函数(只需计算一次,就可以得到导数值)效率要差得多了。不过,我个人估计(没有任何依据的,只是猜的):依赖于LM算法的高效,就算添加了一个数值求导的“拖油瓶”,整个最优化过程下来,它仍然会优于Powell等方法。

关于偏导数的求取

个人认为:在条件允许、对速度和精度任何以方面都有一定要求的前提下,如果待求解的函数形式是显式的,应当尽量自己计算目标函数的偏导数方程。原因在于,在使用数值法估计偏导数值时,尽管我们可以控制每一步偏导数值的精度,但是由于求解过程需要进行多次迭代,特别是收敛过程比较慢的求解过程,需要进行很多次的求解,每一次求解的误差偏差都会在上一步偏差的基础上不断累积。尽管在最后依然可以收敛,但是得到的解已经离可以接受的解偏离比较远了。因此,在求解函数形式比较简单、偏导数函数比较容易求取时,还是尽量手动计算偏导数,得到的结果误差相对更小一些。


这篇解释信赖域算法的文章中,我们已经知道了LM算法的数学模型:

可以证明,此模型可以通过解方程组(Gk+μI)s=−gk确定sk来表征。
即:LM算法要确定一个μ≥0,使得Gk+μI正定,并解线性方程组(Gk+μI)sk=−gk求出sk。
下面来看看LM算法的基本步骤:

·从初始点x0,μ0>0开始迭代

·到第k步时,计算xk和μk

·分解矩阵Gk+μkI,若不正定,令μk=4μk并重复到正定为止

·解线性方程组(Gk+μkI)sk=−gk求出sk并计算rk

·若rk<0.25,令μk+1=4μk;若rk>0.75,令μk+1=μk2;若0.25≤rk≤0.75,令μk+1=μk

·若rk≤0,说明函数值是向着上升而非下降的趋势变化了(与最优化的目标相反),这说明这一步走错了,而且错得“离谱”,此时,不应该走到下一点,而应“原地踏步”,即xk+1=xk,并且和上面rk<0.25的情况一样对μk进行处理。反之,在rk>0的情况下,都可以走到下一点,即xk+1=xk+sk

·        迭代的终止条件:∥gk∥<ε,其中ε是一个指定的小正数(大家可以想像一下二维平面上的寻优过程(函数图像类似于抛物线),当接近极小值点时,迭代点的梯度趋于0)

从上面的步骤可见,LM求解过程中需要用到求解线性方程组的算法,一般我们使用高斯约当消元法,因为它非常稳定——虽然它不是最快最好的算法。
同时,上面的算法步骤也包含对矩阵进行分解的子步骤。为什么要先分解矩阵,再解线性方程组?貌似是这样的(数学不好的人再次泪奔):不分解矩阵使之正定,就无法确定那个线性方程组是有解的。矩阵分解有很多算法,例如LU分解等,这方面我没有看。


加粗部分为个人感想,其余部分为从网上摘录的一些经验总结,对工作起到了很好的启发作用,感谢原作者的分享。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/189073.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • STM32编程怎么入门,聊聊我的入门经历

    STM32编程怎么入门,聊聊我的入门经历我第一次接触STM32大概是在8,9年前。当时刚出来工作不久,在此之前主要用stc和nxp的单片机比较多。那个时候还没有固件库开发的概念,基本都是配置寄存器去使用单片机外设资源。虽然说用起来比较麻烦,但是执行的效率也相对高一点,习惯了也挺好用。新项目比较复杂一点,一个老工程师建议我用stm32的单片机做效率比较高。听大佬的话照做是一个小菜鸟的基本素养,所以我选了stm32。对于学习这块,我也比较舍得(当时月薪只有1.8K),毫不犹豫花了几百大洋购买了一套stm32开发板。学习一款

    2025年9月29日
    2
  • windows服务器审计日志存放位置,windows服务器审计日志存放位置[通俗易懂]

    windows服务器审计日志存放位置,windows服务器审计日志存放位置[通俗易懂]windows服务器审计日志存放位置内容精选换一换Manager的审计日志默认保存在数据库中,如果长期保留可能引起数据目录的磁盘空间不足问题,管理员如果需要将审计日志保存到其他归档服务器,可以在FusionInsightManager设置转储参数及时自动转储,便于管理审计日志信息。若用户未配置审计日志转储,当审计日志达到十万条,系统自动将这十万条审计日志保存到文件中。保存路径为主管理节为加强对…

    2022年6月4日
    178
  • pycharm激活码2021 3月最新注册码

    pycharm激活码2021 3月最新注册码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    53
  • 绝句。。。。

    绝句。。。。

    2021年4月29日
    140
  • Java中Calendar跨年的坑「建议收藏」

    Java中Calendar跨年的坑「建议收藏」上代码:publicstaticvoidmain(String[]args)throwsException{SimpleDateFormatsimpleDateFormat=newSimpleDateFormat(“yyyy-MM”);Calendarcalendar=Calendar.getInstance();calendar.setTime(simpleDateFormat.parse(“2021-08”)

    2022年6月14日
    34
  • pycharm双击但是无法打开的情况_mac电脑上pycharm怎么安装

    pycharm双击但是无法打开的情况_mac电脑上pycharm怎么安装本来pycharm用的好好地,电脑重启之后,突然就打不开了,双击没反应,重新安装也解决不了,百度找不到结果,就去google了。https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000120784-Can-t-open-IntelliJ-on-MacOs有兴趣的小伙伴可以看这个。主要意思就是,用命令行…

    2022年8月25日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号