Рубрики
Без рубрики

Python Scipy Signal.find_peaks () – полезное руководство

В этой статье рассматривается анализ и обработка сигналов, более конкретно на том, как идентифицировать и рассчитать пики, содержащиеся в данном сигнале. Мотивация, способная идентифицировать и, следовательно, работать с пиками сигнала, имеет фундаментальное значение во многих различных областях, от электроники для науки и экономики данных. … Python Scipy Signal.find_peaks () – полезное руководство Подробнее »

Автор оригинала: Andrea Ridolfi.

В этой статье рассматривается анализ и обработка сигналов, более конкретно на том, как идентифицировать и рассчитать пики, содержащиеся в данном сигнале.

Мотивация

Возможность выявления и, следовательно, работа с пиками сигнала имеет основополагающее значение во многих различных областях, от электроники для науки и экономики данных.

Когда мы говорим о Пики Мы не просто имеем в виду пики электрического сигнала, даже Maxima или Minima в оформлении Математическая функция рассматриваются как пики. Имея это в виду, мы все знаем важность иметь Быстрый и надежный метод, который может позволить нам определить положение и значение максимумов и минимумов в функции; Это просто для решения математических упражнений или для прогнозирования тенденции экономики, количество приложений огромно.

Код примера пика нахождения и построения

Мы здесь эксплуатируем функцию .find_peaks. () от Scipy.singnal Библиотека для обработки определенного сигнала/функции и извлечь положение и интенсивность нескольких пиков.

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks

#defining the x and y arrays
x = np.linspace(0,10, 100)
y = x*np.random.randn(100)**2

#Find peaks
peaks = find_peaks(y, height = 1, threshold = 1, distance = 1)
height = peaks[1]['peak_heights'] #list of the heights of the peaks
peak_pos = x[peaks[0]] #list of the peaks positions

#Finding the minima
y2 = y*-1
minima = find_peaks(y2)
min_pos = x[minima[0]] #list of the minima positions
min_height = y2[minima[0]] #list of the mirrored minima heights

#Plotting
fig = plt.figure()
ax = fig.subplots()
ax.plot(x,y)
ax.scatter(peak_pos, height, color = 'r', s = 15, marker = 'D', label = 'Maxima')
ax.scatter(min_pos, min_height*-1, color = 'gold', s = 15, marker = 'X', label = 'Minima')
ax.legend()
ax.grid()
plt.show()

Давайте погрузимся в этот код пошаговый!

Импорт необходимых библиотек Python

Давайте начнем наш скрипт, импортируя библиотеки Python, которые затем будут использоваться в сценарии.

import numpy as np
from scipy.signal import find_peaks
import matplotlib.pyplot as plt 

Создание функции с вершинами

Первое, что нам нужно сделать, это создать функцию, которая должна представлять некоторые пики.

