我有一个由100x100个数据点组成的数组,我试图对数组中每列的100个值执行高斯拟合。然后,我希望通过使用第一列的拟合找到的高斯参数作为下一列要使用的起始点的初始参数。假设我从初始参数1000、0和1开始,拟合得到值800、3和1.5。然后,我希望fitter使用这三个参数作为下一列的初始值。
我的代码是:
x = np.linspace(-50,50,100)
Gauss_Model = models.Gaussian1D(amplitude = 1000., mean = 0, stddev = 1.)
Fitting_Model = fitting.LevMarLSQFitter()
Fit_Data = []
for i in range(0, Data_Array.shape[0]):
Fit_Data.append(Fitting_Model(Gauss_Model, x, Data_Array[:,i]))
现在,它对每个拟合都使用相同的初始值。有谁知道如何对高斯拟合方法执行这样的运行中位数/均值?非常感谢任何人的帮助或指引,谢谢!
发布于 2018-06-13 08:46:15
我也不知道你使用的是什么库,如何做到这一点的细节可能取决于该库如何存储拟合值的细节。我可以说,对于lmfit (https://lmfit.github.io/lmfit-py/),我们在这种用法上遇到了困难,最终得到了一种设计,它让你想做的事情变得非常容易。使用lmfit,你可以把这个问题写成:
import numpy as np
from lmfit import GaussianModel
x = np.linspace(-50,50,100)
# get Data_Array from somewhere....
# create a model for a Gaussian
Gauss_Model = GaussianModel()
# make a set of parameters, setting initial values
params = Gauss_Model.make_params(amplitude=1000, center=0, sigma=1.0)
Fit_Results = []
for i in range(Data_Array.shape[1]):
result = Gauss_Model.fit(Data_Array[:, i], params, x=x)
Fit_Results.append(result)
# update `params` with the current best fit params for the next column
params = result.params
请注意,这之所以有效,是因为result.params
小心地确保Model.fit()
不会改变输入参数,并将每个fit的最佳拟合参数放入lmfit。
如果您决定让所有列都使用原始初始值,只需注释掉最后一个params = result.params
即可。
Lmfit有很多花哨的东西,但我希望它能帮助你做你需要的事情。
https://stackoverflow.com/questions/50825618
复制相似问题