Filtr Kalmana: jak z niedokładnych pomiarów oszacować, gdzie jest samochód i jak szybko jedzie
Łączenie dwóch pomiarów i wzmocnienie Kalmana, filtr jako średnia bieżąca, model w przestrzeni stanów, predykcja i korekcja, śledzenie samochodu według GPS z oszacowaniem niemierzonej prędkości, strojenie szumów Q i R, optymalność i rozszerzenia nieliniowe.
Seria Podstawy AI Część 41 z 52
- Mapa sztucznej inteligencji: co jest czym i jak to do siebie pasuje
- Krótka historia sztucznej inteligencji: od Turinga do modeli językowych
- Dane, model, trening, inferencja: podstawowe pojęcia na jednym przykładzie
- Jak czytać zapis matematyczny: symbole, indeksy, sumy i kwantyfikatory
- Zbiory i relacje: klocki, z których składają się definicje w AI
- Funkcje i odwzorowania: dlaczego każdy model AI jest funkcją
- Logika i dowody: reguły, według których rozumuje AI
- Grafy i drzewa: struktura, na której opierają się przeszukiwanie i sieci neuronowe
- Algebra liniowa dla uczenia maszynowego: wektory, macierze i dlaczego AI głównie mnoży
- Pochodne, gradient i reguła łańcuchowa: jak model ustala, w którą stronę się uczyć
- Spadek gradientu: jak uczy się model
- Czym jest prawdopodobieństwo: od rzutu kostką do aksjomatów Kołmogorowa
- Prawdopodobieństwo warunkowe i twierdzenie Bayesa: jak zmienić ocenę, gdy dowiesz się czegoś nowego
- Zmienna losowa i dystrybuanta: jedna funkcja, która mówi o rozkładzie wszystko
- Funkcja gęstości i funkcja prawdopodobieństwa: dlaczego zmienna ciągła ma w punkcie prawdopodobieństwo zero
- Wartość oczekiwana, wariancja i kowariancja: gdzie leży rozkład, jak jest szeroki i co z czym się wiąże
- Przegląd rozkładów prawdopodobieństwa: Bernoulliego, dwumianowy, Poissona, jednostajny, normalny i wykładniczy
- Prawo wielkich liczb i centralne twierdzenie graniczne: dlaczego średnie zachowują się tak przewidywalnie
- Statystyka i estymacja parametrów: największa wiarygodność, MAP i przedziały ufności
- Teoria informacji: entropia, entropia krzyżowa i dywergencja KL — skąd się biorą funkcje straty
- Przeszukiwanie przestrzeni stanów: BFS, DFS, UCS i A* z animacjami
- Gry i przeciwnik: minimax, przycinanie alfa-beta i Monte Carlo tree search
- Spełnianie ograniczeń: backtracking, propagacja ograniczeń i AC-3 na sudoku i mapie czeskich krajów
- Logika i systemy z bazą wiedzy: wnioskowanie w przód i wstecz, rezolucja i systemy ekspertowe
- Planowanie: STRIPS, świat klocków, heurystyki z relaksacji i planowanie w agentach AI
- Przeszukiwanie lokalne i symulowane wyżarzanie: komiwojażer przez czeskie miasta wojewódzkie
- Algorytmy genetyczne: populacja, krzyżowanie, mutacja i selekcja na plecaku na wycieczkę
- Strategie ewolucyjne i programowanie genetyczne: od reguły jednej piątej do prawa Keplera
- Optymalizacja kolonią mrówek: jak ślad feromonowy znajduje krótką drogę
- Optymalizacja rojem cząstek: bezwładność, własne doświadczenie i doświadczenie roju
- Neuroewolucja: ewolucja wag i kształtu sieci neuronowych oraz algorytm NEAT
- Zbiory rozmyte i funkcje przynależności: jak zapisać „trochę ciepło”
- Logika rozmyta a prawdopodobieństwo: dlaczego „trochę ciepło” nie znaczy „prawdopodobnie ciepło”
- Logika rozmyta: t-normy, implikacje i reguły JEŻELI–TO
- Sterowanie rozmyte: Mamdani i Sugeno od wentylatora po wahadło na wózku
- Klasteryzacja rozmyta: algorytm fuzzy c-means i punkty między skupieniami
- Systemy neuro-rozmyte (ANFIS): reguły rozmyte, które uczą się z danych
- Łańcuchy Markowa: macierz przejścia, rozkład stacjonarny i PageRank
- Ukryte modele Markowa: algorytm Viterbiego i nieuczciwe kasyno
- Sieci bayesowskie: dlaczego trawa jest mokra i co z tego wynika dla zraszacza
- Filtr Kalmana: jak z niedokładnych pomiarów oszacować, gdzie jest samochód i jak szybko jedzie
- Rodzaje uczenia maszynowego: nadzorowane, nienadzorowane, półnadzorowane i inne
- Prompty, kontekst i RAG: jak dać modelowi właściwe informacje
- Wariacyjne autoenkodery (VAE): nowe obrazki z ciągłej przestrzeni latentnej
- Generatywne sieci przeciwstawne (GAN): fałszerz kontra detektyw
- Modele dyfuzyjne: jak z czystego szumu powstaje obraz
- Procesy decyzyjne Markowa: stany, akcje, nagrody i równania Bellmana
- Q-learning i DQN: uczenie się wartości akcji od tabeli po sieć neuronową
- Policy gradient i PPO: uczenie się bezpośrednio polityki
- Jak działa agent AI: model językowy w pętli z narzędziami
- Programowanie z agentami AI: zadanie, testy i kontrola
- Ocena i bezpieczeństwo systemów AI: jak mierzyć i jak pilnować
Pełny program serii Gotowe: 52 z 83 tematów
- Jak łączy się dwa niedokładne pomiary i czym jest wzmocnienie Kalmana.
- Jak filtr przeplata predykcję według modelu z korekcją według pomiaru — i szacuje nawet to, czego nikt nie mierzy.
- Dlaczego ustawienie szumów Q i R ma tak duże znaczenie i jak filtr radzi sobie z nieliniowym światem.
Warto wiedzieć wcześniej: Ukryte modele Markowa: algorytm Viterbiego i nieuczciwe kasyno, Przegląd rozkładów prawdopodobieństwa: Bernoulliego, dwumianowy, Poissona, jednostajny, normalny i wykładniczy
Statek Apollo 11 leciał na Księżyc z komputerem pokładowym, który miał mniej pamięci niż dzisiejszy kalkulator graficzny. Nawigacja musiała przy tym na bieżąco szacować z niedokładnych pomiarów gwiazd, radaru i czujników inercyjnych, gdzie statek jest i jak szybko leci. Pomogła jej metoda, którą w 1960 roku opublikował Rudolf Kálmán, a którą dla NASA dopracował w praktyce Stanley Schmidt. Filtr Kalmana jest dziś w każdym telefonie, który łączy GPS z akcelerometrem, w każdym dronie i w każdym samochodzie, który sam utrzymuje pas ruchu. Tą częścią kończy się moduł o modelach probabilistycznych.
Nawiązuje do części Ukryte modele Markowa i Przegląd rozkładów prawdopodobieństwa.
1. Dwa niedokładne pomiary są lepsze niż jeden
Zacznijmy prosto. Odległość do latarni morskiej mierzymy dwa razy: raz dokładnym przyrządem — 100 m z niepewnością (odchyleniem standardowym) 5 m —, drugi raz zgrubnym — 110 m z niepewnością 10 m. Jakie jest najlepsze oszacowanie?
Twierdzenie — połączenie dwóch normalnych oszacowań
Jeśli dwa niezależne oszacowania to N(m1, σ12) i N(m2, σ22), to połączone oszacowanie jest normalne z
m = m1 + K (m2 − m1), σ2 = (1 − K) σ12, gdzie K = σ12 / (σ12 + σ22).
Równoważnie 1/σ2 = 1/σ12 + 1/σ22: precyzje się sumują.
Dowód. Połączone oszacowanie ma gęstość proporcjonalną do iloczynu obu gęstości (twierdzenie Bayesa z pierwszym oszacowaniem jako rozkładem a priori i drugim jako wiarygodnością). W wykładniku sumują się dwie funkcje kwadratowe:
−(x − m1)2 / (2σ12) − (x − m2)2 / (2σ22) = −½ (1/σ12 + 1/σ22) x2 + (m1/σ12 + m2/σ22) x + const.
Gęstość z wykładnikiem −½ ax2 + bx jest po uzupełnieniu do kwadratu normalna z wariancją 1/a i wartością oczekiwaną b/a. Stąd 1/σ2 = 1/σ12 + 1/σ22, czyli σ2 = σ12σ22 / (σ12 + σ22) = (1 − K) σ12, oraz m = σ2 (m1/σ12 + m2/σ22) = (1 − K) m1 + K m2 = m1 + K (m2 − m1). ∎
Weź pierwsze oszacowanie i przesuń je w stronę drugiego — tym bardziej, im bardziej ufasz drugiemu. Liczba K mówi, jaką część różnicy przejąć. Wynik jest dokładniejszy niż każdy z pomiarów z osobna; nawet zgrubny pomiar dodaje informację.
m = m1 + K (m2 − m1), K = σ12 / (σ12 + σ22), σ2 = (1 − K) σ12
- m1, σ12
- pierwsze oszacowanie (na rysunku niebieskie) jest punktem wyjścia — od niego się przesuwamy; jego wariancja w liczniku K mówi: im mniej ufamy pierwszemu oszacowaniu, tym dalej możemy się od niego oddalić
- m2, σ22
- drugie oszacowanie (bursztynowe); do wzoru wchodzi tylko przez różnicę m2 − m1 — gdyby oba się zgadzały, nie byłoby czego poprawiać. Jego wariancja w mianowniku K zmniejsza wzmocnienie: zgrubnemu pomiarowi ufamy mało
- K
- wzmocnienie Kalmana, liczba od 0 do 1 — jaką część różnicy przejąć. To udział niepewności pierwszego oszacowania w niepewności całkowitej, więc dokładniejsze oszacowanie „ciągnie“ wynik do siebie
- m, σ2
- połączone oszacowanie (zielone); czynnik 1 − K < 1 gwarantuje, że nowa niepewność jest mniejsza niż pierwsza — każdy pomiar, nawet zgrubny, coś dodaje
Tutaj K = 25 / (25 + 100) = 0,2: przejmujemy jedną piątą różnicy i dostajemy 102 m z niepewnością √20 ≈ 4,5 m — mniejszą niż 5 m dokładnego przyrządu. Ta liczba K to wzmocnienie Kalmana, a cały filtr to nic innego jak ten krok, powtarzany w czasie.
Przykład — połączenie pomiarów 100 ± 5 m i 110 ± 10 m krok po kroku
Wariancje: σ12 = 52 = 25, σ22 = 102 = 100.
Wzmocnienie: K = 25 / (25 + 100) = 0,2.
Wartość oczekiwana: m = 100 + 0,2 · (110 − 100) = 102 m — to samo co średnia ważona 0,8 · 100 + 0,2 · 110.
Wariancja: σ2 = (1 − 0,2) · 25 = 20, σ = √20 ≈ 4,47 m.
Sprawdzenie przez precyzje: 1/25 + 1/100 = 0,04 + 0,01 = 0,05 = 1/20. ✓
2. Powtarzany pomiar jednej wielkości
Temperaturę w pokoju mierzymy termometrem z niepewnością 2 °C, pięćdziesiąt razy z rzędu, i po każdym pomiarze łączymy nowy odczyt z dotychczasowym oszacowaniem. Po pięćdziesięciu pomiarach oszacowanie wynosi 19,895 °C — dokładnie średnią arytmetyczną wszystkich pomiarów — a niepewność 0,283 °C = 2/√50. Filtr Kalmana dla wielkości, która się nie zmienia, jest więc zwykłą średnią bieżącą. Ciekawy staje się dopiero wtedy, gdy wielkość zmienia się w czasie.
Twierdzenie — filtr dla niezmiennej wielkości to średnia bieżąca
Mierzymy stałą przyrządem o wariancji σ2 i zaczynamy od oszacowania tak niepewnego, że pierwszy pomiar całkowicie je przesłania (v0 → ∞). Wtedy po k pomiarach zachodzi
Kk = 1/k, mk = mk−1 + (1/k) (zk − mk−1) = (z1 + … + zk) / k, vk = σ2/k.
Dowód indukcyjny. Dla k = 1 jest K1 = v0 / (v0 + σ2) → 1, więc m1 = z1 i v1 = σ2. Jeśli vk−1 = σ2/(k − 1), to Kk = vk−1 / (vk−1 + σ2) = (1/(k − 1)) / (1/(k − 1) + 1) = 1/k oraz vk = (1 − 1/k) · σ2/(k − 1) = σ2/k. Jeśli mk−1 jest średnią pierwszych k − 1 pomiarów, to mk = ((k − 1) mk−1 + zk) / k jest średnią wszystkich k. ∎
Dziesiąty pomiar ma w średniej z dziesięciu liczb wagę jednej dziesiątej — i dokładnie tyle daje mu też filtr. Im więcej już wiemy, tym mniej porusza nami jeden nowy pomiar. Niepewność maleje jak 1/√k: żeby zmniejszyć błąd o połowę, potrzebujesz cztery razy więcej pomiarów.
Przykład — pierwsze trzy pomiary temperatury
Nasz filtr zaczyna od oszacowania 0 °C z wariancją 106 (niepewność 1 000 °C — „nic nie wiem“), wariancja pomiaru wynosi 22 = 4.
1. pomiar 23,098 °C: K1 = 106 / (106 + 4) ≈ 1, oszacowanie 23,098 °C, wariancja 4,00.
2. pomiar 21,967 °C: K2 = 4 / (4 + 4) = 1/2, oszacowanie 23,098 + ½ · (21,967 − 23,098) = 22,533 °C, wariancja 2,00.
3. pomiar 16,630 °C: K3 = 2 / (2 + 4) = 1/3, oszacowanie 22,533 + ⅓ · (16,630 − 22,533) = 20,565 °C, wariancja 1,33 = 4/3.
Sprawdzenie: (23,098 + 21,967 + 16,630) / 3 = 20,565 °C — zwykła średnia. Po pięćdziesięciu pomiarach wariancja wynosi 4/50 = 0,08, a niepewność √0,08 ≈ 0,283 °C.
3. Model w przestrzeni stanów
Definicja — liniowy model w przestrzeni stanów
Ukryty stan xk ∈ ℝn ewoluuje, a pomiar zk rejestruje go z szumem:
xk = F xk−1 + wk, wk ~ N(0, Q), zk = H xk + vk, vk ~ N(0, R).
F to macierz przejścia, H macierz pomiaru, Q kowariancja szumu procesu, a R kowariancja szumu pomiaru.
To ukryty model Markowa z poprzedniej części, tylko stan nie jest „uczciwą albo fałszywą kostką“, lecz wektorem liczb — na przykład położeniem i prędkością. Fizyka mówi, jak stan mniej więcej się zmienia (F), losowe wstrząsy i niedokładność modelu podsumowuje Q. Przyrząd pomiarowy widzi tylko część stanu (H) i myli się o R.
Nasz przykład: samochód jedzie drogą z mniej więcej stałą prędkością 15 m/s, ale kierowca czasem przyhamuje albo przyspieszy — losowe przyspieszenie z odchyleniem standardowym 0,5 m/s². Stan to (położenie, prędkość), krok 1 s, więc F = [[1, 1], [0, 1]]: nowe położenie to stare plus prędkość. GPS mierzy tylko położenie, z niepewnością 8 m: H = [1, 0], R = 64.
Definicja — macierz kowariancji i wielowymiarowy rozkład normalny
Dla wektora losowego X ∈ ℝn z wartością oczekiwaną μ = E[X] macierz kowariancji to Σ = E[(X − μ)(X − μ)T], tj. Σij = cov(Xi, Xj). Na przekątnej są wariancje składowych, poza nią kowariancje; macierz jest symetryczna i dodatnio półokreślona.
Zapis X ~ N(μ, Σ) oznacza wielowymiarowy rozkład normalny z gęstością proporcjonalną do exp(−½ (x − μ)T Σ−1 (x − μ)). Dla odwzorowania liniowego zachodzi AX + c ~ N(Aμ + c, A Σ AT), a suma niezależnych wektorów normalnych jest normalna z sumą kowariancji.
Macierz kowariancji to „niepewność dla wielu liczb naraz“. Na przekątnej stoi, jak bardzo nie jesteśmy pewni położenia i jak bardzo prędkości. Poza przekątną jest to, czy błędy idą w parze: dodatnia kowariancja położenia i prędkości oznacza „jeśli oszacowaliśmy samochód za bardzo z przodu, to najpewniej przypisaliśmy mu też za dużą prędkość“.
Przykład — skąd się bierze macierz Q
Podczas kroku o długości Δt na samochód działa stałe losowe przyspieszenie a ~ N(0, q2). Ze wzorów na ruch jednostajnie przyspieszony:
pk = pk−1 + Δt · vk−1 + ½ Δt2 a, vk = vk−1 + Δt · a.
Bez szumu to F = [[1, Δt], [0, 1]]. Szum to w = g a z wektorem g = (½ Δt2, Δt), a zgodnie z regułą AΣAT powyżej
Q = q2 g gT = q2 [[Δt4/4, Δt3/2], [Δt3/2, Δt2]].
Dla Δt = 1 s i q = 0,5 m/s²: Q = 0,25 · [[0,25; 0,5], [0,5; 1]] = [[0,0625; 0,125], [0,125; 0,25]]. W ciągu jednej sekundy losowe przyspieszenie dodaje więc niepewność √0,0625 = 0,25 m w położeniu i 0,5 m/s w prędkości — a oba błędy mają ten sam znak, dlatego kowariancja jest dodatnia. Dokładnie ta macierz jest w kodzie poniżej.
4. Predykcja i korekcja
Algorytm — filtr Kalmana
Oszacowanie to rozkład normalny z wartością oczekiwaną x̂ i kowariancją P. W każdym kroku:
Predykcja: x̂− = F x̂, P− = F P FT + Q.
Korekcja: K = P− HT (H P− HT + R)−1, x̂ = x̂− + K (z − H x̂−), P = (I − K H) P−.
Predykcja: „według fizyki samochód powinien być teraz tutaj“ — a ponieważ fizyka nie jest doskonała, niepewność trochę rośnie. Korekcja: przychodzi pomiar; różnica między pomiarem a predykcją (innowacja) zostaje przejęta tylko w części K, zależnie od tego, komu bardziej ufamy. To połączenie dwóch pomiarów z pierwszego rozdziału — jednym „pomiarem“ jest predykcja z poprzedniego kroku, drugim GPS. Kowariancja P pamięta ponadto, jak ze sobą związane są błąd położenia i prędkości, i dzięki temu filtr poprawia też prędkość, której nikt nie mierzy.
Kolory w rozbiorach poniżej odpowiadają rysunkom: predykcja (wcześniej „pierwsze oszacowanie“) na niebiesko, pomiar na bursztynowo, wynik na zielono, wzmocnienie na fioletowo.
x̂− = F x̂, P− = F P FT + Q
- x̂−, P−
- predykcja na ten krok, zanim przyjdzie pomiar — pełni rolę „pierwszego oszacowania“ z połączenia dwóch pomiarów
- F … FT
- model przesuwa oszacowanie do przodu; niepewność przenosi się regułą AΣAT (w samochodzie: niepewna prędkość po sekundzie przekłada się na niepewność położenia). Nie wystarczy FP, bo kowariancja jest wielkością kwadratową — mnoży się z lewej i z prawej
- Q
- model nie jest doskonały (kierowca przyhamuje), więc niepewność dodaje się w każdym kroku — bez Q macierz P spadłaby do zera, a filtr przestałby słuchać pomiarów
K = P− HT (H P− HT + R)−1
- H P− HT
- niepewność predykcji przeliczona na język przyrządu pomiarowego (w samochodzie tylko wariancja położenia) — odpowiada σ12
- R
- wariancja pomiaru, odpowiada σ22; suma w nawiasie to wariancja innowacji S — o ile pomiar i predykcja mogą się rozjechać czysto przypadkiem
- P− HT
- kowariancja całego stanu z mierzoną wielkością; dzięki niej niezerowe wzmocnienie dostaje też prędkość, której nikt nie mierzy — błąd położenia i prędkości są ze sobą powiązane
- K
- wzmocnienie Kalmana, po jednej liczbie dla każdej składowej stanu; odwrotność zamiast dzielenia tylko dlatego, że pomiar może być wektorem
x̂ = x̂− + K (z − H x̂−), P = (I − K H) P−
- x̂−, P−
- predykcja — punkt wyjścia, od którego się przesuwamy
- z
- nowy pomiar (na rysunku bursztynowe punkty GPS); jedyne miejsce, którym dane wchodzą do oszacowania
- H
- przekłada predykcję stanu na to, co powinien pokazać przyrząd pomiarowy; pomiaru i stanu nie da się odjąć bezpośrednio, bo GPS widzi tylko położenie, nie prędkość
- K
- jaką część innowacji z − Hx̂− przejąć do każdej składowej stanu
- x̂, P
- poprawione oszacowanie (na rysunku zielone); czynnik I − KH zmniejsza niepewność — tym bardziej, im większą część pomiaru przejęliśmy
import numpy as np
F = np.array([[1, 1], [0, 1]]) # położenie += prędkość
H = np.array([[1, 0]]) # mierzymy tylko położenie
Q = 0.5**2 * np.array([[1/4, 1/2], [1/2, 1]]) # losowe przyspieszenie
R = np.array([[8**2]]) # GPS ± 8 m
def kalman(mereni, x, P):
for z in mereni:
x, P = F @ x, F @ P @ F.T + Q # predykcja
K = P @ H.T @ np.linalg.inv(H @ P @ H.T + R)
x = x + K @ (z - H @ x) # korekcja według innowacji
P = (np.eye(2) - K @ H) @ P
yield x, P
Przykład — pierwsze dwa kroki filtru na danych samochodu
Start. Pierwszy pomiar GPS to z1 = 8,44 m. Filtr zaczyna od położenia 8,44 m, prędkości 0 i dużej niepewności P0 = [[100; 0], [0; 100]] (10 m i 10 m/s). Korekcja tym samym pomiarem nie zmienia położenia (innowacja wynosi 0), tylko zmniejsza jego wariancję: K = 100 / (100 + 64) = 0,610, P11 = (1 − 0,610) · 100 = 39,02.
Predykcja na 2. sekundę. x̂− = (8,44 + 0; 0) = (8,44; 0,00). Kowariancja FPFT dodaje do wariancji położenia wariancję prędkości (położenie += prędkość):
P− = [[39,02 + 100 + 0,0625; 100 + 0,125], [100 + 0,125; 100 + 0,25]] = [[139,09; 100,13], [100,13; 100,25]].
Korekcja. Pomiar z2 = 23,23 m, innowacja y = 23,23 − 8,44 = 14,78 m, jej wariancja S = 139,09 + 64 = 203,09.
K = (139,09; 100,13) / 203,09 = (0,685; 0,493),
x̂ = (8,44 + 0,685 · 14,78; 0 + 0,493 · 14,78) = (18,57 m; 7,29 m/s).
Po dwóch pomiarach filtr „wie“, że samochód się porusza, choć prędkości nikt nie mierzył: oszacował 7,3 m/s (w rzeczywistości 13,9 m/s). Wzmocnienie dla prędkości jest niezerowe tylko dzięki kowariancji 100,13 poza przekątną. Dlaczego tylko połowa? Pomiary są zaszumione o 8 m, więc filtr nie traktuje jeszcze różnicy 15 m całkiem poważnie — w kolejnych sekundach prędkość się dostroi.
5. Filtr śledzi samochód
Minuta jazdy, jeden pomiar GPS na sekundę. W tym czasie samochód przejeżdża niecały kilometr, więc szum zgubiłby się na wykresie położenia. Rysujemy więc, o ile samochód jest z przodu lub z tyłu w porównaniu z jazdą dokładnie 15 m/s:
Pomiary GPS odbiegają od rzeczywistego położenia średnio o 8,3 m (od dziesiątej sekundy, kiedy filtr się rozpędzi). Oszacowanie filtru tylko o 4,9 m — o 41 % mniej. A prędkość, której żaden czujnik nie mierzy, szacuje z błędem 0,8 m/s: filtr wyprowadza ją z tego, jak zmienia się położenie. Na początku prędkości nie zna (zaczyna od zera), ale po kilku sekundach ją łapie. Pas ±2σ to uczciwa niepewność filtru — rzeczywiste położenie leży w nim w 95 % kroków, dokładnie tak, jak powinno.
Definicja — średni błąd (RMSE) i pas ±2σ
„Średni błąd“ w tej części to pierwiastek błędu średniokwadratowego (RMSE) po krokach k = 10, …, 59 (N = 50):
RMSE = √( (1/N) ∑k (x̂k − xk)2 ),
gdzie xk to rzeczywiste położenie, a x̂k oszacowanie (albo sam pomiar). Kwadraty karzą duże błędy bardziej niż małe, a pierwiastek przywraca wynik do metrów. Dla samego GPS RMSE powinien wyjść około σ = 8 m — i wyszedł 8,3 m.
Pas ±2σ to przedział x̂k ± 2√Pk,11. Dla rozkładu normalnego w przedziale μ ± 2σ leży prawdopodobieństwo 0,9545; jeśli filtr ma niepewność P policzoną poprawnie, rzeczywistość musi trafić do pasa w mniej więcej 95 % kroków.
Wzmocnienie Kalmana po kilku krokach ustala się na K ≈ (0,30; 0,05): z każdej innowacji filtr przejmuje 30 % do położenia i 5 % (na metr innowacji 0,05 m/s) do prędkości. W 50 symulowanych przejazdach błąd filtru wynosi średnio 55 % błędu samego GPS.
Twierdzenie — ustalone wzmocnienie
We wzorach na P−, K i P nie ma pomiarów z — kowariancję i wzmocnienie da się policzyć z góry. Połączenie predykcji i korekcji daje rekurencję (dyskretne równanie Riccatiego)
P−k+1 = F (P−k − P−kHT (HP−kHT + R)−1 HP−k) FT + Q.
Dla stałych F, H, Q, R spełniających zwykłe warunki (układ jest obserwowalny — z serii pomiarów da się ustalić cały stan — a szum Q działa na wszystkie jego składowe) ciąg zbiega do jedynego punktu stałego niezależnie od początkowego P0; wzmocnienie zbiega wtedy do wartości ustalonej.
W samochodzie: po 60 krokach K = (0,297; 0,052), a P = [[19,04; 3,35], [3,35; 1,29]], czyli filtr ufa sobie z dokładnością √19,04 ≈ 4,4 m w położeniu i √1,29 ≈ 1,1 m/s w prędkości.
Na początku filtr nie wie prawie nic i chłonie każdy pomiar (wzmocnienie 0,61, potem 0,68). W miarę jak oszacowanie staje się dokładniejsze, wzmocnienie maleje — aż ustali się tam, gdzie niepewność dodana w kroku przez szum Q jest tak samo duża jak ta, którą odejmuje pomiar. Dalej już nic się nie zmienia i dlatego w prostych urządzeniach wzmocnienie często liczy się raz z góry, a filtr potem tylko mnoży przez stałe liczby.
6. Komu ufać: Q i R
Filtr musi znać Q i R. Dla GPS producent zwykle je podaje, ale szum procesu szacuje się trudniej. Co, jeśli dasz filtrowi inne wartości niż te, które mają dane?
| Szum procesu, któremu ufa filtr (m/s²) | 0,01 | 0,1 | 0,5 (prawda) | 2 | 10 |
|---|---|---|---|---|---|
| błąd położenia (m) | 9,29 | 5,88 | 4,86 | 5,67 | 7,08 |
| błąd prędkości (m/s) | 1,19 | 0,86 | 0,79 | 1,53 | 5,19 |
Kiedy filtr wierzy, że samochód jedzie prawie dokładnie ze stałą prędkością (małe Q), trzyma się swojego modelu i na rzeczywiste przyspieszenie reaguje z opóźnieniem — błąd położenia jest nawet większy niż dla samego GPS. Kiedy natomiast spodziewa się gwałtownych zmian (duże Q), nie ufa modelowi i kopiuje zaszumione pomiary. Najlepiej wypada z rzeczywistą wartością 0,5. To samo dotyczy R: przy niepewności GPS 2, 8 i 30 m błąd położenia wychodzi 5,66; 4,86 i 5,39 m.
7. Dlaczego właśnie tak
Twierdzenie — optymalność filtru Kalmana
Jeśli model jest liniowy, a szumy normalne, rozkład N(x̂k, Pk) jest dokładnie rozkładem a posteriori stanu P(xk | z1, …, zk). Bez założenia normalności filtr Kalmana jest najlepszym liniowym estymatorem w sensie błędu średniokwadratowego.
Filtr Kalmana to twierdzenie Bayesa stosowane raz za razem. Predykcja jest rozkładem a priori, pomiar jest wiarygodnością, korekcja jest rozkładem a posteriori. Rozkład normalny ma tę rzadką własność, że iloczyn rozkładów normalnych jest znowu normalny — i dlatego wystarczy pamiętać wartość oczekiwaną i kowariancję zamiast całej funkcji. To algorytm forward z ukrytych modeli Markowa dla stanu ciągłego.
p(xk | z1:k) ∝ p(zk | xk) · ∫ p(xk | xk−1) p(xk−1 | z1:k−1) dxk−1
- ∫ p(xk | xk−1) p(xk−1 | z1:k−1) dxk−1
- predykcja (rozkład a priori): poprzedniego stanu nie znamy dokładnie, więc uśredniamy przejście po wszystkich możliwych poprzednich stanach, ważonych tym, w co wierzyliśmy ostatnio. Całka to ciągły odpowiednik sumy ∑i w algorytmie forward dla HMM. Dla modelu liniowego i rozkładu normalnego wychodzi N(Fx̂, FPFT + Q)
- p(zk | xk)
- wiarygodność nowego pomiaru — jak dobrze każde miejsce wyjaśniałoby to, co pokazał GPS; z modelu to N(zk; Hxk, R)
- p(xk | z1:k)
- rozkład a posteriori po wszystkich pomiarach; „∝“ dlatego, że stałej normalizującej p(zk | z1:k−1) nie potrzebujemy — iloczyn dwóch gęstości normalnych dolicza dowód twierdzenia z początku części, i wychodzi z niego dokładnie krok korekcji
8. Kiedy świat nie jest liniowy
- Rozszerzony filtr Kalmana (EKF) w każdym kroku linearyzuje model nieliniowy za pomocą pochodnej — tak robiła też nawigacja Apolla.
- Bezśladowy filtr Kalmana (UKF, ang. unscented) zamiast pochodnych przepuszcza przez model kilka starannie wybranych punktów i z nich liczy nową wartość oczekiwaną i kowariancję.
- Filtr cząsteczkowy całkowicie rezygnuje z rozkładu normalnego: oszacowanie reprezentuje tysiącami próbek („cząstek“), które poruszają się według modelu i są przeważane według pomiarów. Poradzi sobie nawet z oszacowaniem o wielu wierzchołkach, na przykład „robot jest albo w kuchni, albo w salonie“.
- Gdzie wszędzie: łączenie GPS, akcelerometru i żyroskopu w telefonach, nawigacja samolotów, dronów i rakiet, śledzenie obiektów radarem, szacowanie położenia samochodów autonomicznych, a nawet wygładzanie ekonomicznych szeregów czasowych.
Definicja — rozszerzony filtr Kalmana (EKF)
Model jest nieliniowy: xk = f(xk−1) + wk, zk = h(xk) + vk. EKF liczy wartość oczekiwaną funkcjami nieliniowymi, a kowariancję ich macierzami Jacobiego (macierzami pochodnych cząstkowych) w bieżącym oszacowaniu:
Fk = ∂f/∂x |x̂k−1, Hk = ∂h/∂x |x̂−k,
x̂− = f(x̂), P− = Fk P FkT + Q, x̂ = x̂− + K (z − h(x̂−)), K i P jak wcześniej z Hk zamiast H.
Przykład: radar mierzy odległość h(px, py) = √(px2 + py2); wtedy Hk = (px/d, py/d) z d = √(px2 + py2) — wektor jednostkowy w kierunku celu. Dla celu w (300, 400) m jest d = 500 m i Hk = (0,6; 0,8). Wynik nie jest już dokładnym rozkładem a posteriori, tylko jego przybliżeniem; im bardziej model jest zakrzywiony w zakresie niepewności, tym gorszym.
9. Podsumowanie
- Dwa niezależne normalne pomiary łączy się średnią ważoną; precyzje się sumują, a waga K to wzmocnienie Kalmana.
- Filtr Kalmana powtarza predykcję według modelu i korekcję według pomiaru; dla niezmiennej wielkości to średnia bieżąca.
- W samochodzie zmniejszył błąd położenia z 8,3 m (GPS) do 4,9 m i oszacował też niemierzoną prędkość z błędem 0,8 m/s; pas ±2σ objął rzeczywistość w 95 % kroków.
- Wynik zależy od Q i R: zbyt duże zaufanie do modelu reaguje z opóźnieniem, zbyt małe kopiuje szum.
- Dla modelu liniowego z szumem normalnym filtr jest dokładną aktualizacją bayesowską; z nieliniowym światem radzą sobie EKF, UKF i filtry cząsteczkowe.
Tą częścią kończy się moduł o modelach probabilistycznych. Chcesz to wypróbować w praktyce? Poproś agenta AI, żeby napisał filtr Kalmana dla danych z akcelerometru twojego telefonu, i sprawdź, jak dobrze oszacuje z nich, o ile przesunąłeś telefon.
Masz inne zdanie? Napisz na support@coden-app.com.