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