Фильтр Калмана на пальцах (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 это простые скаляры; общая идея — оптимальное слияние по уверенности.