根据MINUIT参数进行Python变换

2024-06-11 09:39:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个基于scipy的二维数据的自动曲线拟合程序优化.leatsq,而且有效。但是,当添加许多曲线时,其起始值很小,我会得到非物理结果(例如,负振幅)。在

我发现了这篇文章Scipy: bounds for fitting parameter(s) when using optimize.leastsq,并试图根据Cern的Minuit使用参数转换。在上面提到的问题中,有人提供了一些python代码的链接。在

code.google.com/p/nmrglue/source/browse/trunk/nmrglue/analysis/leastsqbound.py

我写了这个最小的工作示例(扩展代码)

^{pr2}$

这是绘图输出,其中绿色为起始条件,红色为拟合结果: plot results

这是正确的用法吗?External2internal转换只是在边界外抛出一个nan。莱斯特斯克似乎能处理好这件事?在

我上传了配件数据here。只需粘贴到名为约束.dat. 在


Tags: 数据代码程序物理scipy曲线bounds我会
3条回答

试试lmfit py-https://github.com/newville/lmfit-py

  1. 它还使用了Levenberg-Marquardt(LM)算法scipy.optimize.leatsq. 不确定是可以的。

  2. 它不仅允许您用边界约束拟合参数,还可以用它们之间的数学表达式约束拟合参数,而无需修改拟合函数。

  3. 忘了用那些糟糕的p[0],p[1]。。。在拟合函数中。只需通过parameters类使用拟合参数的名称。

在sega_-sai的回答之后,我使用mpfit.py在

import matplotlib.pyplot as plt
from mpfit import mpfit
import numpy as np

def _evaluate(p, x):
    '''
    Linear plus Lorentzian curve
    p = list with three parameters ([a, b, I, Pos, FWHM])
    '''
    return p[0] + p[1] * x + p[2] / (1 + np.power((x - p[3]) / (p[4] / 2), 2))

def residuals(p, fjac = None, x = None, y = None, err = None):
    status = 0
    error = _evaluate(p, x) - y
    return [status, error / err]

if __name__ == '__main__':
    data = np.loadtxt('constraint.dat') # read data
    x = data[:, 0]
    y = data[:, 1]
    err = 0 * np.ones(y.shape, dtype = 'float64')
    parinfo = [{'value':5000., 'fixed':0, 'limited':[0, 0], 'limits':[0., 0.], 'parname':'a'},
               {'value':0., 'fixed':0, 'limited':[0, 0], 'limits':[0., 0.], 'parname':'b'},
               {'value':500., 'fixed':0, 'limited':[0, 0], 'limits':[0., 0.], 'parname':'I'},
               {'value':2450., 'fixed':0, 'limited':[0, 0], 'limits':[0., 0.], 'parname':'Pos'},
               {'value':3., 'fixed':0, 'limited':[0, 0], 'limits':[0., 0.], 'parname':'FWHM'}]
    fa = {'x':x, 'y':y, 'err':err}
    m = mpfit(residuals, parinfo = parinfo, functkw = fa)
    print m

拟合结果如下:

^{pr2}$

所以结论是:两种方法都有效,都允许约束。但由于mpfit来自一个非常成熟的来源,我更相信它。如果可能的话,它也支持错误值。在

目前已有一种流行的受限Lev-Mar码

http://adsabs.harvard.edu/abs/2009ASPC..411..251M

用python实现

http://code.google.com/p/astrolibpy/source/browse/mpfit/mpfit.py

我建议不要重新发明轮子。在

相关问题 更多 >