Фильтр Калмана на пальцах (1D)

Урок объясняет фильтр Калмана без матриц — на одномерном случае с двумя простыми шагами.

Фильтр Калмана — алгоритм, который на каждом шаге предсказывает состояние, затем корректирует предсказание новым измерением, взвешивая их по неопределённости.

Калман пугает матрицами, но идея проста: у нас есть предсказание (где мы думаем находимся) и измерение (что показал датчик), и оба неточны. Фильтр смешивает их, доверяя больше тому, кто увереннее. Разберём это в одном измерении.

Два шага: предсказание и обновление

На шаге предсказания неопределённость растёт (мир изменился): $P \leftarrow P + Q$, где $Q$ — шум процесса. На шаге обновления считаем коэффициент усиления Калмана:

$$ K = \frac{P}{P + R} $$

где $R$ — шум измерения. Затем поправляем оценку и уменьшаем неопределённость:

$$ \hat{x} \leftarrow \hat{x} + K\,(z - \hat{x}), \qquad P \leftarrow (1 - K)\,P $$

def kalman_1d(measurements, Q=0.001, R=0.1):
    x = measurements[0]   # начальная оценка
    P = 1.0               # начальная неопределённость
    out = []
    for z in measurements:
        # предсказание (модель: значение почти не меняется)
        P = P + Q
        # обновление
        K = P / (P + R)
        x = x + K * (z - x)
        P = (1 - K) * P
        out.append(round(x, 3))
    return out

noisy = [10.2, 9.7, 10.5, 10.1, 9.9, 10.3, 10.0]
print(kalman_1d(noisy))

Вывод:

[10.2, 9.961, 10.138, 10.128, 10.081, 10.12, 10.101]

Что делает коэффициент K

$K$ балансирует доверие. Если измерение точное ($R$ мало), $K \to 1$ — верим датчику. Если предсказание уверенное ($P$ мало), $K \to 0$ — держимся модели. Со временем $P$ стабилизируется, и фильтр выходит на установившийся режим.

# как меняется K при разном доверии измерению
P = 1.0
for R in (0.01, 0.1, 1.0, 10.0):
    K = P / (P + R)
    print("R =", R, "-> K =", round(K, 3))

Вывод:

R = 0.01 -> K = 0.99
R = 0.1 -> K = 0.909
R = 1.0 -> K = 0.5
R = 10.0 -> K = 0.091

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

Фильтр Калмана — это оптимальное (в смысле минимума дисперсии) слияние предсказания и измерения для линейной системы с гауссовым шумом. Коэффициент $K$ — то самое взвешивание обратно неопределённостям из урока про слияние, только теперь неопределённость предсказания $P$ обновляется на каждом шаге. В полной версии $x$, $P$, $Q$, $R$ становятся матрицами, появляется модель движения, но логика «предсказал → измерил → смешал по уверенности» остаётся той же. Подбор $Q$ и $R$ — главное искусство: $Q$ велик — фильтр верит датчику и шумит, $R$ велик — фильтр инертен.

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

  • Путать $Q$ (шум процесса) и $R$ (шум измерения) — они влияют противоположно.
  • Ставить $Q = 0$ для меняющейся величины — фильтр «застынет» и перестанет следить.
  • Ждать чудес от 1D-Калмана на нелинейной задаче — там нужны расширенные версии.

Итог

  • Калман чередует предсказание (рост неопределённости) и обновление (коррекция измерением).
  • Коэффициент $K = P/(P+R)$ балансирует доверие модели и датчику.
  • В 1D это простые скаляры; общая идея — оптимальное слияние по уверенности.
Проверьте себя
1. К чему стремится коэффициент Калмана K, если шум измерения R очень мал (датчик точный)?
AК 0
BК 1
CК 0.5
DК бесконечности
2. Что произойдёт, если для меняющейся величины задать Q = 0?
AФильтр станет идеальным
BФильтр перестанет следить за изменениями ('застынет')
CK станет равным 1
DНеопределённость вырастет