Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Levenberg-Marquardt算法与ODR算法的区别_Python_Scipy_Curve Fitting - Fatal编程技术网

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

Python Levenberg-Marquardt算法与ODR算法的区别,python,scipy,curve-fitting,Python,Scipy,Curve Fitting,我能够使用将曲线拟合到x/y数据集,如下所示。这是一个线性背景和10条洛伦兹曲线。 因为我需要拟合许多相似的曲线,所以我编写了一个脚本拟合例程,使用Levenberg-Marquardt算法。但是,在我看来,拟合需要更长的时间,并且不如peak-o-mat结果准确: 起始值 使用固定线性背景拟合结果(线性背景值取自peak-o-mat结果) 在所有变量都不存在的情况下拟合结果 我相信起始值已经非常接近了,但即使在固定的线性背景下,左洛伦兹显然是拟合的退化 对于完全自由配合,结果更糟 Pe

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

因为我需要拟合许多相似的曲线,所以我编写了一个脚本拟合例程,使用Levenberg-Marquardt算法。但是,在我看来,拟合需要更长的时间,并且不如peak-o-mat结果准确:

起始值

使用固定线性背景拟合结果(线性背景值取自peak-o-mat结果)

在所有变量都不存在的情况下拟合结果

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

对于完全自由配合,结果更糟

Peak-o-mat似乎在使用。现在更可能的情况是:

  • 我做了一些实现错误
  • odrpack更适合这个特殊问题
  • 拟合到一个更简单的问题(中间有一个峰值的线性数据)表明peak-o-mat和我的脚本之间有很好的相关性。我也没有发现很多关于ordpack的信息

    编辑:我似乎可以自己回答这个问题,但是答案有点令人不安。使用scipy.odr(允许使用odr或leastsq方法进行拟合)都可以将结果作为peak-o-mat给出,即使没有约束

    下图再次显示了数据、起始值(几乎完美),然后是odr和leastsq拟合。组件曲线适用于odr

    我将切换到odr,但这仍然让我感到不安。方法(在leastsq模式下的mpfit.py、scipy.optimize.leastsq、scipy.odr)“应该”产生相同的结果


    对于在这篇文章上结结巴巴的人来说:要使odr适合,必须为x和y值指定一个错误。如果没有错误,请使用小值和sx您也可以使用peak-o-mat编写脚本。最简单的方法是创建一个项目,其中包含您希望通过GUI适应的所有数据,清理它,转换它,并将基础模型附加(即选择一个模型,提供初始猜测并适应)到其中一个集合。然后可以(深度)复制该模型并将其附加到所有其他数据集。试试这个:

    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')
    

    如果您需要更多详细信息,请告诉我。

    peak-o-mat是开源的,因此原则上您可以了解它是如何工作的。顺便说一句。完整的odrpack文档可以在这里找到:嗨,我很久没有回来查看了。非常感谢您的评论。了解如何编写peak-o-mat脚本非常有帮助。那很方便。我遇到的一个问题是,上面的代码没有复制拟合选项(将拟合限制为可见范围,最大迭代次数)。如何设置该选项?刚刚找到。它不是一个布尔值,而是一个列表。要获得第一组的限制,请使用
    base.limits
    。要在安装之前将这些限制应用于所有其他集合,请在for循环内添加
    数据。_set_limits(base.limits)
    。要更改最大迭代次数,请使用
    f=Fit(data,data.mod,maxiter=200)
    (用于200次迭代)。
    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')