Возможно, кластеризация - не лучший подход для этой конкретной проблемы.Я сторонник того, чтобы по возможности это было просто.
Для вашей задачи я бы предложил сгладить данные с использованием экспоненциального скользящего среднего, измерить отклонение от скользящей и пометить запись как аномальную, если текущее значение слишком велико.далеко от ожидаемого значения.
https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average
Это ваши данные (отмечены синим цветом) с экспоненциальной скользящей средней, нанесенной поверх них (альфа равна 0,5).Преимущество использования экспоненциального скользящего среднего становится очевидным, оно позволяет данным постепенно смещаться, одновременно ослабляя любые внезапные изменения.
ЧтоЯ бы сделал:
- отсортировать ваши данные по отметке времени
- применить экспоненциально скользящее среднее, чтобы получить непрерывную аппроксимацию вашей кривой
- , когда новый /проверяется следующее значение, сравнивайте его с EMA
- , если значение выходит за пределы [EMA - std_dev, EMA + std_dev], тогда вы можете классифицировать его как аномальные
параметровдля настройки:
- альфа (используется в EMA)
- использовать std_dev?или, возможно, сначала умножьте std_dev на некоторый коэффициент?