Соответствующие пики в аналогичных спектрах в питоне - PullRequest
2 голосов
/ 17 мая 2019

У меня есть серия из многих тысяч (1D) спектров, соответствующих различным повторениям эксперимента.Для каждого повторения одни и те же данные записывались двумя разными инструментами - поэтому у меня есть два очень похожих спектра, каждый из которых состоит из нескольких сотен отдельных пиков / событий.Приборы имеют разное разрешение, точность и вероятную эффективность детектирования, поэтому каждая пара спектров не идентична, но похожа - при внимательном взгляде на них можно уверенно сопоставить множество пиков в каждом спектре.Я хочу иметь возможность автоматически и надежно сопоставлять два спектра для каждой пары спектров, т.е. уверенно говорить, какой пик соответствует какому.Это, вероятно, потребует «выбрасывания» некоторых данных, которые не могут быть сопоставлены с уверенностью (например, только один из двух инструментов обнаруживает событие).

Я прикрепил изображение того, как эти данные выглядят надВесь спектр и увеличен в сравнительно редкой области.Красные спектры, по существу, уже были обнаружены в пике, так что он равен 0 везде, где нет реального события.Я использовал scipy.signal.find_peaks () на синем графике и нанес на график найденные пики, которые, кажется, хорошо работают.

Теперь мне просто нужно найти надежный метод для сопоставления пиков между спектрами.Я попытался сопоставить пики, просто связав пики, которые находятся ближе всего друг к другу - однако это сталкивается со значительными проблемами из-за того, что некоторые пики отсутствуют в обоих спектрах.Я мог бы добавить ограничения относительно того, насколько близкие пики должны быть сопоставлены, но я думаю, что, возможно, есть более эффективные пути.Есть также проблемы, связанные с тем, что красный след имеет более низкое разрешение, чем синий.Я ожидаю, что есть алгоритмы поиска паттернов / пакеты python, которые лучше всего подходят для этого - но это далеко от моей области знаний, поэтому я не знаю, с чего начать.Заранее спасибо.

Увеличение относительно резервной области примера пары спектров: enter image description here

Целая пара примеров спектра, показывающая некоторые очень плотные области:enter image description here

Пример кода для генерации для построения спектров:

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()

1 Ответ

2 голосов
/ 17 мая 2019

Перспектива глубокого обучения: вы можете обучить пару нейронных сетей, используя потерю цикла - отображение от сигнала A к сигналу B, и обратно должно привести вас к начальной точке вашего сигнала.

Хорошим началом было бы прочитать о CycleGAN , который использует это для изменения стиля изображений.

По общему признанию, это будет небольшой исследовательский проект, и может потребоваться некоторое время, пока он будет работать надежно.

...