You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:15:03