Реализация AI-детекции аномалий IoT-датчиков в мобильном приложении
Порог-алерт «если температура > 80°C» срабатывает поздно: к моменту превышения порога проблема уже сформировалась. Аномалия — это отклонение от нормального паттерна, которое может быть заметно за часы или дни до достижения критического значения. Мотор, который обычно разогревается до 45°C за 20 минут, сегодня разогревается до 45°C за 8 минут — это аномалия, хотя температура в норме.
Алгоритмы: что применимо в мобильном контексте
Для IoT-аномалий в реальном времени на мобильном устройстве нужны алгоритмы с малым потреблением памяти и быстрым инференсом. Не всё, что работает в Jupyter Notebook с полным датасетом, годится для онлайн-детекции.
Z-score с адаптивным baseline. Не фиксированный mean/std за весь период, а скользящее окно (Exponentially Weighted Moving Average). Работает на устройстве без модели:
class EWMAnomalyDetector(
private val alpha: Double = 0.1, // коэффициент сглаживания
private val threshold: Double = 3.0 // количество сигм
) {
private var ewma: Double? = null
private var ewmVar: Double = 0.0
fun detect(value: Double): AnomalyResult {
val mean = ewma ?: run { ewma = value; return AnomalyResult.Normal(value, 0.0) }
val deviation = value - mean
ewmVar = alpha * deviation * deviation + (1 - alpha) * ewmVar
val sigma = sqrt(ewmVar).coerceAtLeast(1e-9)
val zScore = abs(deviation) / sigma
ewma = alpha * value + (1 - alpha) * mean
return if (zScore > threshold) {
AnomalyResult.Anomaly(value, zScore, deviation > 0)
} else {
AnomalyResult.Normal(value, zScore)
}
}
}
Isolation Forest. Обучается офлайн, инференс быстрый. Для многомерных данных (несколько датчиков одновременно) — лучший вариант без нейросетей. Модель конвертируется в TFLite через ONNX или напрямую через sklearn2pmml + кастомный конвертор.
LSTM Autoencoder. Лучший для временных рядов с паттернами (суточная цикличность потребления, производственные смены). Обучается восстанавливать нормальные последовательности; высокая reconstruction error = аномалия. На устройстве — TFLite LSTM ops с квантизацией int8 для снижения потребления памяти с ~15 МБ до ~4 МБ.
// iOS: LSTM Autoencoder инференс через Core ML
class LSTMAnomalyDetector {
let model: SensorAnomalyDetector // сгенерированный Core ML класс
private let windowSize = 60 // 60 семплов = 1 минута при 1 Гц
private var buffer: [[Double]] = []
func process(reading: SensorReading) -> AnomalyScore? {
buffer.append(reading.toFeatureVector())
guard buffer.count >= windowSize else { return nil }
let window = Array(buffer.suffix(windowSize))
let input = try? MLMultiArray(shape: [1, NSNumber(value: windowSize), NSNumber(value: reading.dimensions)],
dataType: .double)
// заполняем input...
guard let prediction = try? model.prediction(input: input!),
let reconstructed = prediction.output as? MLMultiArray else { return nil }
let mse = computeMSE(original: window, reconstructed: reconstructed)
buffer.removeFirst() // sliding window
return AnomalyScore(mse: mse, isAnomaly: mse > model.threshold)
}
}
Многоуровневая детекция: устройство + сервер
Оптимальная архитектура — двухуровневая. На устройстве: лёгкий EWMA или простой пороговый детектор для мгновенной реакции (< 100 мс). На сервере: тяжёлая модель (Isolation Forest, LSTM AE) с полным историческим контекстом для точной классификации.
Мобильное приложение получает события обоих уровней:
- Устройство → прямой пуш через локальное уведомление, если приложение запущено
- Сервер → FCM/APNs с подтверждённой аномалией и её классификацией
@Serializable
data class AnomalyEvent(
val sensorId: String,
val sensorName: String,
val timestamp: Long,
val value: Double,
val baseline: Double,
val deviationPercent: Double,
val anomalyType: AnomalyType, // SPIKE, DRIFT, PATTERN_BREAK, FLATLINE
val severity: Severity, // LOW, MEDIUM, HIGH, CRITICAL
val possibleCause: String? // заполняется сервером через LLM
)
Аналитика аномалий: паттерны и кластеризация
Одиночная аномалия может быть случайным выбросом. Систематические аномалии по расписанию — проблема. Экран аналитики показывает:
- Heatmap аномалий по датчикам и времени суток
- Кластеры аномалий по типу (DBSCAN на серверной стороне)
- Корреляции между датчиками: «аномалии на датчике T-3 всегда предшествуют аномалиям на P-7 через 15 минут»
Эти инсайты появляются только при накоплении данных за несколько недель — важно сразу закладывать хранение всех аномалий с контекстом.
Управление ложными срабатываниями
Первая претензия к системе детекции аномалий: «слишком много ложных алертов». Инструменты управления:
- Feedback loop: кнопка «Это нормально» на карточке аномалии — отправляет negative sample, сервер учитывает в дообучении
- Suppressions: «не сигнализировать по датчику T-5 с 06:00 до 08:00 — это плановый прогрев»
- Confidence threshold: показывать только аномалии с confidence > 0.8
Разработка модуля детекции аномалий для мобильного IoT-приложения с двухуровневой архитектурой и feedback loop: 5-8 недель. Стоимость рассчитывается индивидуально.







