← На главную

SMA, EMA и Kalman-фильтр: O(1) стриминг и код на Kaggle

28.07.2026 06:11 · hackernews

Исследуя оптимизаторы, автор углубился в тему рекурсивных фильтров. Это практический обзор сглаживателей для зашумлённых измерений, когда важны низкая задержка и экономия вычислений. Рекурсивные фильтры хороши в потоковой обработке и на слабом железе: они требуют O(1) памяти, храня лишь последнее состояние или текущую сумму, а не полный буфер, и O(1) вычислений на сэмпл — пара умножений-сложений на шаг. Они выдают оценку сразу при поступлении данных, легко переносятся, векторизуются и нормально работают при неравномерном сэмплировании.

В статье разбираются три подхода. Первый — SMA, простое скользящее среднее по окну из k последних наблюдений. Оно отлично давит шум, но запаздывает и требует хранить буфер из k точек, поэтому скачки размазываются по окну равномерно. Второй — EMA, он же рекурсивный средний фильтр или low-pass фильтр первого порядка. Формула одинаковая: s_t = α·s_{t-1} + (1 − α)·x_t. Чем выше α, тем плавнее результат, но и инерция больше. В примере α связывают с размером окна через α = (k − 1)/k. Такое обновление похоже на дырявый интегратор: начальное отклонение будет сглаживаться несколько итераций, прежде чем оценка приблизится к среднему. Этот метод — стандарт для стриминга.

Третий вариант — крохотный одномерный Kalman-фильтр. Это первая попытка автора нащупать интуицию перед полноценным фильтром Калмана. Если известны шум сенсора R и шум процесса Q, фильтр автоматически подстраивает усиление K_t, балансируя между доверием к предсказанию и новому измерению в модели с постоянной величиной (A = H = 1). Шаг предсказания просто копирует предыдущую оценку и увеличивает ковариацию P на Q. На шаге обновления вычисляется коэффициент K_t = P⁻ / (P⁻ + R). При большом R коэффициент усиления мал, и мы больше полагаемся на априорную оценку; при большом Q ковариация растёт и K_t увеличивается — замерам доверяют больше.

Выбор параметров: - Для SMA окно k побольше даёт больше гладкости и задержки. - EMA/low-pass с α около 0.8–0.95 подбирают, балансируя шум и инерцию на глаз. - В Kalman-фильтре R ставят по дисперсии сенсора, а Q — по ожидаемому дрейфу скрытой переменной между шагами.

Автор подчёркивает, что настоящий многомерный Kalman значительно сложнее и станет темой будущего изучения. Практический код лежит в открытом Kaggle Notebook. Приёмы пригодятся во встраиваемых системах, контурах управления роботов и мобильном сглаживании сенсоров.

Читать оригинал →