Обновление: самый эффективный алгоритм на данный момент это .
В этом вопросе рассматриваются надежные алгоритмы обнаружения внезапных пиков в данных временных рядов в реальном времени.
Рассмотрим следующий набор данных:
p = [1 1 1.1 1 0.9 1 1 1.1 1 0.9 1 1.1 1 1 0.9 1 1 1.1 1 1 1 1 1.1 0.9 1 1.1 1 1 0.9 1, ...
1.1 1 1 1.1 1 0.8 0.9 1 1.2 0.9 1 1 1.1 1.2 1 1.5 1 3 2 5 3 2 1 1 1 0.9 1 1 3, ...
2.6 4 3 3.2 2 1 1 0.8 4 4 2 2.5 1 1 1];
(Формат Matlab, но дело не в языке, а в алгоритме)
Вы можете ясно видеть, что есть три больших пика и несколько маленьких пиков. Этот набор данных является конкретным примером класса наборов временных рядов, о котором идет речь. Этот класс наборов данных имеет две общие особенности:
- Есть основной шум с общим средним
- Существуют большие « пики » или « более высокие точки данных », которые значительно отклоняются от шума.
Давайте также предположим следующее:
- ширина пиков не может быть определена заранее
- высота пиков четко и значительно отклоняется от других значений
- используемый алгоритм должен вычислять в реальном времени (поэтому меняйте с каждым новым назначением данных)
Для такой ситуации необходимо построить граничное значение, которое запускает сигналы. Однако граничное значение не может быть статическим и должно определяться в реальном времени на основе алгоритма.
Мой вопрос: что такое хороший алгоритм для расчета таких порогов в реальном времени? Существуют ли конкретные алгоритмы для таких ситуаций? Каковы наиболее известные алгоритмы?
Надежные алгоритмы или полезные идеи высоко ценятся. (могу ответить на любом языке: речь идет об алгоритме)
Ответы:
Надежный алгоритм обнаружения пиков (с использованием z-показателей)
Я придумал алгоритм, который очень хорошо работает для этих типов наборов данных. Он основан на принципе дисперсии : если новая точка данных представляет собой заданное число стандартных отклонений от некоторого скользящего среднего, алгоритм подает сигнал (также называемый z-счетом). ). Алгоритм очень надежен, потому что он строит отдельное скользящее среднее и отклонение, так что сигналы не нарушают порог. Поэтому будущие сигналы идентифицируются примерно с одинаковой точностью, независимо от количества предыдущих сигналов. Алгоритм принимает 3 вход:
lag = the lag of the moving window
,threshold = the z-score at which the algorithm signals
иinfluence = the influence (between 0 and 1) of new signals on the mean and standard deviation
. Например, alag
из 5 будет использовать последние 5 наблюдений для сглаживания данных.threshold
3,5 будет сигнализировать, если точка данных составляет 3,5 стандартных отклонения от скользящего среднего. Иinfluence
0,5 дает сигналы половину влияния, которое имеют нормальные точки данных. Аналогично, значениеinfluence
0 полностью игнорирует сигналы для пересчета нового порога. Поэтому влияние 0 является наиболее надежным вариантом (но предполагает стационарность ); установка параметра влияния на 1 наименее устойчива. Поэтому для нестационарных данных параметр влияния должен находиться где-то между 0 и 1.Это работает следующим образом:
ПСЕВДОКОД
Эмпирические правила для выбора хороших параметров для ваших данных можно найти ниже.
демонстрация
Код Matlab для этой демонстрации можно найти здесь . Чтобы использовать демо, просто запустите его и создайте временной ряд самостоятельно, нажав на верхнюю диаграмму. Алгоритм начинает работать после нанесения
lag
числа наблюдений.результат
Для исходного вопроса этот алгоритм даст следующий вывод при использовании следующих настроек
lag = 30, threshold = 5, influence = 0
:Реализации на разных языках программирования:
Матлаб (я)
R (я)
Golang (Xeoncross)
Питон (Р. Киселев)
Python [эффективная версия] (delica)
Свифт (я)
Groovy (JoshuaCWebDeveloper)
C ++ (бред)
C ++ (Анимеш Пандей)
Ржавчина (swizard)
Скала (Майк Робертс)
Котлин (леодерпрофи)
Рубин (Киммо Лехто)
Фортран [для обнаружения резонанса] (THo)
Джулия (Мэтт Кэмп)
C # (Ocean Airdrop)
C (DavidC)
Ява (takanuva15)
JavaScript (Дирк Люсебринк)
TypeScript (Джерри Гэмбл)
Perl (Ален)
PHP (Radhoo)
Практические правила для настройки алгоритма
lag
: параметр задержки определяет, насколько ваши данные будут сглажены и насколько адаптивен алгоритм к изменениям долгосрочного среднего значения данных. Чем более постоянны ваши данные, тем больше задержек вы должны включить (это должно повысить надежность алгоритма). Если ваши данные содержат изменяющиеся во времени тренды, вы должны подумать о том, как быстро вы хотите, чтобы алгоритм адаптировался к этим тенденциям. То есть, если вы установитеlag
10, потребуется 10 «периодов», прежде чем порог алгоритма будет скорректирован на любые систематические изменения долгосрочного среднего. Так что выбирайтеlag
параметр на основе трендового поведения ваших данных и того, насколько адаптивным вы хотите, чтобы алгоритм был.influence
: этот параметр определяет влияние сигналов на порог обнаружения алгоритма. Если задано значение 0, сигналы не влияют на порог, так что будущие сигналы обнаруживаются на основе порога, который рассчитывается со средним и стандартным отклонением, на которое не влияют предыдущие сигналы. Еще один способ думать об этом состоит в том, что если вы установите влияние на 0, вы неявно предполагаете стационарность (т.е. независимо от того, сколько существует сигналов, временной ряд всегда возвращается к одному и тому же среднему значению в долгосрочной перспективе). Если это не так, вы должны поместить параметр влияния где-то между 0 и 1, в зависимости от степени, в которой сигналы могут систематически влиять на изменяющийся во времени тренд данных. Например, если сигналы приводят к структурному разрыву из долгосрочного среднего значения временного ряда параметр влияния должен быть высоким (близким к 1), чтобы порог мог быстро адаптироваться к этим изменениям.threshold
: пороговый параметр - это число стандартных отклонений от скользящего среднего, выше которого алгоритм классифицирует новый пункт данных как сигнал. Например, если новая точка данных на 4,0 стандартных отклонения выше скользящего среднего, а пороговый параметр установлен на 3,5, алгоритм будет идентифицировать точку данных как сигнал. Этот параметр должен быть установлен в зависимости от того, сколько сигналов вы ожидаете. Например, если ваши данные нормально распределены, пороговое значение (или: z-оценка), равное 3,5, соответствует вероятности передачи сигналов 0,00047 (из этой таблицы), что означает, что вы ожидаете сигнал один раз каждые 2128 точек данных (1 / 0,00047). Таким образом, пороговое значение напрямую влияет на то, насколько чувствителен алгоритм и, следовательно, также на частоту сигналов алгоритма. Изучите свои собственные данные и определите разумный порог, который подает сигнал алгоритму, когда вы этого хотите (здесь могут потребоваться пробные и ошибочные методы, чтобы получить хороший порог для ваших целей).ВНИМАНИЕ: Приведенный выше код всегда перебирает все точки данных при каждом запуске. При реализации этого кода не забудьте разделить вычисление сигнала на отдельную функцию (без цикла). Затем , когда новый DataPoint прибывает, обновление
filteredY
,avgFilter
иstdFilter
один раз. Не пересчитывайте сигналы для всех данных каждый раз, когда появляется новый пункт данных (как в примере выше), который будет крайне неэффективным и медленным!Другие способы изменить алгоритм (для потенциальных улучшений):
influence
параметр для среднего и стандартного ( как в этом переводе Swift )(Известные) академические ссылки на этот ответ StackOverflow:
Инь, C. (2020). Динуклеотидные повторы в геноме коронавируса SARS-CoV-2: эволюционные последствия . Электронная печать ArXiv, доступная по адресу : https://arxiv.org/pdf/2006.00280.pdf
Esnaola-Gonzalez, I., Gómez-Omella, M., Ferreiro, S., Fernandez, I., Lázaro, I. & García, E. (2020). Платформа IoT к расширению цепей птицеводства . Датчики, 20 (6), 1549.
Gao S. & Calderon, DP (2020). Непрерывные схемы кортико-моторной интеграции калибруют уровни возбуждения во время выхода из наркоза . bioRxiv.
Клауд Б., Тариен Б., Лю А., Шедд Т., Лин Х., Хаббард М., ... и Мур Дж. К. (2019). Адаптивный сенсорный синтез на базе смартфона для оценки конкурентных кинематических показателей гребли . Заговоры один, 14 (12).
Ceyssens, F., Carmona, MB, Kil, D., Deprez, M., Tooten, E., Nuttin, B., ... & Puers, R. (2019). Хроническая нейронная запись с помощью зондов субклеточного сечения с использованием растворяющих микроиглы 0,06 мм² в качестве устройства для введения . Датчики и исполнительные механизмы B: Химическая , 284, с. 369-376.
Dons E., Laeremans M., Orjuela JP, Avila-Palencia I., de Nazelle A., Nieuwenhuijsen M., ... & Nawrot T. (2019). Транспорт с наибольшей вероятностью может вызвать пиковое воздействие загрязнения воздуха в повседневной жизни: данные более 2000 дней личного мониторинга . Атмосферная среда , 213, 424-432.
Schaible BJ, Snook KR, Yin J., et al. (2019). Беседы в Твиттере и сообщения английских СМИ о полиомиелите в пяти разных странах с января 2014 года по апрель 2015 года . Журнал "Перманенте" , 23, 18-181.
Лима, Б. (2019). Исследование поверхности объекта с помощью тактильного робота-пальца (докторская диссертация, Университет Оттавы / Университет Оттавы).
Lima, BMR, Ramos, LCS, de Oliveira, TEA, da Fonseca, VP, & Petriu, EM (2019). Определение частоты пульса с использованием мультимодального тактильного датчика и алгоритма обнаружения пиков на основе Z-показателя . CMBES Proceedings , 42.
Lima, BMR, de Oliveira, TEA, da Fonseca, VP, Zhu, Q., Goubran, M., Groza, VZ, & Petriu, EM (2019, июнь). Определение частоты пульса с использованием миниатюрного мультимодального тактильного датчика . В 2019 году IEEE Международный симпозиум по медицинским измерениям и применениям (MeMeA) (стр. 1-6). IEEE.
Ting, C., Field, R., Quach, T., Bauer, T. (2019). Обобщенное определение границ с использованием аналитики на основе сжатия . ICASSP 2019 - 2019 IEEE Международная конференция по акустике, обработке речи и сигналов (ICASSP) , Брайтон, Великобритания, стр. 3522-3526.
Перевозчик, EE (2019). Использование компрессии при решении дискретизированных линейных систем .Докторская диссертация , Университет Иллинойса в Урбана-Шампейн.
Khandakar, A., Chowdhury, ME, Ahmed, R., Dhib, A., Mohammed, M., Al-Emadi, NA, & Michelson, D. (2019). Портативная система для мониторинга и контроля поведения водителя и использования мобильного телефона во время вождения . Датчики , 19 (7), 1563.
Baskozos, G., Dawes, JM, Austin, JS, Antunes-Martins, A., McDermott L., Clark, AJ, ... & Orengo, C. (2019). Комплексный анализ длительной экспрессии некодирующей РНК в ганглиях дорсального корешка выявляет специфичность типа клеток и нарушение регуляции после повреждения нерва . Боль , 160 (2), 463.
Клауд Б., Тариен Б., Кроуфорд Р. и Мур Дж. (2018). Адаптивный сенсорный синтез на базе смартфона для оценки конкурентных кинематических показателей гребли . engrXiv Препринты .
Зайдель, TJ (2018). Электронные интерфейсы для биосенсинга на основе бактерий . Докторская диссертация , UC Berkeley.
Perkins P., Heber S. (2018). Идентификация сайтов с рибосомальной паузой с использованием алгоритма обнаружения пиков на основе Z-показателя . IEEE 8-я Международная конференция по вычислительным достижениям в биологических и медицинских науках (ICCABS) , ISBN: 978-1-5386-8520-4.
Мур Дж., Гоффин П., Мейер М., Лундриган П., Патвари Н., Свард К. и Визе Дж. (2018). Управление домашней средой с помощью зондирования, аннотирования и визуализации данных о качестве воздуха .Слушания ACM по Интерактивным, Мобильным, Носимым и Вездесущим Технологиям , 2 (3), 128.
Ло, О., Бьюкенен, WJ, Гриффитс, П. и Макфарлейн, Р. (2018), Методы измерения расстояний для улучшенного обнаружения угроз изнутри , Сети безопасности и связи , Vol. 2018, ID статьи 5906368.
Апурупа Н.В., Сингх П., Чакраварти С. и Будуру А.Б. (2018). Критическое исследование моделей энергопотребления в индийских квартирах . Докторская диссертация , IIIT-Дели.
Scirea, M. (2017). Affective Music Generation и его влияние на опыт игрока . Докторская диссертация , Университет информационных технологий Копенгагена, Digital Design.
Scirea, M., Eklund, P., Togelius, J. & Risi, S. (2017). Первобытно-импровизация: на пути коэволюционной музыкальной импровизации . Информатика и электронная инженерия (CEEC) , 2017 (стр. 172-177). IEEE.
Catalbas MC, Cegovnik T., Sodnik J. and Gulten A. (2017). Обнаружение усталости водителя на основе саккадических движений глаз , 10-я Международная конференция по электротехнике и электронике (ELECO), с. 913-917.
Другая работа с использованием алгоритма
Бернарди Д. (2019). Технико-экономическое обоснование соединения умных часов и мобильного устройства с помощью мультимодальных жестов . Магистерская диссертация , Университет Аалто.
Lemmens, E. (2018). Обнаружение выбросов в журналах событий с использованием статистических методов , магистерская работа , Университет Эйндховена.
Виллемс, П. (2017). Настроение контролировало аффективную обстановку для пожилых людей , магистерскую диссертацию , Университет Твенте.
Ciocirdel, GD and Varga, M. (2016). Предсказание выборов на основе просмотров страниц Википедии . Проектная документация , Vrije Universiteit Amsterdam.
Другие применения этого алгоритма
Финансовая лаборатория машинного обучения , пакет Python, основанный на работе De Prado, ML (2018). Достижения в области финансового машинного обучения . Джон Вили и сыновья.
Adafruit CircuitPlayground Library , Adafruit Board (Adafruit Industries)
Алгоритм отслеживания шагов , приложение для Android (jeeshnair)
Ссылки на другие алгоритмы обнаружения пиков
Если вы используете эту функцию где-то, пожалуйста, укажите мне или этот ответ. Если у вас есть какие-либо вопросы относительно этого алгоритма, отправьте их в комментариях ниже или свяжитесь со мной в LinkedIn .
источник
threshold
график просто становится плоской зеленой линией после большого скачка до 20 в данных, и он остается таким же для остальной части графика ... Если Я удаляю сик, это не происходит, поэтому, похоже, это вызвано скачком данных. Есть идеи, что может происходить? Я новичок в Matlab, так что я не могу понять ...Вот
Python
/numpy
реализация сглаженного алгоритма z-счета (см. Ответ выше ). Вы можете найти суть здесь .Ниже приведен тест для того же набора данных, который дает тот же график, что и в исходном ответе для
R
/Matlab
источник
y
- это массив данных, который вы передаете, или выходной массив, который указывает для каждого элемента данных,signals
является ли этот элемент данных "значительным пиком" с учетом настроек, которые вы используете.+1
-1
y[i]
Одним из подходов является обнаружение пиков на основе следующего наблюдения:
Это позволяет избежать ложных срабатываний, дожидаясь окончания восходящего тренда. Это не совсем «в режиме реального времени» в том смысле, что он пропустит пик на 1 дт. чувствительность можно контролировать, требуя запас для сравнения. Существует компромисс между обнаружением шума и задержкой обнаружения. Вы можете обогатить модель, добавив больше параметров:
где dt и m - параметры для контроля чувствительности и задержки
Вот что вы получаете с упомянутым алгоритмом:
Вот код для воспроизведения сюжета в Python:
Установив
m = 0.5
, вы можете получить более чистый сигнал только с одним ложным срабатыванием:источник
При обработке сигналов обнаружение пиков часто осуществляется с помощью вейвлет-преобразования. Вы в основном делаете дискретное вейвлет-преобразование на данных своего временного ряда. Пересечения нуля в возвращаемых детальных коэффициентах будут соответствовать пикам в сигнале временных рядов. Вы получаете разные пиковые амплитуды, обнаруженные при разных уровнях коэффициента детализации, что дает вам многоуровневое разрешение.
источник
Мы попытались использовать сглаженный алгоритм z-показателя в нашем наборе данных, который приводит к избыточной или недостаточной чувствительности (в зависимости от того, как настроены параметры), с небольшим промежуточным положением. В сигнале трафика нашего сайта мы наблюдали низкочастотную базовую линию, которая представляет суточный цикл, и даже с наилучшими возможными параметрами (показанными ниже), он все еще прерывался, особенно на 4-й день, потому что большинство точек данных распознаются как аномалии ,
Основываясь на оригинальном алгоритме z-счета, мы нашли способ решить эту проблему с помощью обратной фильтрации. Детали модифицированного алгоритма и его применения в атрибуции рекламы на телевидении публикуются в блоге нашей команды .
источник
В вычислительной топологии идея постоянных гомологий приводит к эффективному - быстрому, как сортировка чисел - решению. Он не только обнаруживает пики, но и количественно определяет «значимость» пиков естественным образом, что позволяет вам выбирать пики, которые важны для вас.
Краткое изложение алгоритма. В одномерной установке (временной ряд, действительный сигнал) алгоритм может быть легко описан следующим рисунком:
Думайте о графике функции (или его подуровне) как о пейзаже и рассматривайте снижение уровня воды, начиная с бесконечности уровня (или 1,8 на этом рисунке). Пока уровень падает, на локальных максимумах всплывают острова. На локальных минимумах эти острова сливаются воедино. Одна из деталей этой идеи заключается в том, что остров, появившийся позднее, слился с более старым островом. «Постоянство» острова - это время его рождения за вычетом времени смерти. Длина синих столбцов изображает постоянство, которое является вышеупомянутой «значимостью» пика.
Эффективность. Нетрудно найти реализацию, которая выполняется за линейное время - фактически это один простой цикл - после сортировки значений функции. Таким образом, эта реализация должна быть быстрой на практике и легко осуществимой.
Ссылки. Описание всей истории и ссылки на мотивацию из устойчивой гомологии (область вычислительной алгебраической топологии) можно найти здесь: https://www.sthu.org/blog/13-perstopology-peakdetection/index.html.
источник
Найден еще один алгоритм Г.Х. Палшикара в разделе « Простые алгоритмы обнаружения пиков во временных рядах » .
Алгоритм выглядит так:
преимущества
Недостатки
k
иh
заранееПример:
источник
Вот реализация сглаженного алгоритма z-счета (выше) в Golang. Предполагается срез
[]int16
(16-битные выборки PCM). Вы можете найти суть здесь .источник
Вот реализация C ++ сглаженного алгоритма z-счета из этого ответа
источник
Эта проблема выглядит аналогично той, с которой я столкнулся в курсе по гибридным / встраиваемым системам, но это было связано с обнаружением неисправностей, когда на входе датчика присутствует шум. Мы использовали фильтр Калмана для оценки / прогнозирования скрытого состояния системы, а затем использовали статистический анализ для определения вероятности возникновения ошибки . Мы работали с линейными системами, но существуют нелинейные варианты. Я помню, что подход был удивительно адаптивным, но он требовал модели динамики системы.
источник
Реализация C ++
источник
Следуя предложенному @ Jean-Paul решению, я реализовал его алгоритм на C #
Пример использования:
источник
Вот реализация C сглаженного Z-показателя @ Jean-Paul для микроконтроллера Arduino, используемого для считывания показаний акселерометра и определения направления удара слева или справа. Это работает очень хорошо, так как это устройство возвращает отклоненный сигнал. Вот этот вход для этого алгоритма обнаружения пиков от устройства - показывает удар справа, а затем удар слева. Вы можете увидеть начальный всплеск, а затем колебание датчика.
Ее результат с влиянием = 0
Не отлично, но здесь с влиянием = 1
что очень хорошо
источник
Вот фактическая реализация Java, основанная на ответе Groovy, опубликованном ранее. (Я знаю, что уже есть реализованные реализации Groovy и Kotlin, но для кого-то вроде меня, кто только делал Java, очень сложно выяснить, как конвертировать между другими языками и Java).
(Результаты совпадают с графиками других людей)
Алгоритм реализации
Основной метод
Полученные результаты
источник
Приложение 1 к оригинальному ответу:
Matlab
иR
переводыКод Matlab
Пример:
Код R
Пример:
Этот код (оба языка) даст следующий результат для данных исходного вопроса:
Приложение 2 к первоначальному ответу:
Matlab
демонстрационный код(нажмите, чтобы создать данные)
источник
Вот моя попытка создать решение Ruby для «сглаженного алгоритма z-счета» из принятого ответа:
И пример использования:
источник
Итерационная версия в python / numpy для ответа https://stackoverflow.com/a/22640362/6029703 находится здесь. Этот код работает быстрее, чем вычисление среднего значения и стандартного отклонения с каждой задержкой для больших данных (100000+).
источник
Думал, что предоставлю свою реализацию алгоритма Джулии для других. Суть можно найти здесь
источник
Вот реализация Groovy (Java) сглаженного алгоритма z-счета ( см. Ответ выше ).
Ниже приведен тест для того же набора данных, который дает те же результаты, что и в приведенной выше реализации Python / numpy .
источник
Вот (не идиоматическая) версия Scala сглаженного алгоритма z-счета :
Вот тест, который возвращает те же результаты, что и версии Python и Groovy:
Гист здесь
источник
Мне нужно что-то подобное в моем проекте Android. Думаю, я мог бы вернуть реализацию Kotlin .
Пример проекта с графиками проверки можно найти на github .
источник
Вот измененная версия алгоритма z-счета на Фортране . Он изменен специально для пикового (резонансного) обнаружения в передаточных функциях в частотном пространстве (каждое изменение имеет небольшой комментарий в коде).
Первая модификация дает предупреждение пользователю, если есть резонанс около нижней границы входного вектора, обозначенный стандартным отклонением, превышающим определенный порог (10% в этом случае). Это просто означает, что сигнал не является достаточно плоским для обнаружения, инициализирующего фильтры должным образом.
Вторая модификация состоит в том, что к найденным пикам добавляется только самое высокое значение пика. Это достигается путем сравнения каждого найденного пикового значения с величиной его (запаздывающих) предшественников и его (запаздывающих) преемников.
Третье изменение состоит в том, что резонансные пики обычно показывают некоторую форму симметрии вокруг резонансной частоты. Поэтому естественно рассчитать среднее значение и стандартное отклонение симметрично относительно текущей точки данных (а не только для предшественников). Это приводит к лучшему поведению обнаружения пика.
Изменения приводят к тому, что весь сигнал должен быть заранее известен функции, что является обычным случаем обнаружения резонанса (что-то вроде примера Matlab Жана-Поля, где точки данных генерируются на лету, не будут работать).
Для моего приложения алгоритм работает как шарм!
источник
Если у вас есть данные в таблице базы данных, вот SQL-версия простого алгоритма z-счета:
источник
Версия Python, которая работает с потоками в реальном времени (не пересчитывает все точки данных по прибытии каждой новой точки данных). Вы можете настроить то, что возвращает функция класса - для моих целей мне просто нужны были сигналы.
источник
Я позволил себе создать его версию на JavaScript. Это может быть полезно. Javascript должен быть прямой транскрипцией псевдокода, приведенного выше. Доступен в виде пакета npm и репозитория github:
Перевод Javascript:
источник
Если граничное значение или другие критерии зависят от будущих значений, то единственное решение (без машины времени или других знаний о будущих значениях) состоит в том, чтобы отложить любое решение до тех пор, пока не будет получено достаточное количество будущих значений. Если вы хотите, чтобы уровень превышал среднее значение, например 20 баллов, то вам нужно подождать, пока у вас не будет хотя бы 19 баллов перед любым пиковым решением, иначе следующая новая точка может полностью сбросить ваш порог 19 баллов назад ,
Ваш текущий график не имеет пиков ... если вы заранее не знаете, что следующая точка - это не 1e99, которая после пересчета измерения Y вашего графика будет плоской до этой точки.
источник
.. As large as in the picture
я имел в виду: для подобных ситуаций , когда имеются значительные пики и основные шумы.И вот идет реализация PHP алгоритма ZSCORE:
источник
($len - 1)
вместо$len
вstddev()
Вместо того, чтобы сравнивать максимумы со средним, можно также сравнить максимумы с соседними минимумами, где минимумы определены только выше шумового порога. Если локальный максимум> 3 раза (или другого доверительного коэффициента) или соседних минимумов, то этот максимум является пиком. Определение пика более точно с более широкими движущимися окнами. Между прочим, выше используется вычисление в центре окна, а не вычисление в конце окна (== задержка).
Обратите внимание, что максимумы следует рассматривать как увеличение сигнала до и уменьшение после.
источник
Функция
scipy.signal.find_peaks
, как следует из названия, полезна для этого. Но важно понять , а его параметрыwidth
,threshold
,distance
и прежде всегоprominence
, чтобы получить хорошую добычу пика.Согласно моим тестам и документации, концепция известности является «полезной концепцией» для сохранения хороших пиков и отбрасывания шумных пиков.
Какова (топографическая) известность ? Это «минимальная высота, необходимая для спуска, чтобы добраться от вершины до любой более высокой местности» , как это можно увидеть здесь:
Идея заключается в следующем:
источник
Объектно-ориентированная версия алгоритма z-счета с использованием современного C +++
источник
filtered_signal
,signal
,avg_filtered
и ,std_filtered
как частные переменные и обновляет только те массивы , один раз , когда новый DataPoint прибывает (теперь код перебирает все точки данных каждый раз, когда она называется). Это улучшило бы производительность вашего кода и еще лучше соответствовало бы структуре ООП.