Требуется программно найти количество и местоположение положительных пиков на графике.
Известно, что количество пиков нечетное. Обычно 3, 5 или 7. В данном случае 3. Также известно, что за каждым положительным пиком следует отрицательный.
Как лучше решить такую проблему на Python? Желательно без подбора коэффициентов
Дополнение: Данные всегда начинаются с положительного пика и заканчиваются отрицательным.
Данные представляют собой вертикальную проекцию изображения, обработанную функцией np.gradient(projection)/projection. То есть отношение второй производной функции к её высоте.
Ответ
Поскольку просто локальный экстремум не устраивает, надо добавить проверку превышения порога для отбраковки мелких пиков и артефактов. Порог можно вычислить как СКО выборки, умноженное на некоторую константу, соответствующую доверительному интервалу для математического ожидания.
На практике эту константу принимают равной 2.5
UPD
С учётом дополнительных условий задачи пиком следует считать максимум на отрезке от "верха" (начальной точки или первого значения выше q) до "низа" (первого значения ниже -q).
При этом для массива размерности n возможен следующий алгоритм:
Найти СКО выборки и вычислить порог q
Положить top=0
Найти координату bottom первой точки отрезка [top, n-1] со значением меньше -q. Если такой точки нет, перейти к п.7.
Найти координату максимума на отрезке [top, bottom-1]. Если значение максимума больше q, записать его в массив пиков.
Найти координату top первой точки отрезка [bottom+1, n-1] со значением больше q. Если такой точки нет, перейти к п.7.
Перейти к п.3.
Использовать массив пиков.
Комментариев нет:
Отправить комментарий