Другой подход (больше слов, меньше кода), который может помочь:
Местоположения локальных максимумов и минимумов также являются местоположениями пересечения нуля первой производной. Как правило, гораздо проще найти пересечение нуля, чем непосредственно найти локальные максимумы и минимумы.
К сожалению, первая производная имеет тенденцию «усиливать» шум, поэтому, когда в исходных данных присутствует значительный шум, первую производную лучше всего использовать только после того, как к исходным данным применена некоторая степень сглаживания.
Поскольку сглаживание - это, в самом простом смысле, фильтр нижних частот, сглаживание часто лучше (ну, проще всего) выполнить с помощью ядра свертки, а «формирование» этого ядра может обеспечить удивительное количество функций, сохраняющих свойства. / Расширение возможностей. Процесс поиска оптимального ядра может быть автоматизирован с использованием различных средств, но лучшим может быть простой метод грубой силы (достаточно быстрый для поиска небольших ядер). Хорошее ядро (как и предполагалось) будет сильно искажать исходные данные, но это НЕ повлияет на расположение интересующих пиков / долин.
К счастью, довольно часто подходящее ядро может быть создано с помощью простого SWAG («обоснованное предположение»). Ширина сглаживающего ядра должна быть немного шире, чем самый ожидаемый «интересный» пик в исходных данных, и его форма будет напоминать этот пик (одномасштабный вейвлет). Для ядер, сохраняющих среднее значение (каким должен быть любой хороший сглаживающий фильтр), сумма элементов ядра должна быть точно равна 1,00, а ядро должно быть симметричным относительно его центра (то есть иметь нечетное количество элементов.
При оптимальном сглаживающем ядре (или небольшом количестве ядер, оптимизированных для различного содержимого данных), степень сглаживания становится коэффициентом масштабирования ("усиления") ядра свертки.
Определение «правильной» (оптимальной) степени сглаживания (усиления ядра свертки) можно даже автоматизировать: сравните стандартное отклонение первых производных данных со стандартным отклонением сглаженных данных. Как соотношение двух стандартных отклонений изменяется с изменением степени сглаживания кулачка, можно использовать для прогнозирования эффективных значений сглаживания. Несколько ручных прогонов данных (которые действительно репрезентативны) должны быть всем, что нужно.
Все предыдущие решения, опубликованные выше, вычисляют первую производную, но они не рассматривают ее как статистическую меру, и при этом вышеупомянутые решения не пытаются выполнять функцию сохранения / улучшения сглаживания (чтобы помочь тонким пикам «перепрыгнуть» шум ).
Наконец, плохие новости: поиск «настоящих» пиков становится настоящей болью, когда шум также имеет функции, похожие на реальные пики (перекрывающиеся полосы пропускания). Следующее более сложное решение, как правило, заключается в использовании более длинного сверточного ядра («более широкой апертуры ядра»), которое учитывает взаимосвязь между соседними «реальными» пиками (например, минимальные или максимальные скорости для появления пиков), или использования нескольких свертка проходит с использованием ядер, имеющих разную ширину (но только если она быстрее: фундаментальная математическая истина состоит в том, что линейные свертки, выполняемые последовательно, всегда могут быть сведены вместе в одну свертку). Но зачастую гораздо проще сначала найти последовательность полезных ядер (различной ширины) и собрать их вместе, чем непосредственно найти конечное ядро за один шаг.
Надеюсь, это предоставит достаточно информации, чтобы позволить Google (и, возможно, хороший текст статистики) заполнить пробелы. Мне бы очень хотелось, чтобы у меня было время предоставить работающий пример или ссылку на него. Если кто-то сталкивается с одним онлайн, пожалуйста, отправьте это здесь!