我试图使用astropy.modeling软件包将高斯拟合到一组数据点,但我得到的只是一条平线。见下文:
这是我的密码:
%pylab inline
from astropy.modeling import models,fitting
from astropy import modeling
#Fitting a gaussian for the absorption lines
wavelength= linspace(galaxy1_wavelength_extracted_1.min(),galaxy1_wavelength_extracted_1.max(),200)
g_init = models.Gaussian1D(amplitude=1., mean=5000, stddev=1.)
fit_g = fitting.LevMarLSQFitter()
g = fit_g(g_init, galaxy1_wavelength_extracted_1, galaxy1_flux_extracted_1)
#Plotting
plot(galaxy1_wavelength_extracted_1,galaxy1_flux_extracted_1,".k")
plot(wavelength, g(wavelength))
xlabel("Wavelength ($\\AA$)")
ylabel("Flux (counts)")
我做错了什么或错过了什么
我制作了一些类似于您的虚假数据,并尝试在其上运行您的代码,获得了类似的结果。我认为问题在于,如果你不调整模型的初始参数,使其至少有点像原始模型,否则无论进行多少轮拟合,拟合者都无法收敛
如果我拟合一个高斯分布,我喜欢给初始模型一些初始参数,这些参数是基于计算上的“目测”它们,就像这样(这里我把你的真实数据的通量和波长分别命名为
orig_flux
和orig_wavelength
):其中,对于标准偏差,我使用了unbiased standard deviation estimate
在我的假数据上绘制此图表明,如果我手动查看数据,这些是我可能选择的合理值:
过去我想添加到
astropy.modeling
的一个特性是可选的方法,可以附加到一些模型上,根据一些数据对其参数进行合理的估计。所以对于高斯人来说,这样的方法会像我刚才计算的那样返回。但我不知道这是否已经实施过同样值得注意的是,你的高斯将被反转(振幅为负),它在通量轴上移动了大约120个点,因此我在我的模型中添加了一个^{} 来解释这一点,并从振幅中减去位移:
这将导致以下匹配,看起来已经好多了:
我不是建模或统计方面的专家,因此有更深入知识的人可能会在这方面有所改进。我添加了一个笔记本,上面有我对问题的完整分析,包括如何生成示例数据here
相关问题 更多 >
编程相关推荐