带数据间隙的反射光谱高斯拟合问题及优化需求
反射光谱吸收带高斯拟合需求与问题
我需要对反射光谱的吸收带进行高斯拟合,但目标光谱段的0.85μm至1.3μm区间存在数据间隙,当前拟合结果在该区域效果不佳。拟合完成后,还需计算半高全宽(FWHM)和高斯曲线覆盖面积等光谱参数。
要求方案能生成平滑的高斯拟合曲线,且具备通用性,可适配大规模数据集的批量循环处理。
经初步调整(将常规高斯拟合改为减式拟合)后,拟合效果有所改善,但仍存在右侧超出y=1的异常情况,推测问题源于数据本身,现将相关代码整理如下:
当前高斯拟合函数代码
def gauss(x, H, A, x0, sigma): return H + A * np.exp(-(x - x0) ** 2 / (2 * sigma ** 2)) def gauss_fit(x, y): mean = sum(x * y) / sum(y) sigma = np.sqrt(sum(y * (x - mean) ** 2) / sum(y)) popt, pcov = scipy.optimize.curve_fit(gauss, x, y, p0=[min(y), max(y), mean, sigma]) return popt
拟合应用及绘图代码
H, A, x0, sigma = gauss_fit(x, y)
plt.plot(x, y, '.k', label='data') plt.plot(x, gauss(x, *gauss_fit(x, y)), '-r', label='fit') plt.xlabel('Wavelength (µm)') plt.ylabel('Reflectance') plt.legend()
数据处理与采样代码
# df_merged 是目标DataFrame的名称 R0700=FindNearest(df_merged.at[0,'Wavelength'], df_merged.at[0,'Reflectance Normalized'], 0.7, show=True) R1800=FindNearest(df_merged.at[0,'Wavelength'], df_merged.at[0,'Reflectance Normalized'], 1.8, show=True) x=df_merged.at[0,'Wavelength'][R0700[1]:R1800[1]] y=df_merged.at[0,'Reflectance Normalized'][R0700[1]:R1800[1]]
def FindNearest(wl, rf, x, show=False): # wl = 波长数组 ; rf = 反射率数组 ; x = 目标查找值 wl_dif=np.abs(wl-x) idx=np.argmin(wl_dif) # 获取反射率和波长对应值 wl_x=wl[idx] rf_x=rf[idx] if show: print("最近波长 :", wl_x, ", 索引 :", idx, ", 对应反射率 :", rf_x) # 返回值说明 : [0] = 最近匹配的波长值, [1] = 匹配值在数组中的位置 # (反射率与波长度组长度一致,位置通用), [2] = 匹配到的反射率值 return(wl_x, idx, rf_x)
内容的提问来源于stack exchange,提问作者Victor T
相关产品推荐
相关产品推荐

