在Python中匹配相似光谱中的峰

问题描述 投票:0回答:1

我有一系列数千个(一维)光谱,对应于不同的实验重复。对于每次重复,相同的数据都由两个不同的仪器记录 - 所以我有两个非常相似的光谱,每个光谱由数百个单独的峰值/事件组成。这些仪器具有不同的分辨率、精度和可能的检测效率,因此每对光谱不相同但相似——用眼睛仔细观察它们可以自信地匹配每个光谱中的许多峰。我希望能够自动且可靠地匹配每对光谱的两个光谱,即自信地说哪个峰对应哪个峰。这可能会涉及“丢弃”一些无法可靠匹配的数据(例如,两个仪器中只有一个检测到事件)。

我附上了整个光谱的数据图像,并放大到相对稀疏的区域。红色光谱基本上已经找到了峰值,因此除了真实事件所在的地方之外,它在任何地方都是 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()
python pattern-matching
1个回答
2
投票

深度学习视角:您可以使用循环损失训练一对神经网络 - 从信号 A 映射到信号 B,然后再次映射到信号的初始点。

好的开始是阅读CycleGAN,它使用它来改变图像的风格。

诚然,这将是一个研究项目,可能需要一些时间才能稳健地发挥作用。

© www.soinside.com 2019 - 2024. All rights reserved.