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