Это означает создание массивов «X» и «Y», которые затем будут обработаны и построены в нашем скрипте.

  • Мы начинаем с помощью .linspace () Функция из Numpy, чтобы определить х Массив, мы называем это «X»; Он состоит из массива 100 одинаково расположенных номеров.
  • Генерировать y Массив, мы используем функцию .randn () от Случайные Пакет (от Numpy), который возвращает образец из стандартного распределения (см. Дополнительную документацию здесь: https://numpy.org/devdocs/reference/random/generated/numpy.random.randn.html ), Мы просто должны указывать как входной параметр, размер сгенерированного массива в этом случае мы должны соответствовать длине массива X, так что 100.

Затем мы немного модифицируем этот массив, добрав его элементы и умножая их для соответствующих элементов массива «X». Следующие строки кода описывают то, что было объяснено до сих пор.

#x and y arrays
x = np.linspace(0, 10, 100)
y = x*np.random.randn(100)**2

Нахождение пиков функции

После определения х и y Массивы, следующий шаг – идентифицировать позиции пиков и их значение.

Для этого мы эксплуатируем функцию .find_peaks. () , который принадлежит к пакету .signal Из библиотеки Scipy (Дополнительная документация можно найти здесь: https://docs.cscipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks.html ). Единственным обязательным входом для этой функции является сигнал, который мы заинтересованы. Однако функция функционирует много интересных вариантов, которые могут помочь нам уточнить нашу задачу обработки:

  • Высота : Это может быть число или массив, и он используется для указания минимальной высоты, которую должен иметь пик, чтобы быть идентифицированным;
  • Порог : это требуемое вертикальное расстояние между пиком и его соседним, очень полезным в случае шумных функций, где мы хотим, чтобы не выбрать пики от шума;
  • Расстояние : это требуемое минимальное горизонтальное расстояние между соседними пиками; Это может быть действительно полезно в случаях, когда у нас есть некоторые знания о периодичности пиков.

Тогда есть многие другие варианты, которые мы можем использовать, например, для указания минимальной ширины пиков и т. Д.

Вывод .find_peaks. () Функция – это массив, который содержит индексы каждого пика, который был идентифицирован. Он может вернуть также другую информацию, в том случае, если мы ранее указали некоторые варианты, такие как «высота» или «порог» или «порог» в момент вызова.

В этом случае функция возвращает массив массивов, первая подрагригация по-прежнему содержит индексы пиков, остальные могут представить высоты найденных пиков или их левых и правых порогов (и все остальные информации, которые были ранее указаны как Дополнительный вход во время вызова функции), как словарь.

После этого краткого объяснения давайте посмотрим в следующих строках кода, как вызывать функцию и, таким образом, найти пики.

#Find peaks
peaks = find_peaks(y, height = 1, threshold = 1, distance = 1)
height = peaks[1]['peak_heights'] #list containing the height of the peaks
peak_pos = x[peaks[0]]   #list containing the positions of the peaks  

Как видно в строках кода выше, мы дали в качестве ввода массива «y», а затем мы указали некоторые другие необязательные параметры (я устанавливаю их все равно 1, так как я не знал, что был аспект моей функции; я только Знал, что все номера были положительными, поскольку функция в квадрате в квадрате).

Поскольку мы указали дополнительные параметры «Высота», вывод функции («пики»), состоит из массива, первый элемент представляет собой подпульдую, содержащую положения пиков, вторая подставка – это словарь, который содержит всю информацию Указано в необязательных входных параметрах, указанных в момент вызова.

Мы можем использовать эту мощную функцию для извлечения высоты пиков; Единственное, что нужно сделать, это определить массив, «высота», которая будет равна массиве, содержащему в словаре клавиши «Peak_Heights».

Затем мы можем создать массив, содержащий положения пиков вдоль массива X, используя первую подложку массива «пики», то есть пики [0] И используйте его как индекс нашего массива «X». Таким образом, мы можем хранить в массиве под названием «Peak_Pos», просто позиции точек вдоль массива «X», соответствующие вершинам. Массивы «Высота» и «Peak_Pos» – это те, которые будут использоваться для построения пиков на начальную функцию.

А как насчет минимумов?

До сих пор мы видели, как определить позицию и рассчитать высоту наших пиков. Для некоторого применения нас могут быть заинтересованы в анализе также минимальных (или в корму) наших сигналов. Следующие строки продемонстрируют простую стратегию для достижения этой задачи.

Функция .find_peaks. () только может заметить и проанализировать пики функции; Чтобы решить эту проблему, у нас есть «чтобы обмануть» функцию, изменив входной сигнал.

Один практический способ сделать это – это отразить наш сигнал; Если мы отражаем функцию по поводу горизонтальной оси, точки, которые соответствующие его минимумам, будут затем преобразованы в новые максимумы или пики.

После этого мы можем просто повторить процедуру, объясненную в предыдущем абзаце. Чтобы отразить функцию, мы можем просто умножить массив «Y» на -1 и хранить его значение в новом массиве, называемом «Y2». На этот раз при вызове функции .find_peaks. () Мы не укажем опцию «Высота», поскольку высота этих пиков может соответствовать отрицательным числам (в принципе мы не уверены, как будет выглядеть зеркальные минимумы). Мы можем оставить все другие дополнительные параметры, если мы хотим уточнить анализ (я оставил их всех равных 1).

#Find minima
y2 = y*-1
minima = find_peaks(y2, threshold = 1, distance = 1)
min_pos = x[minima[0]]   #list containing the positions of the minima
min_height = y2[minima[0]]   #list containing the height of the minima

Как видите, на этот раз для получения высоты минимумов мы только что проиндексировали массив «y2» с массивом, содержащим индексы пиков (реальные зеркальные минимумы оригинальной функции «y») и сохраняют их в Массив “min_height”. На данный момент у нас также есть информация о минимумах оригинальной функции, нам просто нужно помнить, чтобы снова отображать их в момент заговор их ценности.

Построение пиков

Чтобы увидеть результат нашего пикового анализа, мы сейчас говорим оригинальную функцию, пики и минимумы. Функция нанесена в виде непрерывной линии, в то время как пики и минимумы в качестве единых точек (отсюда и рассеяние). Maxima/Peaks будут нанесены красным, используя алмаз в качестве маркера; С другой стороны, минимумы построены в желтом, с крестом. Мы закончим наш участок, добавив легенду и сетку. Следующие строки кода описывают только что объясненную процедуру.

#Plotting the function + peaks and minima
fig = plt.figure()
ax = fig.subplots()
ax.plot(x,y)
ax.scatter(peak_pos, height, color = 'r', s = 10, marker = 'D', label = 'maxima')
ax.scatter(min_pos, min_height*-1, color = 'gold', s = 10, marker = 'X', label = 'minima')
ax.legend()
ax.grid()
plt.show()

Окончательный результат вместо этого отображается на рисунке 1.

Рисунок 1: Первоначальная функция (синяя кривая) с идентифицированными пиками (максимумы, красные бриллианты) и минимумы (желтые кресты).

Как видно из рисунка 1, мы успешно определили большинство максимумов/пиков и минимумы исходной функции. Некоторые незначительные вершины не были приняты во внимание в анализе; Если бы мы также были заинтересованы в тех, что мы должны настроить необязательные параметры, такие как порог, и высота, и повторяется несколько раз, одна и та же процедура.

Оригинал: “https://blog.finxter.com/python-scipy-signal-find_peaks/”