Медианный фильтр против выбросов
Урок про фильтр, который выбрасывает выбросы, а не размазывает их.
Медианный фильтр заменяет отсчёт медианой окна — средним по порядку значением, которое не зависит от величины крайних точек.
Случайный гладкий шум давит усреднение. Но датчики иногда выдают одиночные дикие выбросы — сбой связи, помеха, плохой контакт. Среднее такой выброс протащит, а медиана — нет: она просто его игнорирует.
Почему медиана устойчива
Среднее зависит от всех значений, поэтому один огромный выброс сдвигает его. Медиана зависит только от порядка: крайнее значение, каким бы диким оно ни было, окажется с краю отсортированного окна и не повлияет на середину.
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 от гладкого шума.