Найти плато в массиве Numpy - PullRequest
0 голосов
/ 27 ноября 2018

Я ищу эффективный способ обнаружения плато в других очень шумных данных.Плато всегда относительно широкие. Простой пример того, как могут выглядеть эти данные:

test=np.random.uniform(0.9,1,100)
test[10:20]=0
plt.plot(test)

enter image description here

Обратите внимание, что может быть несколько плато (которыевсе должны быть обнаружены), которые могут иметь разные значения.

Я пытался использовать scipy.signal.argrelextrema, но, похоже, он не выполняет то, что мне нужно:

peaks=argrelextrema(test,np.less,order=25)
plt.vlines(peaks,ymin=0, ymax=1)

enter image description here

Мне не нужен точный интервал плато - грубой оценки дальности будет достаточно, если эта оценка больше или равна фактическому платоспектр.Однако он должен быть относительно эффективным.

1 Ответ

0 голосов
/ 27 ноября 2018

Это действительно просто «тупая» задача машинного обучения.Вы захотите написать пользовательскую функцию для их проверки.У вас есть две ключевые характеристики для плато:

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

Тогда достаточно простого цикларассчитать скользящую среднюю вперед, стандартное значение точек в этой скользящей средней вперед, обратную скользящую среднюю и стандартное значение точек в этой обратной скользящей средней.

  • Читайте, пока не найдете точку, выходящую далеко за пределы обычного шума (сравните с дисперсией).Начните буферизовать эти индексы в списке.
  • Продолжайте считывать и буферизовать индексы в этот список, пока они имеют одно и то же значение (или почти одинаковое, если ваши плато могут быть немного грубыми; вы захотите использовать некоторый допуск плюс стандартное отклонение ваших плато).или просто некоторая терпимость, если вы ожидаете, что все они будут вести себя одинаково).
  • Если дисперсия точек в вашем буфере становится слишком высокой, это не плато, слишком грубое;выбросить его и начать сканирование снова с вашей текущей позиции.
  • Если последнее значение сильно отличалось от предыдущего (в порядке изменения, которое инициировало ваш код для запуска индексов буферизации) и в противоположном направлении от исходного импульса, закройте здесь свой буфер;у вас там плато.
  • Теперь делай, что хочешь, с точками на этих индексах.Удалите их, замените их линейной интерполяцией между двумя граничными точками, что угодно.

Я мог бы создать некоторый шум и дать вам пример кода, но это действительно то, что вам придется адаптировать к вашему приложению.(Например, в этом методе есть недостаток, заключающийся в том, что плато, которое захватывает точку в середине «края утеса», может покинуть эту точку, когда оно удаляет остальную часть плато. Если это то, что вас беспокоит, вы 'вам нужно будет немного больше исследовать после того, как вы идентифицируете плато.) Вы должны быть в состоянии сделать это за один проход по данным, но, возможно, было бы целесообразно сначала получить статистику по всему набору, чтобы разумно настроить ваши пороговые значения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...