使用 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_j
和 a_j
是参数,索引 j、k 的求和在数量上不固定(N_1
和 N_2
可能会有所不同)。对于一组输入数据(x,y
)(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))
给定此类型的目标函数:
<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_j
和 a_j
是参数,索引 j、k 的求和在数量上不固定(N_1
和 N_2
可能会有所不同)。对于一组输入数据(x,y
)(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))