首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Levenberg-Marquardt算法与ODR算法的区别

Levenberg-Marquardt算法与ODR算法的区别
EN

Stack Overflow用户
提问于 2012-07-04 13:32:05
回答 1查看 2.3K关注 0票数 2

我能够使用峰席将曲线拟合到x/y数据集,如下所示。这是一个线性背景和10个洛伦兹曲线。

由于我需要拟合许多类似的曲线,我编写了一个脚本拟合例程,使用mpfit.py,这是一个莱温伯格-马夸德特算法。然而,这种适应需要更长的时间,而且,在我看来,比峰值的结果更不准确:

起始值

拟合结果与固定线性背景(线性背景值取自峰值-o-mat结果)

所有变量不含拟合结果

我相信起始值已经非常接近,但即使在固定的线性背景下,左洛伦兹显然是一个退化的契合。

结果是更糟糕的完全自由拟合。

峰值-o-mat似乎使用scipy.odr.odrpack。现在更有可能的是:

  1. 我做了一些实现错误?
  2. odrpack更适合这个特殊的问题吗?

对一个更简单的问题(中间有一个峰值的线性数据)的拟合显示,峰值o-mat和我的脚本之间有很好的相关性。另外,我也没有找到很多关于ordpack的东西。

编辑:,我似乎可以自己回答这个问题,但是答案有点令人不安。使用scipy.odr (允许与odr或最小二乘方法进行拟合)都可以将结果作为峰值,即使不受约束。

下图再次显示数据、起始值(几乎完美),然后显示odr和最小匹配值。组分曲线为odr曲线。

我会转到odr,但这还是让我心烦意乱。方法(mpfit.py,scipy.optimize.leastsq,scipy.odr在最少in模式下)‘应该’产生同样的结果。

对于偶然发现这篇文章的人:要完成odr拟合,必须为x和y值指定一个错误。如果没有错误,请与sx << sy一起使用小值。

代码语言:javascript
复制
linear = odr.Model(f)
mydata = odr.RealData(x, y, sx = 1e-99, sy = 0.01)
myodr = odr.ODR(mydata, linear, beta0 = beta0, maxit = 2000)
myoutput1 = myodr.run() 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-08 12:38:17

您也可以使用peak mat来编写脚本。最简单的方法是创建包含您希望通过GUI进行匹配的所有数据的项目,清理它,转换它并附加(即选择一个模型,提供一个初始猜测并拟合)基本模型到其中一个集合。然后,您可以(深入)复制该模型并将其附加到所有其他数据集。试试这个:

代码语言:javascript
复制
from peak_o_mat.project import Project
from peak_o_mat.fit import Fit
from copy import deepcopy

p = Project()
p.Read('in.lpj')

base = p[2][0]    # this is the set which has been fit already

for data in p[2][1:]: # all remaining sets of plot number 2

    mod = deepcopy(base.mod)
    data.mod = mod

    f = Fit(data, data.mod)
    res = f.run()

    pars = res[0]
    err = res[1]

    data.mod._newpars(pars, err)

    print data.mod.parameters_as_table()

p.Write('out')

如果你需要更多细节,请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11330131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档