【发布时间】:2019-10-04 20:32:48
【问题描述】:
我有一系列数千个 (1D) 光谱,对应于实验的不同重复。对于每次重复,两个不同的仪器记录了相同的数据——所以我有两个非常相似的光谱,每个光谱都由几百个单独的峰/事件组成。这些仪器具有不同的分辨率、精度和可能的检测效率,因此每对光谱不相同但相似 - 用肉眼仔细观察它们可以自信地匹配每个光谱中的许多峰。我希望能够自动且可靠地匹配每对光谱的两个光谱,即自信地说出哪个峰对应于哪个峰。这可能会涉及“丢弃”一些无法可靠匹配的数据(例如,两种仪器中只有一种检测到事件)。
我附上了一张关于整个光谱数据的图像,并放大到一个相对稀疏的区域。红色光谱基本上已经找到峰值,因此除了真实事件所在的位置之外,它在任何地方都是 0。我在蓝色轨迹上使用了 scipy.signal.find_peaks() 并绘制了找到的峰值,这似乎效果很好。
现在我只需要找到一种可靠的方法来匹配光谱之间的峰值。我已经尝试通过仅将彼此最接近的峰配对来匹配峰 - 但是由于两个光谱中都不存在某些峰,这会遇到重大问题。我可以添加关于必须匹配多近峰的限制,但我认为可能有更好的方法。红色轨迹的分辨率低于蓝色轨迹也会产生问题。我希望那里有最适合这个的模式查找算法/python 包 - 但这远离我的专业领域,所以我真的不知道从哪里开始。提前致谢。
生成用于绘制光谱的示例代码:
from scipy.signal import find_peaks
for i in range(0, 10):
spectra1 = spectra1_list[i]
spectra2 = spectra2_list[i]
fig, ax1 = plt.subplots(1, 1,figsize=(12, 8))
peaks, properties = scipy.signal.find_peaks(shot_ADC, height=(6,None), threshold=(None,None), distance=2, prominence = (5, None))
plt.plot(spectra1)
plt.plot(spectra2_axis, spectra2, color='red')
plt.plot(peaks, spectra1[peaks], "x")
plt.show()
【问题讨论】:
-
This paper 可能感兴趣。
标签: python pattern-matching spectral