Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
Spojení dvou měření a Kalmanův zisk, filtr jako průběžný průměr, stavový model, předpověď a oprava, sledování auta podle GPS s odhadem neměřené rychlosti, ladění šumů Q a R, optimalita a nelineární rozšíření.
Série Základy AI Díl 41 z 83
- Mapa umělé inteligence: co je co a jak to do sebe zapadá
- Stručná historie umělé inteligence: od Turinga po jazykové modely
- Data, model, trénink, inference: základní pojmy na jednom příkladu
- Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
- Množiny a relace: stavebnice, ze které se skládají definice v AI
- Funkce a zobrazení: proč je každý model v AI funkce
- Logika a důkazy: pravidla, podle kterých se v AI uvažuje
- Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
- Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
- Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
- Gradientní sestup: jak se model učí
- Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
- Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
- Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
- Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
- Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
- Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
- Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
- Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
- Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
- Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
- Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
- Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
- Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
- Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
- Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
- Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
- Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
- Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
- Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
- Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
- Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
- Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
- Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
- Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
- Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
- Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
- Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
- Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
- Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
- Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
- Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
- Přeučení a regularizace: proč model, který zná data nazpaměť, selže
- Vyhodnocení modelu: křížová validace, F1 a křivka ROC
- Shlukování a snížení dimenze: k-means, PCA a t-SNE
- Klasifikace a regrese: dvě úlohy učení s učitelem
- Lineární regrese: nejmenší čtverce geometricky i maticově
- Polynomiální a nelineární regrese: jak přímku ohnout
- Logistická regrese: sigmoida, šance a křížová entropie
- Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
- Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
- Ztrátové funkce: co přesně model minimalizuje
- Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
- Ansámbly: náhodný les a gradient boosting
- SVM a jádrový trik: nejširší hranice a jak ji ohnout
- Signál a vzorkování: proč platí Nyquistův teorém
- Fourierova transformace: rozklad signálu na frekvence
- Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
- Zvuk a řeč: spektrogram, melová škála a MFCC
- Obraz jako signál: pixely, barvy, konvoluce a hrany
- Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
- Neuronová síť od nuly: zpětné šíření chyby krok za krokem
- Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
- Konvoluční sítě: jak síť poznává obrázky
- Rekurentní sítě: paměť pro posloupnosti a mizející gradient
- LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
- Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
- Embeddingy a word2vec: jak se slovo stane vektorem
- Mechanismus pozornosti: jak se model naučí, kam se dívat
- Transformery a velké jazykové modely: architektura krok za krokem
- Tokenizace: jak se text rozseká na kousky pro model
- Předtrénování a škálování: proč větší model a víc dat funguje
- Doladění a RLHF: jak se z doplňovače textu stane asistent
- Prompty, kontext a RAG: jak modelu dát správné informace
- Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
- Generativní adversariální sítě (GAN): padělatel proti detektivovi
- Difúzní modely: jak se z čistého šumu stane obrázek
- Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
- Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
- Policy gradient a PPO: učení přímo strategie
- Jak funguje AI agent: jazykový model ve smyčce s nástroji
- Programování s AI agenty: zadání, testy a kontrola
- Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat
Celá osnova série 83 z 83 témat hotovo
- Jak se spojí dvě nepřesná měření a co je Kalmanův zisk.
- Jak filtr střídá předpověď podle modelu a opravu podle měření — a odhadne i to, co nikdo neměří.
- Proč na nastavení šumů Q a R tolik záleží a jak si filtr poradí s nelineárním světem.
Co se hodí znát předem: Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino, Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
Loď Apollo 11 letěla k Měsíci s palubním počítačem, který měl méně paměti než dnešní grafická kalkulačka. Navigace přitom musela z nepřesných měření hvězd, radaru a setrvačných čidel průběžně odhadovat, kde loď je a jak rychle letí. Pomohla jí metoda, kterou v roce 1960 publikoval Rudolf Kálmán a kterou pro NASA dotáhl do praxe Stanley Schmidt. Kalmanův filtr je dnes v každém mobilu, který spojuje GPS s akcelerometrem, v každém dronu a v každém autě, které samo udrží jízdní pruh. Tímhle dílem končí modul o pravděpodobnostních modelech.
Navazuje na díly Skryté Markovovy modely a Přehled pravděpodobnostních rozdělení.
1. Dvě nepřesná měření jsou lepší než jedno
Začneme jednoduše. Vzdálenost k majáku změříme dvakrát: jednou přesným přístrojem — 100 m s nejistotou (směrodatnou odchylkou) 5 m —, podruhé hrubým — 110 m s nejistotou 10 m. Co je nejlepší odhad?
Věta — spojení dvou normálních odhadů
Nechť x ∈ ℝ je neznámá veličina, m1, m2 ∈ ℝ a σ12, σ22 > 0. Nechť první odhad říká x ~ N(m1, σ12) (apriorní rozdělení) a druhý odhad je pozorování m2 = x + ε, kde šum ε ~ N(0, σ22) je nezávislý na x (normální rozdělení viz díl Přehled pravděpodobnostních rozdělení). Označme
K = σ12/σ12 + σ22 ∈ (0, 1).
Pak spojený odhad — podmíněné (aposteriorní) rozdělení x při pozorování m2 — je normální N(m, σ2) s
m = m1 + K (m2 − m1), σ2 = (1 − K) σ12.
Ekvivalentně 1/σ2 = 1/σ12 + 1/σ22: přesnosti (převrácené rozptyly) se sčítají.
Důkaz. Podle Bayesovy věty je aposteriorní hustota úměrná součinu apriorní hustoty a věrohodnosti, tj. obou normálních hustot. V exponentu se sčítají dvě kvadratické funkce x:
−(x − m1)2/2σ12 − (x − m2)2/2σ22 = −1/2 (1/σ12 + 1/σ22) x2 + (m1/σ12 + m2/σ22) x + konst.
Hustota s exponentem −1/2 ax2 + bx + konst. (a > 0) je po doplnění na čtverec normální s rozptylem 1/a a střední hodnotou b/a. Odtud 1/σ2 = 1/σ12 + 1/σ22, tedy
σ2 = σ12σ22/σ12 + σ22 = (1 − K) σ12, m = σ2 (m1/σ12 + m2/σ22) = (1 − K) m1 + K m2 = m1 + K (m2 − m1). ∎
Vezměte první odhad a posuňte ho směrem k druhému — tím víc, čím víc druhému věříte. Číslo K říká, jak velký kus rozdílu převzít. Výsledek je přesnější než každé z měření samo; i hrubé měření přidá informaci.
m = m1 + K (m2 − m1), K = σ12/σ12 + σ22, σ2 = (1 − K) σ12
- m1, σ12
- první odhad (v obrázku modrý) je výchozí bod — od něj se posouváme; jeho rozptyl v čitateli K říká: čím méně věříme prvnímu odhadu, tím dál od něj se smíme pohnout
- m2, σ22
- druhý odhad (jantarový); do vzorce vstupuje jen rozdílem m2 − m1 — kdyby se oba shodovaly, není co opravovat. Jeho rozptyl ve jmenovateli K zisk zmenšuje: hrubému měření věříme málo
- K
- Kalmanův zisk, číslo mezi 0 a 1 — jaký podíl rozdílu převzít. Je to podíl nejistoty prvního odhadu na celkové nejistotě, takže přesnější odhad „táhne“ výsledek k sobě
- m, σ2
- spojený odhad (zelený); činitel 1 − K < 1 zaručuje, že nová nejistota je menší než ta první — každé měření, i hrubé, něco přidá
Tady K = 25/25 + 100 = 0,2 (barvy podle vzorce výše): převezmeme pětinu rozdílu a dostaneme 102 m s nejistotou √20 ≈ 4,5 m — méně než 5 m přesného přístroje. Tohle číslo K je Kalmanův zisk a celý filtr není nic jiného než tenhle krok, opakovaný v čase.
Příklad — spojení měření 100 ± 5 m a 110 ± 10 m krok za krokem
Barvy podle rozboru vzorce výše.
Rozptyly: σ12 = 52 = 25, σ22 = 102 = 100.
Zisk: K = 25/25 + 100 = 0,2.
Střední hodnota: m = 100 + 0,2 · (110 − 100) = 102 m — totéž jako vážený průměr 0,8 · 100 + 0,2 · 110.
Rozptyl: σ2 = (1 − 0,2) · 25 = 20, σ = √20 ≈ 4,47 m.
Kontrola přes přesnosti: 1/25 + 1/100 = 0,04 + 0,01 = 0,05 = 1/20. ✓
2. Opakované měření jedné veličiny
Teplotu v místnosti měříme teploměrem s nejistotou 2 °C, padesátkrát po sobě, a po každém měření spojíme nový údaj s dosavadním odhadem. Po padesáti měřeních je odhad 19,895 °C — přesně aritmetický průměr všech měření — a nejistota 0,283 °C = 2/√50. Kalmanův filtr pro veličinu, která se nemění, je tedy obyčejný průběžný průměr. Zajímavý začne být, když se veličina v čase mění.
Věta — filtr pro neměnnou veličinu je průběžný průměr
Nechť σ2 > 0 je rozptyl měřidla a z1, z2, … ∈ ℝ jsou měření neměnné veličiny. Filtr začne odhadem m0 ∈ ℝ s rozptylem v0 > 0 a pro k = 1, 2, … spojí dosavadní odhad N(mk−1, vk−1) s měřením zk podle předchozí věty:
Kk = vk−1/vk−1 + σ2, mk = mk−1 + Kk (zk − mk−1), vk = (1 − Kk) vk−1.
Pak v limitě v0 → ∞ (počáteční odhad je tak nejistý, že ho první měření úplně přebije) platí pro každé k ≥ 1
Kk = 1/k, mk = z1 + … + zk/k, vk = σ2/k.
Důkaz indukcí podle k. Pro k = 1 je K1 = v0/v0 + σ2 → 1, takže m1 = m0 + K1(z1 − m0) → z1 a v1 = v0σ2/v0 + σ2 → σ2. Nechť k ≥ 2 a tvrzení platí pro k − 1, tj. vk−1 = σ2/k − 1 a mk−1 je průměr z1, …, zk−1. Pak
Kk = vk−1/vk−1 + σ2 = 1/k − 1/1/k − 1 + 1 = 1/k, vk = (1 − 1/k) · σ2/k − 1 = σ2/k,
mk = mk−1 + 1/k (zk − mk−1) = (k − 1) mk−1 + zk/k,
a to je průměr všech k měření, protože (k − 1) mk−1 = z1 + … + zk−1. ∎
Desáté měření má v průměru deseti čísel váhu jedna desetina — a přesně tolik mu dá i filtr. Čím víc toho už víme, tím méně nás jedno nové měření pohne. Nejistota klesá jako 1/√k: pro poloviční chybu potřebujete čtyřikrát víc měření.
Příklad — první tři měření teploty
Náš filtr začíná odhadem 0 °C s rozptylem 106 (nejistota 1 000 °C — „nevím nic“), rozptyl měření je 22 = 4.
Každý krok je spojení dvou odhadů z první kapitoly: dosavadní odhad hraje roli prvního, měření druhého (barvy podle rozboru vzorce pro spojení výše).
1. měření 23,098 °C: K1 = 106/106 + 4 ≈ 1, odhad 23,098 °C, rozptyl 4,00.
2. měření 21,967 °C: K2 = 4/4 + 4 = 1/2, odhad 23,098 + 1/2 · (21,967 − 23,098) = 22,533 °C, rozptyl 2,00.
3. měření 16,630 °C: K3 = 2/2 + 4 = 1/3, odhad 22,533 + 1/3 · (16,630 − 22,533) = 20,565 °C, rozptyl 1,33 = 4/3.
Kontrola: 23,098 + 21,967 + 16,630/3 = 20,565 °C — obyčejný průměr. Po padesáti měřeních je rozptyl 4/50 = 0,08 a nejistota √0,08 ≈ 0,283 °C.
3. Stavový model
Definice — lineární stavový model
Nechť n, m ≥ 1 jsou rozměry stavu a měření a
- F ∈ ℝn×n je přechodová matice,
- H ∈ ℝm×n je matice měření,
- Q ∈ ℝn×n je symetrická pozitivně semidefinitní matice — kovariance procesního šumu,
- R ∈ ℝm×m je symetrická pozitivně definitní matice — kovariance šumu měření,
- x̂0 ∈ ℝn a symetrická pozitivně semidefinitní P0 ∈ ℝn×n popisují počáteční stav x0 ~ N(x̂0, P0).
Lineární stavový model je posloupnost náhodných vektorů — skrytých stavů xk ∈ ℝn a měření zk ∈ ℝm, k = 1, 2, … — pro které platí
xk = F xk−1 + wk, wk ~ N(0, Q), zk = H xk + vk, vk ~ N(0, R),
kde x0, w1, w2, …, v1, v2, … jsou navzájem nezávislé. (Vícerozměrné normální rozdělení N(μ, Σ) a kovarianční matici definujeme níže.) Stav se tedy vyvíjí podle F s náhodnými nárazy wk a měření ho zachycuje přes H se šumem vk.
Je to skrytý Markovův model z minulého dílu, jen stav není „poctivá nebo falešná kostka“, ale vektor čísel — třeba poloha a rychlost. Fyzika říká, jak se stav zhruba vyvíjí (F), náhodné nárazy a nepřesnost modelu shrnuje Q. Měřidlo vidí jen část stavu (H) a plete se o R.
Náš příklad: auto jede po silnici zhruba stálou rychlostí 15 m/s, ale řidič občas přibrzdí nebo přidá — náhodné zrychlení se směrodatnou odchylkou 0,5 m/s². Stav je (poloha, rychlost), krok 1 s, takže F = [[1, 1], [0, 1]]: nová poloha je stará plus rychlost. GPS měří jen polohu, s nejistotou 8 m: H = [1, 0], R = 64.
Definice — kovarianční matice a vícerozměrné normální rozdělení
Nechť n ≥ 1 a X = (X1, …, Xn)T je náhodný vektor, jehož složky jsou náhodné veličiny s konečným rozptylem. Jeho střední hodnota je vektor μ = E[X] = (E[X1], …, E[Xn])T ∈ ℝn (střední hodnota a kovariance viz díl Střední hodnota, rozptyl a kovariance). Jeho kovarianční matice je Σ ∈ ℝn×n,
Σ = E[(X − μ)(X − μ)T], tj. Σij = cov(Xi, Xj) = E[(Xi − μi)(Xj − μj)] pro i, j = 1, …, n.
Na diagonále jsou rozptyly složek (Σii = var Xi), mimo ni kovariance. Matice je symetrická (Σ = ΣT) a pozitivně semidefinitní: pro každé a ∈ ℝn je aTΣa = var(aTX) ≥ 0.
Nechť μ ∈ ℝn a Σ ∈ ℝn×n je symetrická pozitivně definitní matice. Náhodný vektor X má vícerozměrné normální rozdělení, píšeme X ~ N(μ, Σ), právě když má hustotu
f(x) = 1/√(2π)n det Σ exp(−1/2 (x − μ)T Σ−1 (x − μ)), x ∈ ℝn.
Pak E[X] = μ a kovarianční matice X je Σ. Díl používá dvě vlastnosti:
- Je-li X ~ N(μ, Σ), A ∈ ℝp×n a c ∈ ℝp, pak AX + c ~ N(Aμ + c, A Σ AT) (je-li AΣAT singulární, jde o tzv. degenerované normální rozdělení bez hustoty).
- Jsou-li X ~ N(μ1, Σ1) a Y ~ N(μ2, Σ2) nezávislé vektory v ℝn, pak X + Y ~ N(μ1 + μ2, Σ1 + Σ2).
Kovarianční matice je „nejistota pro víc čísel najednou“. Na diagonále stojí, jak moc si nejsme jistí polohou a jak moc rychlostí. Mimo diagonálu je, jestli se chyby drží spolu: kladná kovariance polohy a rychlosti znamená „když jsme auto odhadli moc vpředu, nejspíš jsme mu přisoudili i moc velkou rychlost“.
Příklad — odkud se vezme matice Q
Během kroku délky Δt působí na auto stálé náhodné zrychlení a ~ N(0, q2). Ze vzorců pro rovnoměrně zrychlený pohyb:
pk = pk−1 + Δt · vk−1 + ½ Δt2 a, vk = vk−1 + Δt · a.
Bez šumu je to F = [[1, Δt], [0, 1]]. Šum je w = g a s vektorem g = (½ Δt2, Δt), a podle pravidla AΣAT výše
Q = q2 g gT = q2 [[Δt4/4, Δt3/2], [Δt3/2, Δt2]].
Pro Δt = 1 s a q = 0,5 m/s²: Q = 0,25 · [[0,25; 0,5], [0,5; 1]] = [[0,0625; 0,125], [0,125; 0,25]]. Za jednu sekundu tedy náhodné zrychlení přidá nejistotu √0,0625 = 0,25 m v poloze a 0,5 m/s v rychlosti — a obě chyby mají stejné znaménko, proto je kovariance kladná. Přesně tahle matice je v kódu níže.
4. Předpověď a oprava
Algoritmus — Kalmanův filtr
Vstup: matice F, H, Q, R lineárního stavového modelu (definice výše), počáteční odhad x̂0 ∈ ℝn s kovariancí P0 ∈ ℝn×n (symetrická, pozitivně semidefinitní) a měření z1, …, zT ∈ ℝm.
Výstup: pro každé k = 1, …, T odhad x̂k ∈ ℝn a jeho kovariance Pk ∈ ℝn×n — střední hodnota a kovariance normálního rozdělení, kterým filtr popisuje stav xk po měřeních z1, …, zk. I je jednotková matice n × n.
Kroky: pro k = 1, 2, …, T postupně:
- Předpověď: x̂k− = F x̂k−1, Pk− = F Pk−1 FT + Q.
- Inovace a její kovariance: yk = zk − H x̂k−, Sk = H Pk− HT + R (je pozitivně definitní, protože R je, a tedy invertibilní).
- Zisk: Kk = Pk− HT Sk−1 ∈ ℝn×m.
- Oprava: x̂k = x̂k− + Kk yk, Pk = (I − Kk H) Pk−.
Algoritmus skončí po zpracování posledního měření zT (při průběžném běhu pokračuje s každým novým měřením). V rozborech níže index k vynecháváme: x̂, P vpravo jsou hodnoty z minulého kroku, vlevo nové.
Předpověď: „podle fyziky by auto teď mělo být tady“ — a protože fyzika není dokonalá, nejistota trochu vzroste. Oprava: přijde měření; rozdíl mezi měřením a předpovědí (inovace) se převezme jen z části K, podle toho, komu víc věříme. Je to spojení dvou měření z první kapitoly — jedním „měřením“ je předpověď z minula, druhým GPS. Kovariance P si navíc pamatuje, jak spolu souvisí chyba polohy a rychlosti, a díky tomu filtr opravuje i rychlost, kterou nikdo neměří.
Barvy v rozborech níže sedí s obrázky: předpověď (dřív „první odhad“) modře, měření jantarově, výsledek zeleně, zisk fialově.
x̂− = F x̂, P− = F P FT + Q
- x̂−, P−
- předpověď na tento krok, než přijde měření — hraje roli „prvního odhadu“ ze spojení dvou měření
- F … FT
- model posune odhad dopředu; nejistota se přenáší pravidlem AΣAT (u auta: nejistá rychlost se za sekundu promítne do nejistoty polohy). Nestačí FP, protože kovariance je kvadratická veličina — násobí se zleva i zprava
- Q
- model není dokonalý (řidič přibrzdí), takže se nejistota přičítá v každém kroku — bez Q by P klesla k nule a filtr by přestal měření poslouchat
K = P− HT (H P− HT + R)−1
- H P− HT
- nejistota předpovědi přepočtená do řeči měřidla (u auta jen rozptyl polohy) — odpovídá σ12
- R
- rozptyl měření, odpovídá σ22; součet v závorce je rozptyl inovace S — o kolik se měření a předpověď mohou rozcházet čistě náhodou
- P− HT
- kovariance celého stavu s měřenou veličinou; díky ní dostane nenulový zisk i rychlost, kterou nikdo neměří — chyba polohy a rychlosti spolu souvisí
- K
- Kalmanův zisk, pro každou složku stavu jedno číslo; inverze místo dělení jen proto, že měření může být vektor
x̂ = x̂− + K (z − H x̂−), P = (I − K H) P−
- x̂−, P−
- předpověď — výchozí bod, od kterého se posouváme
- z
- nové měření (v obrázku jantarové body GPS); jediné místo, kudy do odhadu vstupují data
- H
- převede předpověď stavu na to, co by měřidlo mělo ukázat; měření a stav se nedají odečíst přímo, protože GPS vidí jen polohu, ne rychlost
- K
- jaký podíl inovace z − Hx̂− převzít do každé složky stavu
- x̂, P
- opravený odhad (v obrázku zelený); činitel I − KH nejistotu zmenší — tím víc, čím větší díl měření jsme převzali
import numpy as np
F = np.array([[1, 1], [0, 1]]) # poloha += rychlost
H = np.array([[1, 0]]) # měříme jen polohu
Q = 0.5**2 * np.array([[1/4, 1/2], [1/2, 1]]) # náhodné zrychlení
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 # předpověď
K = P @ H.T @ np.linalg.inv(H @ P @ H.T + R)
x = x + K @ (z - H @ x) # oprava podle inovace
P = (np.eye(2) - K @ H) @ P
yield x, P
Příklad — první dva kroky filtru na datech auta
Start. První měření GPS je z1 = 8,44 m. Filtr začne polohou 8,44 m, rychlostí 0 a velkou nejistotou P0 = [[100; 0], [0; 100]] (10 m a 10 m/s). Oprava týmž měřením polohu nezmění (inovace je 0), jen zmenší její rozptyl (barvy podle rozborů výše): K = 100/100 + 64 = 0,610, P11 = (1 − 0,610) · 100 = 39,02.
Předpověď na 2. sekundu. x̂− = (8,44 + 0; 0) = (8,44; 0,00). Kovariance FPFT přičte k rozptylu polohy rozptyl rychlosti (poloha += rychlost) a k tomu se přičte Q:
P− = [[39,02 + 100 + 0,0625; 100 + 0,125], [100 + 0,125; 100 + 0,25]] = [[139,09; 100,13], [100,13; 100,25]].
Oprava. Měření z2 = 23,23 m, inovace y = 23,23 − 8,44 = 14,78 m, její rozptyl 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 dvou měřeních filtr „ví“, že se auto hýbe, přestože rychlost nikdo neměřil: odhadl 7,3 m/s (skutečnost 13,9 m/s). Zisk pro rychlost je nenulový jen díky kovarianci 100,13 mimo diagonálu. Proč jen polovina? Měření jsou zašuměná o 8 m, takže filtr rozdíl 15 m ještě nebere úplně vážně — za další sekundy se rychlost doladí.
5. Filtr sleduje auto
Minuta jízdy, jedno měření GPS za sekundu. Za tu dobu auto ujede necelý kilometr, takže by se šum v grafu polohy ztratil. Kreslíme proto, o kolik je auto napřed nebo pozadu oproti jízdě přesně 15 m/s:
Měření GPS se od skutečné polohy odchylují v průměru o 8,3 m (od desáté sekundy, kdy se filtr rozběhne). Odhad filtru jen o 4,9 m — o 41 % méně. A rychlost, kterou žádné čidlo neměří, odhadne s chybou 0,8 m/s: filtr ji odvodí z toho, jak se mění poloha. Na začátku rychlost nezná (začíná od nuly), za pár sekund se ale chytí. Pás ±2σ je filtrova poctivá nejistota — skutečná poloha leží uvnitř v 95 % kroků, přesně jak má.
Definice — průměrná chyba (RMSE) a pás ±2σ
Nechť 𝒦 je konečná neprázdná množina kroků, N = |𝒦|, a pro každé k ∈ 𝒦 je pk ∈ ℝ skutečná poloha a p̂k ∈ ℝ její odhad (první složka odhadu filtru x̂k, nebo samotné měření). Odmocnina ze střední kvadratické chyby (RMSE) je číslo
RMSE = √1/N ∑k ∈ 𝒦 (p̂k − pk)2.
„Průměrná chyba“ v tomto dílu je RMSE přes kroky 𝒦 = {10, …, 59}, tedy N = 50. Čtverce trestají velké chyby víc než malé a odmocnina vrací výsledek do metrů. Pro samotnou GPS by RMSE mělo vyjít kolem σ = 8 m — a vyšlo 8,3 m. Pro rychlost se RMSE definuje stejně s druhou složkou stavu.
Nechť Pk ∈ ℝ2×2 je kovariance odhadu filtru v kroku k a Pk,11 její prvek vlevo nahoře (rozptyl polohy). Pás ±2σ v kroku k je interval
[p̂k − 2√Pk,11, p̂k + 2√Pk,11].
Pro X ~ N(μ, σ2) je P(|X − μ| ≤ 2σ) ≈ 0,9545; má-li filtr nejistotu Pk spočítanou správně, musí skutečnost padnout do pásu asi v 95 % kroků.
Kalmanův zisk se po pár krocích ustálí na K ≈ (0,30; 0,05): z každé inovace převezme filtr 30 % do polohy a 5 % (na metr inovace 0,05 m/s) do rychlosti. Přes 50 simulovaných jízd je chyba filtru v průměru 55 % chyby samotné GPS.
Věta — ustálený zisk
Ve vzorcích pro P−, K a P nejsou měření z — kovariance i zisk se dají spočítat předem. Spojením předpovědi a opravy vznikne rekurence (diskrétní Riccatiho rovnice)
P−k+1 = F (P−k − P−kHT (HP−kHT + R)−1 HP−k) FT + Q.
Nechť F ∈ ℝn×n, H ∈ ℝm×n, R pozitivně definitní a Q = GGT pro nějaké G ∈ ℝn×r jsou pevné (nezávislé na k) a platí
- dvojice (F, H) je pozorovatelná: matice složená pod sebe z H, HF, …, HFn−1 má hodnost n (z řady měření se dá zjistit celý stav);
- dvojice (F, G) je řiditelná: matice složená vedle sebe z G, FG, …, Fn−1G má hodnost n (šum se časem dostane do všech složek stavu).
Pak pro každou symetrickou pozitivně semidefinitní počáteční matici posloupnost P−k konverguje k matici P∞, která nezávisí na počáteční matici a je jediným symetrickým pozitivně semidefinitním pevným bodem rekurence; zisk Kk konverguje k ustálené hodnotě K∞ = P∞HT (HP∞HT + R)−1. U auta obě podmínky platí: [H; HF] = [[1, 0], [1, 1]] i [g, Fg] = [[0,5; 1,5], [1; 1]] mají hodnost 2.
U auta: po 60 krocích je K = (0,297; 0,052) a P = [[19,04; 3,35], [3,35; 1,29]], tedy filtr si věří na √19,04 ≈ 4,4 m v poloze a √1,29 ≈ 1,1 m/s v rychlosti.
Na začátku filtr neví skoro nic a hltá každé měření (zisk 0,61, pak 0,68). Jak se odhad zpřesňuje, zisk klesá — až se ustálí tam, kde nejistota přidaná za krok šumem Q je stejně velká jako ta, kterou ubere měření. Dál už se nic nemění, a proto se v jednoduchých zařízeních zisk často spočítá jednou předem a filtr pak jen násobí pevnými čísly.
6. Komu věřit: Q a R
Filtr potřebuje znát Q a R. GPS výrobce obvykle udává, ale procesní šum se odhaduje hůř. Co když filtru dáme jiné hodnoty, než jaké mají data?
| Procesní šum, kterému filtr věří (m/s²) | 0,01 | 0,1 | 0,5 (pravda) | 2 | 10 |
|---|---|---|---|---|---|
| chyba polohy (m) | 9,29 | 5,88 | 4,86 | 5,67 | 7,08 |
| chyba rychlosti (m/s) | 1,19 | 0,86 | 0,79 | 1,53 | 5,19 |
Když filtr věří, že auto jede skoro přesně stálou rychlostí (malé Q), drží se svého modelu a na skutečné zrychlení reaguje pozdě — chyba polohy je dokonce větší než u samotné GPS. Když naopak čeká divoké změny (velké Q), nevěří modelu a kopíruje zašuměná měření. Nejlépe dopadne se skutečnou hodnotou 0,5. Totéž platí pro R: s nejistotou GPS 2, 8 a 30 m vyjde chyba polohy 5,66; 4,86 a 5,39 m.
7. Proč zrovna takhle
Věta — optimalita Kalmanova filtru
Nechť xk, zk splňují lineární stavový model (definice výše) s počátečním stavem x0 ~ N(x̂0, P0) a nechť x̂k, Pk jsou výstupy Kalmanova filtru spuštěného se stejnými F, H, Q, R, x̂0, P0. Pak pro každé k ≥ 1:
- podmíněné (aposteriorní) rozdělení stavu xk při měřeních z1, …, zk je přesně N(x̂k, Pk);
- zejména x̂k = E[xk | z1, …, zk], a ze všech odhadů g(z1, …, zk) má nejmenší střední kvadratickou chybu E[‖xk − g(z1, …, zk)‖2].
Vypustíme-li předpoklad normality (x0, wk, vk jsou jen nekorelované se stejnými středními hodnotami a kovariancemi), je x̂k nejlepší ve smyslu střední kvadratické chyby mezi odhady, které jsou afinní (lineární plus konstanta) funkcí z1, …, zk.
Kalmanův filtr je Bayesova věta aplikovaná znovu a znovu. Předpověď je apriorní rozdělení, měření je věrohodnost, oprava je aposteriorní rozdělení. Normální rozdělení má tu vzácnou vlastnost, že součin normálních je zase normální — a tak stačí pamatovat si střední hodnotu a kovarianci místo celé funkce. Je to dopředný algoritmus ze skrytých Markovových modelů pro spojitý stav.
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
- předpověď (apriorní rozdělení): minulý stav neznáme přesně, tak průměrujeme přechod přes všechny možné minulé stavy, vážené tím, čemu jsme minule věřili. Integrál je spojitá obdoba součtu ∑i v dopředném algoritmu HMM. Pro lineární model a normální rozdělení vyjde N(Fx̂, FPFT + Q)
- p(zk | xk)
- věrohodnost nového měření — jak dobře by které místo vysvětlilo, co GPS ukázala; z modelu je to N(zk; Hxk, R)
- p(xk | z1:k)
- aposteriorní rozdělení po všech měřeních; „∝“ proto, že normalizační konstantu p(zk | z1:k−1) nepotřebujeme — součin dvou normálních hustot dopočítá důkaz věty ze začátku dílu, a vyjde z něj přesně krok opravy
8. Když svět není lineární
- Rozšířený Kalmanův filtr (EKF) nelineární model v každém kroku linearizuje derivací — tak to dělala i navigace Apolla.
- Unscented Kalmanův filtr (UKF) místo derivací prožene modelem pár pečlivě vybraných bodů a z nich spočítá novou střední hodnotu a kovarianci.
- Částicový filtr se vzdá normálního rozdělení úplně: odhad reprezentuje tisíci vzorků („částic“), které se pohybují podle modelu a převažují podle měření. Zvládne i odhad s více vrcholy, třeba „robot je buď v kuchyni, nebo v obýváku“.
- Kde všude: spojování GPS, akcelerometru a gyroskopu v mobilech, navigace letadel, dronů a raket, sledování objektů radarem, odhad polohy autonomních aut, a dokonce vyhlazování ekonomických časových řad.
Definice — rozšířený Kalmanův filtr (EKF)
Nechť f : ℝn → ℝn a h : ℝn → ℝm jsou diferencovatelné funkce (derivace viz díl Derivace, gradient a řetízkové pravidlo), Q, R jako v lineárním modelu a model je nelineární:
xk = f(xk−1) + wk, zk = h(xk) + vk, wk ~ N(0, Q), vk ~ N(0, R), všechny šumy nezávislé.
Jacobiho matice funkce f v bodě a ∈ ℝn je matice parciálních derivací Jf(a) ∈ ℝn×n, (Jf(a))ij = ∂fi/∂xj(a); obdobně Jh(a) ∈ ℝm×n. Rozšířený Kalmanův filtr má stejný vstup a výstup jako Kalmanův filtr (s f, h místo F, H) a pro k = 1, 2, …, T provede:
- Předpověď: Fk = Jf(x̂k−1), x̂k− = f(x̂k−1), Pk− = Fk Pk−1 FkT + Q.
- Zisk: Hk = Jh(x̂k−), Kk = Pk− HkT (Hk Pk− HkT + R)−1.
- Oprava: x̂k = x̂k− + Kk (zk − h(x̂k−)), Pk = (I − Kk Hk) Pk−.
Střední hodnotu tedy EKF počítá nelineárními funkcemi, kovarianci jejich linearizací v aktuálním odhadu.
Příklad: radar měří vzdálenost h(px, py) = √px2 + py2; pak Hk = (px/d, py/d) s d = √px2 + py2 — jednotkový vektor směrem k cíli. Pro cíl v (300, 400) m je d = 500 m a Hk = (0,6; 0,8). Výsledek už není přesné aposteriorní rozdělení, jen jeho přiblížení; čím víc je model v rozsahu nejistoty zakřivený, tím horší.
9. Shrnutí
- Dvě nezávislá normální měření se spojí váženým průměrem; přesnosti se sčítají a váha K je Kalmanův zisk.
- Kalmanův filtr opakuje předpověď podle modelu a opravu podle měření; pro neměnnou veličinu je to průběžný průměr.
- U auta snížil chybu polohy z 8,3 m (GPS) na 4,9 m a odhadl i neměřenou rychlost s chybou 0,8 m/s; pás ±2σ pokryl skutečnost v 95 % kroků.
- Výsledek záleží na Q a R: příliš velká důvěra v model reaguje pozdě, příliš malá kopíruje šum.
- Pro lineární model s normálním šumem je filtr přesná Bayesova aktualizace; nelineární svět zvládají EKF, UKF a částicové filtry.
Tímhle dílem končí modul o pravděpodobnostních modelech. Chcete si to osahat? Nechte AI agenta napsat Kalmanův filtr pro data z akcelerometru vlastního telefonu a zkuste, jak dobře z nich odhadne, o kolik jste telefon posunuli.
Máte na to jiný názor? Napište na support@coden-app.com.