Медианный фильтр против выбросов

Урок про фильтр, который выбрасывает выбросы, а не размазывает их.

Медианный фильтр заменяет отсчёт медианой окна — средним по порядку значением, которое не зависит от величины крайних точек.

Случайный гладкий шум давит усреднение. Но датчики иногда выдают одиночные дикие выбросы — сбой связи, помеха, плохой контакт. Среднее такой выброс протащит, а медиана — нет: она просто его игнорирует.

Почему медиана устойчива

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

import statistics

window = [20, 21, 99, 22, 20]   # 99 — выброс
print("среднее:", statistics.mean(window))
print("медиана:", statistics.median(window))

Вывод:

среднее: 36.4
медиана: 21

Скользящий медианный фильтр

Как и среднее, медиану считают по скользящему окну. Окно обычно нечётное, чтобы медиана была однозначной:

import statistics

def median_filter(xs, w):
    half = w // 2
    out = []
    for i in range(len(xs)):
        lo = max(0, i - half)
        hi = min(len(xs), i + half + 1)
        out.append(statistics.median(xs[lo:hi]))
    return out

signal = [20, 21, 99, 22, 20, 21, 5, 22]   # два выброса: 99 и 5
print(median_filter(signal, 3))

Вывод:

[20.5, 21, 22, 22, 21, 20, 21, 13.5]

Как работает под капотом

Медианный фильтр — нелинейный: его нельзя записать как взвешенную сумму, потому что результат зависит от сортировки. Это даёт ему уникальное свойство — он убирает импульсный шум (соль-перец), сохраняя резкие края полезного сигнала, тогда как усреднение края размывает. Цена — медиана дороже по вычислениям (нужна сортировка окна) и слабее против гладкого гауссова шума. Поэтому на практике часто ставят медианный фильтр первым (убрать выбросы), а за ним усреднение или EMA (сгладить остаток).

Частые ошибки

  • Брать чётное окно — медиана станет средним двух центральных и потеряет устойчивость.
  • Использовать только медиану против гладкого шума — тут лучше усреднение.
  • Ставить слишком широкое окно — медиана начнёт «съедать» короткие реальные импульсы.

Итог

  • Медианный фильтр заменяет отсчёт медианой окна и устойчив к выбросам.
  • Он нелинеен, сохраняет края сигнала, но дороже усреднения.
  • Хорош в связке: сначала медиана от выбросов, потом EMA от гладкого шума.
Проверьте себя
1. Почему медиана устойчива к выбросам, а среднее — нет?
AМедиана учитывает все значения сильнее
BМедиана зависит только от порядка, выброс уходит на край окна
CСреднее игнорирует крайние точки
DОни одинаковы
2. Какая связка фильтров эффективна против выбросов И гладкого шума?
AТолько EMA
BТолько медиана
CСначала медианный, потом усреднение/EMA
DНикакая