Я могу написать что-нибудь сам, найдя нулевые пересечения первой производной или что-то в этом роде, но это кажется достаточно распространенной функцией, которую можно включить в стандартные библиотеки. Кто-нибудь знает об этом?
Моим конкретным приложением является 2D-массив, но обычно он используется для поиска пиков в БПФ и т. Д.
В частности, в такого рода проблемах есть несколько сильных пиков, а затем множество более мелких «пиков», которые просто вызваны шумом, который следует игнорировать. Это всего лишь примеры; не мои фактические данные:
1-мерные пики:
2-мерные пики:
Алгоритм обнаружения пиков найдет расположение этих пиков (а не только их значения) и в идеале найдет истинный пик между выборками, а не только индекс с максимальным значением, возможно, с использованием квадратичной интерполяции или чего-то еще.
Обычно вас интересуют только несколько сильных пиков, поэтому они будут выбраны либо потому, что они превышают определенный порог, либо потому, что они являются первыми n пиками упорядоченного списка, ранжированного по амплитуде.
Как я уже сказал, я знаю, как написать что-то подобное сам. Я просто спрашиваю, есть ли уже существующая функция или пакет, которые хорошо работают.
Обновить:
Я перевел скрипт MATLAB, и он хорошо работает для 1-D случая, но может быть и лучше.
Обновленное обновление:
Sixtenbe создал лучшую версию для 1-D случая.
источник
find_peaks
, поэтому я добавил этот ответ, который может быть полезен для справок в будущем. (Я уверен, что вы уже нашли это с 2009 года, но это для других людей + меня, когда я снова задам себе этот вопрос через несколько лет!)Ответы:
Функция
scipy.signal.find_peaks
, как следует из названия, полезна для этого. Но важно , чтобы хорошо понять его параметрыwidth
,threshold
,distance
и , прежде всегоprominence
, чтобы получить хорошую добычу пика.Согласно моим тестам и документации, концепция значимости является «полезной концепцией» для сохранения хороших пиков и отбрасывания шумных пиков.
Что такое (топографическая) известность ? Это «минимальная высота, необходимая для спуска, чтобы добраться от вершины к любой более высокой местности» , как это можно увидеть здесь:
Идея заключается в следующем:
Тест:
Я специально использовал (зашумленную) частотно-изменяющуюся синусоиду, потому что она показывает много трудностей. Мы видим, что
width
параметр здесь не очень полезен, потому что если вы установитеwidth
слишком высокий минимум , он не сможет отслеживать очень близкие пики в высокочастотной части. Если вы установитеwidth
слишком низкое значение, в левой части сигнала будет много нежелательных пиков. Та же проблема сdistance
.threshold
сравнивается только с прямыми соседями, что здесь бесполезно.prominence
это то, что дает лучшее решение. Обратите внимание, что вы можете комбинировать многие из этих параметров!Код:
источник
Я смотрю на похожую проблему, и я обнаружил, что некоторые из лучших ссылок получены из химии (из пиков, найденных в данных массовых спектров). Для хорошего тщательного обзора алгоритмов поиска пиков прочитайте это . Это один из лучших и ясных обзоров методов поиска пиков, с которыми мне приходилось сталкиваться. (Вейвлеты являются лучшими для обнаружения пиков такого рода в шумных данных.).
Похоже, ваши пики четко определены и не скрыты в шуме. В таком случае я бы порекомендовал использовать плавные производные савтизки-Голея для нахождения пиков (если вы просто дифференцируете данные выше, у вас будет куча ложных срабатываний.). Это очень эффективный метод, и его довольно легко реализовать (вам нужен класс матрицы с основными операциями). Если вы просто найдете пересечение нуля первой производной SG, я думаю, вы будете счастливы.
источник
В scipy есть функция с именем,
scipy.signal.find_peaks_cwt
которая кажется подходящей для ваших нужд, однако у меня нет опыта работы с ней, поэтому я не могу рекомендовать ..http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks_cwt.html
источник
Для тех, кто не уверен, какие алгоритмы поиска пиков использовать в Python, здесь краткий обзор альтернатив: https://github.com/MonsieurV/py-findpeaks
Желая себе эквивалента
findpeaks
функции MatLab , я обнаружил, что функция detect_peaks от Marcos Duarte - хороший улов.Довольно прост в использовании:
Который даст вам:
источник
find_peaks
функция была добавлена вscipy
.Обнаружение пиков в спектре надежным способом было изучено довольно много, например, все работы по синусоидальному моделированию для музыкальных / аудиосигналов в 80-х годах. Поищите в литературе «Синусоидальное моделирование».
Если ваши сигналы такие же чистые, как в примере, простое «дайте мне что-нибудь с амплитудой, превышающей N соседей», должно работать достаточно хорошо. Если у вас есть зашумленные сигналы, простой, но эффективный способ - посмотреть на ваши пики во времени, чтобы отследить их: затем вы обнаруживаете спектральные линии вместо спектральных пиков. Итак, вы вычисляете БПФ на скользящем окне вашего сигнала, чтобы получить набор спектра во времени (также называемый спектрограммой). Затем вы смотрите на эволюцию спектрального пика во времени (т.е. в последовательных окнах).
источник
Я не думаю, что то, что вы ищете, предоставлено SciPy. Я бы написал код сам, в этой ситуации.
Сплайн-интерполяция и сглаживание из scipy.interpolate довольно хороши и могут быть весьма полезны для подгонки пиков и затем определения местоположения их максимума.
источник
Существуют стандартные статистические функции и методы для нахождения выбросов в данных, что, вероятно, то, что вам нужно в первом случае. Использование дериватов решит вашу вторую проблему. Однако я не уверен в методе, который решает как непрерывные функции, так и выборочные данные.
источник
Перво-наперво, определение «пик» является расплывчатым, если без дальнейших уточнений. Например, для следующих серий вы бы назвали 5-4-5 один пик или два?
1-2-1-2-1-1-5-4-5-1-1-5-1
В этом случае вам понадобятся как минимум два порога: 1) только верхний порог, который может регистрировать экстремальное значение в качестве пика; и 2) низкий порог, так что экстремальные значения, разделенные маленькими значениями ниже его, станут двумя пиками.
Обнаружение пиков является хорошо изученной темой в литературе по теории экстремальных значений, также известной как «декластеризация экстремальных значений». Его типичные приложения включают в себя определение опасных событий на основе непрерывного считывания переменных среды, например, анализа скорости ветра для обнаружения штормовых событий.
источник