Python光谱Double Gaussian拟合输出为直线的问题排查
双高斯拟合得到直线问题排查
错误原因
- 拟合目标和模型完全不匹配:你的需求是对真实光谱数据做双高斯拟合,但代码存在两个核心逻辑错误:一是传入拟合器的是单高斯模型
Gaussian1D,不是你构造的双高斯组合模型;二是拟合的输入数据是你自己生成的模拟双高斯信号g1,不是读取的真实光谱数据y。 - 初始参数和实际数据范围严重偏离:从绘图的x轴范围6500~6600可知,你的光谱波长为数千量级,但你设置的高斯均值初始值为0.97、0.98、0,和实际峰值波长差了4个数量级,优化器无法定位到正确的峰值位置,最终收敛到振幅接近0的平坦直线,也就是你看到的拟合结果。
- 标准差初始值设置不符合数据特征:你的x轴展示区间仅为100,初始标准差设置为1,如果实际光谱峰宽和该值偏差过大,也会导致拟合收敛失败。
修正代码示例
import numpy as np from astropy.modeling import models, fitting import matplotlib.pyplot as plt # 读取光谱数据 data=np.genfromtxt('74.r_e_20100124_3_1_1_2_one.fits.0001_corr_scopy.0001_spyk_cont.txt') x = data[:, 0] y = data[:, 1] # 自动估算初始参数,避免手动设置和实际范围偏离 peak_idx = np.argmax(y) init_amp = y[peak_idx] init_mean = x[peak_idx] # 按两个邻近高斯峰设置初始参数,可根据实际光谱特征调整差值 gaussian_1 = models.Gaussian1D(amplitude=init_amp*0.6, mean=init_mean-2, stddev=2.) gaussian_2 = models.Gaussian1D(amplitude=init_amp*0.4, mean=init_mean+2, stddev=2.) combined_gaussians = gaussian_1 + gaussian_2 # 执行拟合,传入双高斯模型和真实光谱数据 fitter = fitting.LevMarLSQFitter() model = fitter(combined_gaussians, x, y) print('Fitted parameters:', model.parameters) # 绘图展示结果 plt.xlim(6500, 6600) plt.plot(x, y, color='b', label='原始光谱数据') plt.plot(x, model(x), color='r', label='双高斯拟合结果') plt.legend(loc=2) plt.savefig('double_gaussian_fit.png')
原错误拟合结果

内容的提问来源于stack exchange,提问作者Thuto
相关产品推荐
相关产品推荐

