使用 python 将函数总和拟合到数据

Fitting a sum of functions to data with python

给定此类型的目标函数:

<a href="http://www.codecogs.com/eqnedit.php?latex=\dpi{200}&space;y^{(i)}&space;=&space;\sum_{j=1}^{N_1}&space;\sum_{k=1}^{N_2}&space;D_j*\left&space;[&space;[\exp(-a_{j}*x_{jk}^{(i)})-1&space;]^2&space;-&space;1&space;\right&space;]" target="_blank"><img src="http://latex.codecogs.com/gif.latex?\dpi{200}&space;y^{(i)}&space;=&space;\sum_{j=1}^{N_1}&space;\sum_{k=1}^{N_2}&space;D_j*\left&space;[&space;[\exp(-a_{j}*x_{jk}^{(i)})-1&space;]^2&space;-&space;1&space;\right&space;]" title="y^{(i)} = \sum_{j=1}^{N_1} \sum_{k=1}^{N_2} D_j*\left [ [\exp(-a_{j}*x_{jk}^{(i)})-1 ]^2 - 1 \right ]"
  /></a>

其中 D_ja_j 是参数,索引 j、k 的求和在数量上不固定(N_1N_2 可能会有所不同)。对于一组输入数据(xy)(x是一个二维矩阵),如何拟合涉及的参数使用numpy、scipy 或 lmfit-py (https://github.com/lmfit/lmfit-py/blob/master/doc/intro.rst)?

这里有一个相关的post,不过我的情况好像有点复杂。感谢您的任何评论!

我不确定你的公式是否足以给出完整的答案,但如果我理解正确,那么你会知道 N_1 在拟合之前,它将是一些有限的数字,你真的想要2*N_1 拟合参数。如果这是正确的,那么您要做的就是动态生成和使用 2*N_1 参数。为此,您可以像这样设置 objective 函数:

def objective(params, ydata, xdata, n_1):
    npts = len(ydata)
    ymodel = np.zeros(npts)
    for j in range(n_1):
        dj = params['d_%i' % (i+1)].value
        aj = params['a_%i' % (i+1)].value
        submodel = calc_model(dj, aj, xdata)
        ymodel += submodel

    return (ymodel - ydata)  

并构建参数和 运行 像这样的拟合:

 params = Parameters()
 for i in range(n_1):
     params.add('d_%i' % (i+1), value=1.0)  # set init values here
     params.add('a_%i' % (i+1), value=0.2)  # 

result = minimize(objective, params, args=(ydata, xdata, n_1))