Salta ai contenuti

Stimare stato nascosto con modello e misure rumorose

Lo stato vero di un sistema dinamico è quasi sempre invisibile: lo si conosce solo attraverso un modello imperfetto e sensori rumorosi. Il filtro di Kalman fonde queste due fonti incerte in una stima ottimale, pesandole in base a quanto ciascuna è affidabile, e lo fa con un ciclo predici-correggi che pulsa a ogni istante.


Nell’autunno del 1960 un giovane matematico fa visita a un centro di ricerca della NASA in California. Si chiama Rudolf Kalman, ha trent’anni, e ha appena pubblicato un articolo che la maggior parte degli ingegneri del controllo non ha ancora letto. Al NASA Ames Research Center incontra Stanley Schmidt, capo di una branca che si sta scervellando su un problema apparentemente impossibile: come fa un computer di bordo grande come una valigia, con pochi KB di memoria, a sapere dove si trova una capsula in viaggio verso la Luna, sapendo che ogni misura che riceve è sporca di rumore e che le leggi del moto orbitale non sono mai conosciute alla perfezione? Schmidt ascolta, capisce che la teoria di Kalman è esattamente lo strumento che gli serve, e la porta — adattata — dentro il programma Apollo. Da lì, lo stesso pezzo di matematica è finito nel GPS del tuo telefono, nei sistemi che tengono separati gli aerei sopra la tua testa, e in quasi ogni robot che si muove nello spazio.

Il problema che Kalman risolve ha un nome: stima dello stato (state estimation). Hai un sistema che evolve nel tempo — una capsula, un robot, un prezzo, un drone — e vuoi sapere com’è fatto adesso: la sua posizione, la sua velocità, le sue variabili interne. Il guaio è che non puoi guardare lo stato direttamente.

Hai solo due cose, entrambe inaffidabili. La prima è un modello della dinamica, che ti dice come il sistema tende a evolvere: ma propagarlo in avanti accumula errore. La seconda sono delle misure prese da sensori: ma i sensori sono rumorosi e spesso non misurano tutto. Né il modello né le misure, da soli, ti dicono la verità.

L’idea del filtro di Kalman è non scegliere. Le due fonti vengono fuse, pesate ciascuna in base a quanto è affidabile. Se il sensore è preciso, ci si fida del sensore; se è rumoroso, ci si appoggia al modello. È il punto preciso in cui la teoria del controllo, che fin qui ha assunto di conoscere lo stato, incontra l’inferenza statistica e impara a stimarlo da dati sporchi. Per chi costruisce sistemi che agiscono nel mondo — robot, agenti, qualunque cosa abbia un anello percezione-azione — è uno degli oggetti concettuali più riutilizzabili che esistano: ovunque ci sia uno stato nascosto da ricostruire da osservazioni imperfette, lo schema di Kalman è il primo posto dove guardare.

Vale la pena fermarsi un istante sul perché questo problema sia così pervasivo. Quasi nessun sistema interessante espone direttamente il proprio stato.

Una capsula spaziale non ha un sensore che dice “ti trovi esattamente qui”: ha un sestante che misura angoli rispetto alle stelle, un radar che misura distanze, un giroscopio che misura rotazioni — e da quelle misure indirette e rumorose bisogna risalire alla posizione e alla velocità. Un robot non sa dove sono i suoi giunti con precisione infinita: ha encoder che sbagliano. Un sistema di trading non osserva il “vero” trend di un titolo: osserva prezzi rumorosi da cui il trend va estratto.

In tutti questi casi lo stato è una variabile latente, nascosta dietro un velo di rumore e di osservazione parziale. Stimarlo bene è la differenza tra un sistema che funziona e uno che si schianta convinto di essere sulla rotta giusta.

C’è anche una ragione per cui questo capitolo vive in una wiki sull’intelligenza artificiale e non solo in un manuale di ingegneria aerospaziale. Il filtro di Kalman è l’esempio storico più pulito di belief tracking sotto incertezza: mantenere e aggiornare una credenza su uno stato del mondo man mano che arrivano osservazioni.

È lo stesso problema, in forma astratta, che affronta qualunque sistema che debba mantenere un modello aggiornato del mondo — e, come vedremo con la dovuta cautela sulle classi di affermazioni, la sua struttura matematica riaffiora sia nei modelli a spazio di stato del deep learning moderno sia, come analogia, nel modo in cui un agente aggiorna la propria rappresentazione del mondo.

Questo capitolo annoda diversi fili della wiki.

Il primo è la Parte XI stessa. Tutti i capitoli precedenti — dal vocabolario del controllo (plant, controllore, sensore, attuatore, stato) al PID, fino al controllo ottimo — hanno assunto, più o meno esplicitamente, di conoscere lo stato del sistema da controllare. Il PID corregge sull’errore misurato; l’LQR del controllo ottimo calcola l’ingresso a partire dallo stato. Ma se lo stato non lo conosci, e hai solo misure rumorose, prima di controllare devi stimare. Il filtro di Kalman è il pezzo mancante: la stima che alimenta il controllo.

Il secondo filo è la teoria dei sistemi. Il filtro lavora sulla rappresentazione stato-spazio (Parte IX, Stato, transizione, traiettoria): il sistema è descritto da un vettore di stato che evolve secondo una legge di transizione. E dipende in modo cruciale dall’osservabilità (Parte IX, Cosa posso misurare, cosa posso governare): se una parte dello stato non è osservabile, nessuna quantità di misure permetterà mai di ricostruirla, e il filtro su quella parte resterà cieco. L’osservabilità è la precondizione, non un dettaglio.

Il terzo filo è statistico e bayesiano. Il filtro di Kalman è, sotto le ipotesi giuste, inferenza bayesiana esatta: il teorema di Bayes applicato passo per passo, dove prior e verosimiglianza sono gaussiane (la distribuzione normale, la “campana”).

Il legame con il MAP bayesiano e con il prodotto di gaussiane è il cuore matematico del capitolo, e lo vedremo da vicino. È anche il punto in cui due tradizioni separate — la teoria del controllo e la statistica bayesiana — si scoprono a dire la stessa cosa con vocabolari diversi: cosa che il control engineer chiama “filtro” e il bayesiano chiama “aggiornamento del posterior”.

Le date e i nomi che contano. Rudolf Kalman (ingegnere e matematico statunitense di origine ungherese, 1930-2016) pubblica nel 1960 A New Approach to Linear Filtering and Prediction Problems (ASME Journal of Basic Engineering, vol. 82, pp. 35-45), il paper fondativo. La novità rispetto al filtro di Norbert Wiener (matematico statunitense, 1894-1964, padre della cibernetica) degli anni ‘40 è duplice: il filtro di Kalman è ricorsivo — non serve conservare l’intera storia delle misure, bastano lo stato corrente e la sua incertezza — e lavora nello spazio degli stati invece che nel dominio delle frequenze. La prima proprietà è quella che lo rese implementabile sui computer di bordo dell’epoca. Stanley F. Schmidt (ingegnere NASA), capo della Dynamics Analysis Branch al NASA Ames, lo estende al caso non lineare della navigazione orbitale: nasce lo Schmidt-Kalman filter, antenato dell’Extended Kalman Filter, usato nel programma Apollo.

La differenza con il filtro di Wiener merita una riga in più, perché illumina perché il lavoro di Kalman ebbe tanto impatto così in fretta. Il filtro di Wiener era ottimale, ma assumeva processi stazionari e operava nel dominio delle frequenze, richiedendo in linea di principio l’intera storia del segnale per produrre la stima. Era un risultato matematico bellissimo e quasi inutilizzabile su un calcolatore con poca memoria.

La formulazione di Kalman, ricorsiva e nel dominio del tempo, dice invece: “dammi la stima di ieri, la sua incertezza, e la misura di oggi, e ti do la stima di oggi”. Niente storia, niente integrali sul passato. Per un computer di bordo del 1965, con qualche decina di KB, questa era la differenza tra fattibile e impossibile. È un caso classico in cui la forma di una soluzione — ricorsiva invece che batch — conta quanto la sua ottimalità.

Un equivoco storico ricorrente va chiarito: Kalman non “andò sulla Luna” né progettò la navigazione Apollo. Il suo contributo fu la teoria, pubblicata nel 1960. Furono Schmidt e il suo gruppo al NASA Ames a riconoscerne il valore, a estenderla al caso non lineare e a portarla nel sistema reale. La filiazione — teoria di Kalman → Schmidt-Kalman filter → navigazione Apollo — è documentata e diretta, ma è una catena con più anelli, non un salto.

Il problema che Schmidt aveva sul tavolo alla fine degli anni ‘50 illustra bene perché la stima dello stato non è un lusso teorico. Una capsula diretta verso la Luna deve sapere con precisione dove si trova e a che velocità, altrimenti sbaglia l’inserimento orbitale di parecchio.

Ma le uniche misure disponibili erano indirette e rumorose — angoli misurati a mano con un sestante rispetto alle stelle, dati radar da terra — e il computer di bordo aveva una frazione della potenza di una calcolatrice tascabile odierna. Niente memoria per conservare la storia delle misure, niente potenza per algoritmi pesanti.

Il filtro di Kalman, ricorsivo e leggero, era la risposta naturale; il fatto che la dinamica orbitale fosse non lineare costrinse Schmidt a inventare la linearizzazione attorno alla traiettoria di riferimento, cioè l’idea dell’Extended Kalman Filter. Da quel problema concreto — fondere misure sporche con un modello fisico noto, su hardware minuscolo — discende quasi tutto l’uso moderno del filtro.

Dopo l’Apollo, la storia è una propagazione continua dello stesso schema. Il GPS, dagli anni ‘80 in poi, fonde i tempi di arrivo dei segnali satellitari (rumorosi, e a volte mancanti quando si perde la linea di vista) con un modello del moto del ricevitore: senza un filtro che gestisca rumore e interruzioni, la posizione salterebbe a ogni passo. La robotica mobile, dagli anni ‘90, ne fa il cuore della localizzazione e della SLAM.

Oggi NASA documenta che gli stessi Schmidt-Kalman filter girano nei sistemi della FAA per il tracking degli aerei, fondendo radar e GPS con le traiettorie predette per stringere l’incertezza sulla posizione e far stare in sicurezza più voli nello stesso spazio. Un pezzo di matematica del 1960 che non è mai diventato obsoleto.

Quattro angoli prima di qualunque formula. Il primo guarda l’update come fusione di due opinioni incerte, e arriva al fatto matematico che fa funzionare tutto: il prodotto di due gaussiane è ancora una gaussiana. Il secondo segue il ciclo predici-correggi come una pulsazione dell’incertezza che cresce e cala. Il terzo zooma sull’oggetto più importante del filtro — il guadagno di Kalman — e lo legge come una manopola di fiducia. Il quarto inquadra il filtro nel suo posto dentro la teoria del controllo: la metà “stima” di un anello stima-e-controllo, e il perché si possa progettarla da sola.

Immagina due persone che ti dicono quanto è calda una stanza. La prima guarda un termometro a mercurio vecchio e impreciso: “direi 21 gradi, ma non ci giurerei, diciamo più o meno 3 gradi”. La seconda usa un sensore digitale di precisione: “20.5 gradi, più o meno mezzo grado”. Qual è la stima migliore della temperatura vera?

Non la media semplice, 20.75: sarebbe ingiusto verso il sensore preciso, che merita più peso. La risposta ottimale pesa ogni opinione in base alla sua precisione, cioè all’inverso della sua incertezza.

La stima fusa cade molto vicino al sensore digitale, e — qui sta il punto controintuitivo — la sua incertezza è più piccola di entrambe le opinioni di partenza. Mettere insieme due fonti, anche se nessuna è perfetta, riduce l’incertezza complessiva: è la stessa ragione per cui due testimoni concordi valgono più di uno.

Questo è esattamente cosa fa la fase di correzione del filtro di Kalman. La predizione del modello è la “prima persona”, con la sua incertezza. La misura del sensore è la “seconda persona”, con la sua. Il filtro le fonde.

E il motivo per cui la fusione è semplice e ha una formula chiusa è un fatto matematico preciso: se rappresenti ogni opinione come una gaussiana — una campana centrata sul valore stimato, larga quanto l’incertezza — allora il prodotto di due gaussiane è ancora una gaussiana.

Nel caso a una dimensione, due opinioni di media μ1,μ2\mu_1, \mu_2 e varianza σ12,σ22\sigma_1^2, \sigma_2^2 (la varianza è l’incertezza al quadrato) si fondono in una gaussiana di media e varianza:

μ=σ22μ1+σ12μ2σ12+σ22,1σ2=1σ12+1σ22.\mu = \frac{\sigma_2^2\,\mu_1 + \sigma_1^2\,\mu_2}{\sigma_1^2 + \sigma_2^2}, \qquad \frac{1}{\sigma^2} = \frac{1}{\sigma_1^2} + \frac{1}{\sigma_2^2}.

In parole povere: la media fusa è una media pesata, dove ogni opinione pesa proporzionalmente alla precisione dell’altra (varianza piccola dell’altra = peso grande per me). E le precisioni — i reciproci delle varianze — si sommano: ecco perché fondere riduce sempre l’incertezza, qualunque siano le due fonti.

Questo lega il filtro direttamente all’inferenza bayesiana. La predizione è il prior, la misura è la verosimiglianza, la stima fusa è il posterior. Poiché entrambe sono gaussiane e la gaussiana si fonde con se stessa in modo chiuso, il posterior resta gaussiano e calcolabile esattamente. Tornerò su questo punto nella sezione sull’ottimalità: per ora basta tenere che l’update di Kalman è un’applicazione del teorema di Bayes al caso gaussiano.

Pensa a un’app di navigazione che stima dove sei mentre cammini in città. Le letture GPS arrivano una volta al secondo, ma tu ti muovi di continuo. Cosa fa l’app nel secondo che separa due letture?

Predice. “Un secondo fa eri qui e ti muovevi a circa un metro e mezzo al secondo verso nord, quindi adesso dovresti essere un metro e mezzo più a nord.” È una predizione ragionevole, ma con un effetto collaterale: l’incertezza cresce.

Più tempo passa senza una misura fresca, meno l’app sa davvero dove sei — magari hai rallentato, girato, ti sei fermato. Il modello, lasciato a sé, drifta: si allontana piano dalla verità.

Poi arriva una nuova lettura GPS, rumorosa per conto suo. L’app corregge. Sposta la stima verso la misura, di quanto dipende da quanto si fida della misura rispetto alla predizione. E dopo la correzione, l’incertezza cala: la misura ha rimesso a fuoco la stima.

Predici e l’incertezza si gonfia. Correggi e si sgonfia. Il filtro vive in questa pulsazione: l’incertezza respira a ogni passo.

Questo è lo stesso schema feedback-feedforward che attraversa la teoria dei sistemi e questa Parte: il modello (feedforward) propone dove dovremmo essere, la misura (feedback) corregge dove siamo davvero. La differenza rispetto al PID è che qui ogni mossa è pesata dall’incertezza corrente, non da un guadagno fisso tarato a mano una volta per tutte.

Terzo angolo: il guadagno come manopola di fiducia

Sezione intitolata “Terzo angolo: il guadagno come manopola di fiducia”

Il pezzo decisivo del filtro è una quantità chiamata guadagno di Kalman, indicato con KK. È la risposta numerica alla domanda: “in questa correzione, di quanto mi fido della misura rispetto alla predizione?”.

In una forma scalare semplificata,

K=PP+R,K = \frac{P^-}{P^- + R},

dove PP^- è l’incertezza della predizione (la covarianza dell’errore prima di guardare la misura) e RR è l’incertezza del sensore (la covarianza del rumore di misura). Leggilo come una manopola che vive tra 0 e 1:

  • Sensore perfetto, R0R \to 0: allora K1K \to 1. La stima salta interamente sulla misura. “Mi fido del sensore, butto via la predizione.”
  • Sensore inutile, RR \to \infty: allora K0K \to 0. La stima resta sulla predizione. “Il sensore è spazzatura, tengo il modello.”
  • In mezzo: KK pesa proporzionalmente, e cresce quando la predizione è più incerta del sensore.

La nuova stima si scrive x^=x^+K(zHx^)\hat{x} = \hat{x}^- + K\,(z - H\hat{x}^-), dove x^\hat{x}^- è la predizione e zz la misura. Il termine tra parentesi, (zHx^)(z - H\hat{x}^-), ha un nome bellissimo: innovazione. È la sorpresa — la differenza tra ciò che il sensore ha misurato e ciò che ci aspettavamo di misurare data la predizione.

Il filtro corregge in proporzione alla sorpresa, scalata dalla fiducia KK. Se non c’è sorpresa, non c’è correzione: la misura conferma la predizione e la stima non si muove. Più la misura sorprende, più la stima si sposta — ma solo nella misura in cui ci si fida del sensore.

Una conseguenza notevole: il guadagno evolve da solo nel tempo. All’inizio, quando l’incertezza iniziale PP è grande perché non sappiamo ancora dove siamo, KK è alto e il filtro si fida molto delle prime misure, riagganciandosi in fretta alla realtà. Man mano che le misure si accumulano e PP cala, KK scende e il filtro diventa più “scettico”, perché ormai ha una buona stima e una singola misura rumorosa conta meno.

In molti casi pratici KK converge a un valore costante: il filtro raggiunge un regime in cui crescita dell’incertezza nel predict e riduzione nell’update si bilanciano. Questo comportamento auto-regolante — fidarsi tanto quando si è ignoranti, fidarsi meno quando si è già informati — è la cosa che il guadagno fisso di un PID non sa fare.

C’è un ultimo modo di guardare il filtro che lo colloca nel resto della Parte. Un sistema di controllo completo deve fare due cose: capire dove sei (stima) e decidere cosa fare (controllo).

Nei capitoli precedenti il controllo — il PID, l’LQR del controllo ottimo — ha sempre dato per scontato di conoscere lo stato. Il filtro di Kalman fornisce il pezzo mancante: prende le misure rumorose e restituisce la migliore stima dello stato, che poi il controllore usa al posto dello stato vero.

Questi due pezzi insieme formano il regolatore LQG (Linear Quadratic Gaussian), il caso d’oro del controllo lineare con rumore gaussiano: l’LQR (Linear Quadratic Regulator) calcola il controllo ottimo come se conoscesse lo stato, e il filtro di Kalman gli fornisce la stima dello stato a partire dalle misure.

La domanda naturale è: progettando i due pezzi separatamente — il controllore che assume di conoscere lo stato, e lo stimatore che ignora come quel controllo verrà usato — il risultato combinato è ancora ottimo? La risposta, sorprendente e utilissima, è sì: è il principio di separazione (separation principle), un teorema che vale nel caso lineare-gaussiano. Si può progettare lo stimatore e il controllore in due stanze diverse e incollarli, e l’insieme resta ottimo.

Questo non è un dettaglio accademico. È la ragione per cui in pratica si separano sempre le due responsabilità: un blocco che stima lo stato (il filtro), un blocco che decide l’azione (il controllore).

È anche un’ottima lente per leggere il resto della wiki: ovunque vedi un sistema che prima costruisce una rappresentazione del mondo e poi decide su quella rappresentazione, stai vedendo, in qualche forma, una separazione tra stima e controllo. Che questa separazione resti ottima è però un privilegio del caso lineare-gaussiano: fuori da quel mondo, stimare bene e agire bene tornano a essere problemi intrecciati.

Mettiamo le formule complete. Prima il sistema, poi le cinque equazioni del ciclo, ciascuna spiegata.

Prima delle equazioni, fissiamo l’impalcatura. Il filtro non lavora su un sistema qualunque: assume che il mondo sia descritto in forma stato-spazio, la rappresentazione introdotta nella teoria dei sistemi (Stato, transizione, traiettoria).

Ci sono due equazioni, entrambe lineari e con un termine di rumore gaussiano: una dice come lo stato evolve, l’altra dice come lo stato si manifesta nelle misure. Tenere separate queste due fonti di rumore — quello della dinamica e quello del sensore — è il primo passo concettuale, perché il filtro le tratta in modo completamente diverso.

La prima equazione è la dinamica: come evolve lo stato.

xk=Fxk1+Buk+wk,wkN(0,Q).x_k = F\,x_{k-1} + B\,u_k + w_k, \qquad w_k \sim \mathcal{N}(0, Q).

Qui xkx_k è lo stato vero (nascosto) al passo temporale kk — un vettore, ad esempio posizione e velocità. FF è la matrice di transizione: codifica la legge con cui lo stato evolve da un passo al successivo. uku_k è l’ingresso di controllo noto (ciò che comandiamo al sistema) e BB la matrice che ne descrive l’effetto.

wkw_k è il rumore di processo: tutto ciò che il modello non cattura, modellato come gaussiano a media zero con covarianza QQ. Più il modello è imperfetto o il sistema imprevedibile, più QQ è grande.

La seconda è la misura: cosa osserva il sensore.

zk=Hxk+vk,vkN(0,R).z_k = H\,x_k + v_k, \qquad v_k \sim \mathcal{N}(0, R).

zkz_k è la misura al passo kk. HH è la matrice di osservazione: mappa lo stato in ciò che il sensore vede. Se misuri solo la posizione di un sistema il cui stato è (posizione, velocità), HH estrae la posizione e ignora la velocità.

vkv_k è il rumore di misura, gaussiano a media zero con covarianza RR: più il sensore è rumoroso, più RR è grande. La velocità, in questo esempio, non è mai misurata direttamente: il filtro la ricostruisce da come la posizione cambia nel tempo, ed è qui che l’osservabilità entra in gioco.

Il filtro mantiene due cose: la stima x^k\hat{x}_k dello stato, e una matrice PkP_k, la covarianza dell’errore di stima, che quantifica quanto siamo incerti. PP grande significa poca fiducia.

Userò l’apice meno (x^k\hat{x}_k^-, PkP_k^-) per le quantità a priori, calcolate dopo la predizione ma prima di aver visto la misura; senza apice per quelle a posteriori, dopo aver incorporato la misura. Questa distinzione tra “prima” e “dopo” la misura è la spina dorsale delle equazioni che seguono.

Fase predict (time update) — propaga stato e incertezza in avanti.

\hat{x}_k^- = F\,\hat{x}_{k-1} + B\,u_k \tag{1}

Equazione (1): propaga la stima usando la dinamica. In parole, “dove sarei finito, dato dov’ero e cosa ho comandato”.

Niente rumore qui: del rumore, in media, non sappiamo il valore (ha media zero), quindi la migliore stima propaga solo la parte deterministica. Il rumore non sparisce, però: ricompare nell’equazione successiva come crescita dell’incertezza.

P_k^- = F\,P_{k-1}\,F^\top + Q \tag{2}

Equazione (2): propaga l’incertezza. Il termine FPk1FF P_{k-1} F^\top trasforma la vecchia incertezza secondo la dinamica (se il sistema amplifica certe direzioni, l’incertezza in quelle direzioni cresce).

Il +Q+Q aggiunge l’incertezza dovuta all’imperfezione del modello. Risultato: nella predizione l’incertezza cresce sempre. È l’incertezza che si gonfia.

Fase update (measurement update) — incorpora la nuova misura.

K_k = P_k^-\,H^\top\,(H\,P_k^-\,H^\top + R)^{-1} \tag{3}

Equazione (3): il guadagno di Kalman, nella sua forma matriciale completa. Il numeratore PkHP_k^- H^\top è l’incertezza della predizione proiettata nello spazio della misura.

Il denominatore HPkH+RH P_k^- H^\top + R è l’incertezza totale dell’innovazione: incertezza della predizione (proiettata) più incertezza del sensore. Il rapporto è la generalizzazione della manopola di fiducia P/(P+R)P^-/(P^- + R) vista prima: in più dimensioni, il “rapporto” diventa una moltiplicazione per l’inversa della covarianza totale.

\hat{x}_k = \hat{x}_k^- + K_k\,(z_k - H\,\hat{x}_k^-) \tag{4}

Equazione (4): correggi la stima. (zkHx^k)(z_k - H\hat{x}_k^-) è l’innovazione, la sorpresa; KkK_k la scala in base alla fiducia. Questa è la fusione delle due opinioni del primo angolo, in forma matriciale.

P_k = (I - K_k\,H)\,P_k^- \tag{5}

Equazione (5): aggiorna l’incertezza. Il fattore (IKkH)(I - K_k H) ha autovalori tra 0 e 1: incorporare una misura riduce sempre l’incertezza. È l’incertezza che si sgonfia. (II è la matrice identità.)

Il ciclo completo: predict (1, 2) → update (3, 4, 5) → predict → update, all’infinito.

La proprietà cruciale è che a ogni passo serve solo lo stato precedente (x^k1,Pk1)(\hat{x}_{k-1}, P_{k-1}) e la nuova misura zkz_k. Nessuna storia. Non si conservano le mille misure passate: tutta l’informazione utile è già condensata in x^\hat{x} e PP. È questa ricorsività che permise di far girare il filtro sui computer Apollo con pochi KB di memoria.

Guardando le cinque equazioni si nota che FF, HH e BB descrivono il sistema (li detta la fisica del problema) e che x^\hat{x}, PP, KK il filtro li calcola da solo. Restano due oggetti che tu devi fornire e che il filtro non può inferire dalla matematica pura: le covarianze di rumore QQ e RR. Sono le manopole vere, e capirle è la differenza tra un filtro che funziona e uno che mente con sicurezza.

RR, l’incertezza del sensore, è di solito la più facile: spesso la dichiara il costruttore del sensore (un GPS commerciale ha un errore tipico di qualche metro) o la si stima lasciando il sistema fermo e guardando quanto la misura “balla” attorno al vero.

QQ, l’incertezza del modello, è più sfuggente: rappresenta tutto ciò che la tua dinamica FF non cattura — un vento che spinge il drone, un attrito che non hai modellato, una manovra imprevista. Non c’è un sensore che la misura; la si tara, ed è qui che si concentra il mestiere di chi mette in opera un filtro.

L’effetto delle due manopole è speculare. Aumentare RR dice al filtro “fidati meno del sensore”: il guadagno scende, la stima si appoggia di più al modello e diventa più liscia ma più lenta a reagire. Aumentare QQ dice “fidati meno del modello”: il guadagno sale, la stima insegue più da vicino le misure, diventa più reattiva ma più nervosa.

È lo stesso compromesso reattività/lisciatura che hai visto nel PID, ma qui espresso nel linguaggio dell’incertezza invece che dei guadagni. Il rapporto Q/RQ/R è, in pratica, il parametro che davvero conta: raddoppiare entrambi lascia il guadagno quasi invariato, mentre cambiare il loro rapporto sposta dove va a finire la fiducia.

Sotto tre ipotesi precise il filtro di Kalman non è solo ragionevole: è dimostrabilmente il migliore possibile. Le ipotesi sono che dinamica e misura siano lineari, che i rumori siano gaussiani a media zero, e che il modello (le matrici F,H,Q,RF, H, Q, R) sia corretto.

In quel caso, il filtro è l’estimatore a minimo errore quadratico medio (MMSE, minimum mean square error) tra tutti gli estimatori possibili — non solo tra quelli lineari, ma in assoluto. Nessun algoritmo, per quanto astuto, può fare in media meglio: non è una buona euristica, è l’ottimo dimostrato.

C’è un secondo modo, equivalente, di dirlo, e lega il capitolo alla statistica bayesiana. Il filtro calcola il posterior esatto p(xkz1:k)p(x_k \mid z_{1:k}), cioè la distribuzione dello stato dato tutto ciò che si è misurato fino a ora. Sotto le ipotesi lineare-gaussiane (LG) questo posterior è una gaussiana, e il filtro ne riporta media (la stima x^k\hat{x}_k) e covarianza (l’incertezza PkP_k).

Questa è una relazione formalmente provabile, dunque un teorema, non un’analogia: il filtro di Kalman è il filtro bayesiano ricorsivo (Bayes filter) nel caso LG, ottenuto applicando il teorema di Bayes a ogni passo e sfruttando la chiusura della gaussiana sotto prodotto e marginalizzazione. È lo stesso ragionamento del MAP bayesiano, dispiegato nel tempo.

Se si rilassa la gaussianità ma si tiene la linearità, il filtro perde l’ottimalità assoluta ma resta il miglior estimatore lineare (BLUE, best linear unbiased estimator): tra tutti gli estimatori che combinano linearmente le misure, nessuno fa meglio.

È una garanzia più debole ma ancora forte: anche quando il rumore non è esattamente gaussiano — e nel mondo reale non lo è quasi mai — il filtro resta la scelta lineare migliore, il che spiega perché funzioni così bene anche fuori dalle sue ipotesi ideali.

C’è un dettaglio da rendere esplicito, perché è il ponte concettuale con il resto della statistica della wiki. Il fatto che il posterior resti gaussiano dopo l’update non è ovvio: in generale, applicare il teorema di Bayes a un prior e a una verosimiglianza qualunque produce un posterior di forma complicata, che non si riassume con pochi numeri.

La gaussiana è speciale perché è coniugata con se stessa: prior gaussiano per la media, verosimiglianza gaussiana, posterior gaussiano. È esattamente questa proprietà di coniugazione che permette al filtro di riassumere tutta l’informazione in due soli oggetti — la media x^\hat{x} e la covarianza PP — e di aggiornarli con formule chiuse, senza dover rappresentare distribuzioni complicate.

Tolta la gaussianità (o la linearità, che la preserverebbe), questa magia svanisce, e si è costretti alle approssimazioni delle sezioni successive. In questo senso il filtro di Kalman è il punto in cui inferenza bayesiana e calcolo trattabile coincidono perfettamente; è anche il motivo per cui, fuori dal caso LG, l’inferenza esatta diventa subito proibitiva.

Estensioni: quando il mondo non è lineare-gaussiano

Sezione intitolata “Estensioni: quando il mondo non è lineare-gaussiano”

Le ipotesi LG sono comode ma il mondo reale spesso le viola. La dinamica orbitale di una capsula Apollo non è lineare; le misure di un radar nemmeno.

Tre famiglie di estensioni affrontano il problema, con compromessi diversi. Tutte e tre tengono lo schema predici-correggi; cambia solo come gestiscono la non linearità e la non gaussianità.

L’Extended Kalman Filter (EKF) linearizza. A ogni passo, approssima la dinamica e la misura non lineari con la loro tangente nel punto della stima corrente, calcolando le derivate (gli Jacobiani, le matrici delle derivate parziali). Poi applica le solite equazioni di Kalman alla versione linearizzata.

È storicamente la prima e la più usata: lo Schmidt-Kalman filter dell’Apollo è essenzialmente un EKF. Funziona bene se la non linearità è dolce nell’intorno della stima; se è forte, la linearizzazione mente e il filtro può divergere — la stima si allontana dalla verità mentre il filtro resta convinto di sé.

L’Unscented Kalman Filter (UKF), introdotto da Wan e van der Merwe attorno al 2000, evita di linearizzare. Invece di calcolare derivate, sceglie un piccolo insieme deterministico di punti attorno alla stima — i sigma points — li fa passare attraverso la funzione non lineare vera, e ricostruisce media e covarianza dai punti propagati.

L’idea è che è più facile approssimare una distribuzione con pochi punti ben scelti che approssimare una funzione con la sua tangente. L’UKF cattura media e covarianza fino al terzo ordine dello sviluppo di Taylor per qualunque non linearità, e di solito batte l’EKF senza dover calcolare Jacobiani.

Il particle filter abbandona del tutto l’ipotesi gaussiana. Rappresenta il posterior non con media e covarianza, ma con un grande insieme di campioni pesati — le particelle — che approssimano una distribuzione di forma arbitraria. A ogni passo le particelle vengono propagate, ripesate in base alla misura, e ricampionate.

Questo permette di gestire posteriori multimodali (dove lo stato potrebbe essere in due posti diversi, e non lo sai ancora) e dinamiche fortemente non lineari, al prezzo di molto più calcolo e di una sofferenza nelle alte dimensioni (la maledizione della dimensionalità: servono esponenzialmente più particelle).

Una regola pratica per orientarsi: se il posterior resta vicino a una gaussiana e il compute è limitato, EKF o UKF; se il posterior è multimodale o fortemente non gaussiano e il compute c’è, particle filter.

Esempio numerico: fondere due stime in una dimensione

Sezione intitolata “Esempio numerico: fondere due stime in una dimensione”

Riprendiamo la fusione, con numeri. La predizione del modello dice che la posizione è 100 metri, con varianza 16 (deviazione standard 4 metri). Una misura GPS dice 106 metri, con varianza 4 (deviazione 2 metri, il sensore è più preciso).

Il guadagno scalare è K=P/(P+R)=16/(16+4)=0.8K = P^- / (P^- + R) = 16 / (16 + 4) = 0{.}8.

La stima corretta:

x^=100+0.8(106100)=100+0.86=104.8 m.\hat{x} = 100 + 0{.}8 \cdot (106 - 100) = 100 + 0{.}8 \cdot 6 = 104{.}8 \text{ m}.

La nuova varianza: (1K)P=(10.8)16=3.2(1 - K)\,P^- = (1 - 0{.}8)\cdot 16 = 3{.}2. Tre cose da notare. La stima fusa, 104.8, cade vicino al GPS (più preciso) ma non ci salta esattamente sopra: tiene conto anche della predizione. La varianza finale, 3.2, è minore sia di 16 che di 4: fondere ha ridotto l’incertezza sotto entrambe le fonti. E il guadagno 0.8 dice in chiaro che, in questa correzione, ci si è fidati per l’80% della misura e per il 20% della predizione, perché il GPS era quattro volte più preciso.

Si capovolga ora la situazione con un sensore peggiore. Se il GPS avesse varianza 64 (deviazione 8 metri, peggiore della predizione), il guadagno sarebbe K=16/(16+64)=0.2K = 16/(16+64) = 0{.}2: la stima si sposterebbe solo di 0.26=1.20{.}2 \cdot 6 = 1{.}2 metri verso la misura, fermandosi a 101.2, perché stavolta è la predizione la fonte più affidabile.

Stesso filtro, stessa formula: il bilanciamento si capovolge automaticamente quando si capovolge il rapporto tra le incertezze. Non c’è nessun “se” nel codice che decide a chi credere — lo decide l’aritmetica del guadagno.

Tutto il filtro è una manciata di righe. Lo stato qui è (posizione, velocità) e si misura solo la posizione: la velocità non viene mai osservata, il filtro la ricostruisce.

import numpy as np
def kalman_step(x, P, z, F, H, Q, R, B=None, u=0):
# predict
x = F @ x + (B * u if B is not None else 0)
P = F @ P @ F.T + Q
# update
y = z - H @ x # innovazione: la sorpresa
S = H @ P @ H.T + R # incertezza dell'innovazione
K = P @ H.T @ np.linalg.inv(S) # guadagno di Kalman
x = x + K @ y
P = (np.eye(len(x)) - K @ H) @ P
return x, P

Il loop esterno chiama kalman_step a ogni nuova misura, passando (x, P) aggiornati. Tutto lo stato del filtro vive in (x, P): due oggetti, nessuno storico.

È la traduzione diretta delle cinque equazioni, e si nota quanto sia compatto: la potenza del filtro sta nella struttura, non nella quantità di codice. Le librerie reali (FilterPy, le routine di controllo di MATLAB, le implementazioni in ROS) aggiungono robustezza numerica e gestione di casi limite, ma il cuore è esattamente queste poche righe.

Un drone deve sapere dove si trova in volo. Ha due sensori dalle caratteristiche opposte.

L’unità inerziale (IMU: accelerometri e giroscopi) misura ad alta frequenza, centinaia di volte al secondo, ma accumula drift: integrando piccole accelerazioni nel tempo, l’errore di posizione cresce senza limite. Il GPS misura a bassa frequenza, qualche volta al secondo, è rumoroso, ma non drifta sul lungo periodo: in media resta ancorato alla verità.

Il filtro li fonde nel modo naturale. Tra una lettura GPS e l’altra, predice la posizione integrando l’IMU: la stima avanza fitta e fluida, ma l’incertezza sale (il drift). Quando arriva una lettura GPS, corregge: la stima si riaggancia alla misura e l’incertezza scende, azzerando il drift accumulato.

Il risultato è una stima sia fluida (grazie all’IMU) sia ancorata (grazie al GPS), migliore di quanto darebbe ciascun sensore da solo. Questo schema, chiamato GPS-INS, è lo scheletro della navigazione di quasi ogni veicolo autonomo, ed è strettamente imparentato con la SLAM (simultaneous localization and mapping, slam in preparazione), dove il filtro fonde l’odometria del robot con l’osservazione di punti di riferimento nell’ambiente.

Navigazione e aerospazio. È la culla del filtro. Dal programma Apollo (lo Schmidt-Kalman filter per la navigazione di mezza rotta) al GPS moderno, fino ai sistemi di tracking radar della FAA per il controllo del traffico aereo.

NASA documenta esplicitamente il transfer: la stessa matematica nata per andare sulla Luna fonde oggi misure radar e GPS con le traiettorie predette degli aerei, riducendo l’incertezza sulla loro posizione e permettendo di gestire più voli nello stesso spazio in sicurezza.

Robotica. SLAM, localizzazione, sensor fusion (sensor-fusion in preparazione), trajectory tracking.

Quasi ogni robot mobile ha un filtro di Kalman, o una sua variante (spesso un EKF o un UKF, perché la cinematica robotica è non lineare), dentro il loop di stima dello stato. È uno dei pochi algoritmi che si trova praticamente immutato in un veicolo autonomo del 2026 e in una sonda spaziale del 1969.

Finanza e serie temporali. Stima di trend e volatilità latenti che non si osservano direttamente ma si manifestano nei prezzi; modelli stato-spazio per il forecasting; alcune strategie di trading.

È un dominio dove le ipotesi gaussiane sono spesso violate (i mercati hanno code pesanti e salti improvvisi), e infatti il filtro va usato con cautela — ma resta un punto di partenza naturale per separare un segnale lento da rumore veloce.

Modelli a spazio di stato in deep learning. Qui il legame va marcato con cura. I modelli a spazio di stato moderni — S4 e Mamba (ssm-mamba in preparazione) — usano la stessa forma matematica stato-spazio da cui nasce il filtro di Kalman: uno stato latente che evolve secondo una ricorrenza lineare. La differenza è che una rete neurale impara le matrici dai dati invece di derivarle dalla fisica.

Questa è una filiazione concettuale documentata: le survey su S4 e Mamba riconoscono esplicitamente le radici nella teoria del controllo e nei filtri di Kalman. Un caso recente, KalMamba (2024), chiude il cerchio usando Mamba per apprendere i parametri di un modello stato-spazio lineare-gaussiano in cui l’inferenza è letteralmente filtraggio di Kalman in uno spazio latente.

Conviene essere precisi su cosa è uguale e cosa no. Quel che è davvero condiviso è la forma della ricorrenza: uno stato compatto che riassume tutto il passato e si aggiorna a ogni passo combinando lo stato precedente con il nuovo ingresso. È la stessa struttura che rende sia il filtro di Kalman sia un SSM capaci di processare una sequenza lunga senza tenere in memoria tutta la storia — la ricorsività che, nel 1960, era una necessità imposta dai computer di bordo e che oggi è una scelta di efficienza per addestrare modelli su sequenze lunghissime.

Quel che è diverso è lo scopo e l’origine dei parametri: il filtro deriva F,H,Q,RF, H, Q, R da un modello fisico noto per stimare uno stato interpretabile; un SSM impara matrici analoghe per gradient descent al solo fine di predire bene il prossimo token, e il suo stato latente non ha un’interpretazione fisica garantita. Filiazione sulla forma, divergenza sullo scopo: confondere le due porta a sopravvalutare quanto un SSM “stia facendo inferenza bayesiana”.

Belief tracking di un agente. L’ultima applicazione è la più suggestiva e la più facile da fraintendere, quindi va marcata come analogia e non come identità.

Un agente — pensa a un assistente di coding che mantiene un’idea dello stato del repository, o a un agente che esplora un ambiente — costruisce una rappresentazione del mondo, la usa per predire l’effetto delle proprie azioni, poi osserva il risultato reale e corregge la rappresentazione quando l’osservazione sorprende.

Lo schema predici-correggi è lo stesso del filtro di Kalman, e la metafora è genuinamente illuminante: la “sorpresa” che guida la correzione è l’innovazione, la fiducia che si dà a un’osservazione contro le proprie aspettative è un guadagno.

Ma è un’analogia strutturale, non un’equivalenza: un agente basato su LLM non rappresenta la propria credenza come una gaussiana, non calcola covarianze, non gode di alcuna garanzia di ottimalità o di incertezza calibrata. Prendere l’analogia per identità significa aspettarsi proprietà — fusione ottimale, incertezza ben quantificata — che semplicemente non ci sono.

Il ponte con il reinforcement learning. Il filtro chiude un cerchio aperto nel capitolo sul controllo ottimo. Lì si è visto che controllo ottimo e reinforcement learning sono in larga parte lo stesso problema visto da due comunità. Il filtro di Kalman aggiunge il tassello che molti trattamenti del RL danno per scontato: cosa succede quando l’agente non osserva lo stato, ma solo misure parziali e rumorose.

Nel linguaggio del RL questo è il passaggio dall’MDP (dove lo stato è noto) al POMDP, il processo decisionale di Markov parzialmente osservabile. In un POMDP l’agente deve mantenere un belief state — una distribuzione su dove potrebbe trovarsi — e aggiornarlo a ogni osservazione.

Il filtro di Kalman è, nel caso lineare-gaussiano, esattamente l’aggiornamento ottimo di quel belief. È il legame più diretto tra questo capitolo e controllo-vs-rl (in preparazione): la stima dello stato è ciò che separa un problema in cui “sai dove sei e decidi cosa fare” da uno in cui “devi prima capire dove sei”.

I limiti del filtro contano quanto i suoi meccanismi, e quasi tutti i fallimenti nascono dal dimenticare a quali condizioni l’ottimalità è garantita.

Il filtro di Kalman ha una caratteristica pericolosa: sbaglia con sicurezza. A differenza di un metodo che restituisce una stima e basta, riporta sempre anche la propria incertezza PP — e quando le ipotesi sono violate, quella PP diventa una bugia confortante. Tenere a mente i seguenti modi di rottura serve proprio a non fidarsi di un’incertezza dichiarata che non corrisponde a quella reale.

“Filtro” non vuol dire filtro passa-basso. Il nome viene dall’elaborazione di segnali, dove filtrare significa togliere rumore. Ma il filtro di Kalman non è un filtro in frequenza: è uno stimatore ricorsivo di stato.

Chi arriva dal signal processing classico cerca a volte un taglio in frequenza che non c’è. È un equivoco di vocabolario, ma manda fuori strada: il filtro non separa frequenze, separa il segnale vero dal rumore sfruttando un modello della dinamica, cosa che un filtro passa-basso non sa fare.

Il guadagno non si tara a mano. A differenza dei guadagni del PID, che si regolano per tentativi, il guadagno di Kalman KkK_k è calcolato a ogni passo dalle covarianze P,Q,RP, Q, R. Non lo si tocca direttamente.

Ciò che si tara sono QQ (l’incertezza del modello) e RR (l’incertezza del sensore), e tararle male è il modo più comune di rompere il filtro. È un cambio di livello: non si regola direttamente “quanto fidarsi”, si regola “quanto è rumorosa ogni fonte”, e dalla fiducia segue.

Confondere QQ e RR, o sceglierli a caso. QQ dice quanto il modello è imprevedibile; RR quanto il sensore è rumoroso. Scambiarli fa fidare il filtro della fonte sbagliata.

RR troppo piccolo convince il filtro che il sensore sia perfetto, e la stima insegue il rumore di misura, ballando a ogni lettura. QQ troppo piccolo convince il filtro che il modello sia perfetto: la stima si irrigidisce sul modello, ignora le misure e, se il modello sbaglia, diverge dalla realtà restando convinta di sé.

Un filtro “troppo sicuro” — con QQ e RR sottostimati, dunque PP piccola — è il caso patologico classico: produce stime apparentemente precise e sistematicamente sbagliate. È il fallimento più insidioso, perché il filtro non protesta: riporta un’incertezza minuscola mentre la stima è lontana dal vero. Un sintomo diagnostico utile è guardare l’innovazione: se le sorprese sono sistematicamente più grandi di quanto PP e RR prevedono, le covarianze sono mal tarate.

Ottimo non vuol dire giusto. L’ottimalità è condizionata alle ipotesi lineare-gaussiane e alla correttezza del modello. Se la dinamica vera non è quella codificata in FF, o se il rumore non è gaussiano (ad esempio ha code pesanti, con outlier frequenti), la garanzia salta.

Un singolo outlier — una misura GPS che salta di cento metri per un riflesso su un palazzo — viene trattato dal filtro come un’innovazione legittima e può corrompere la stima per parecchi passi, perché il modello gaussiano non prevede valori così estremi. Difese come il gating dell’innovazione (scartare misure troppo sorprendenti) esistono proprio per questo, ma sono toppe sopra un’ipotesi violata, non parte del filtro originale.

L’osservabilità non è garantita. Se il sistema non è osservabile (vedi Cosa posso misurare, cosa posso governare), alcune componenti dello stato non sono ricostruibili da nessuna quantità di misure: l’informazione semplicemente non arriva ai sensori.

Su quelle componenti il filtro non converge e l’incertezza non scende. Prima di applicare un filtro di Kalman conviene verificare che ciò che si vuole stimare sia osservabile dalle misure disponibili — è un controllo formale, non una questione di intuito, e la teoria dei sistemi dà il criterio esatto.

Le estensioni non lineari ereditano fragilità nuove. L’EKF può divergere se la linearizzazione è cattiva; richiede Jacobiani che a volte sono difficili o costosi da calcolare. Il particle filter soffre nelle alte dimensioni e può “collassare” (poche particelle dominano i pesi, riducendo la diversità).

Nessuna estensione è gratis: ognuna sposta il compromesso tra fedeltà al modello, costo computazionale e robustezza. Passare al non lineare non è un upgrade indolore, è un cambio di rischi.

L’analogia con gli agenti va tenuta a freno. È allettante dire che un agente che mantiene una stima dello stato del mondo e la aggiorna con le osservazioni “fa un filtro di Kalman”. È un’analogia strutturale — lo schema predici-correggi è lo stesso — non un’identità: un agente basato su LLM non rappresenta il suo belief come una gaussiana né calcola covarianze.

Confondere l’analogia con un’equivalenza porta a aspettarsi dal sistema garanzie (ottimalità MMSE, calibrazione dell’incertezza) che non ha. La metafora aiuta a progettare il loop di un agente; non autorizza a promettere le proprietà matematiche del filtro originale.

  • Kalman, R. E. (1960). A New Approach to Linear Filtering and Prediction Problems. ASME Journal of Basic Engineering, vol. 82, pp. 35-45. Il paper fondativo: tecnico ma sorprendentemente leggibile sulla motivazione.
  • Welch, G. & Bishop, G. An Introduction to the Kalman Filter (UNC Chapel Hill). Il tutorial canonico con le cinque equazioni e la notazione standard, scritto per chi parte da zero.
  • NASA Aeronautics. Math Invented for Moon Landing Helps Your Flight Arrive on Time. La storia dell’incontro Kalman-Schmidt e del transfer dall’Apollo al traffico aereo, dalla fonte ufficiale.
  • Wan, E. A. & van der Merwe, R. The Unscented Kalman Filter for Nonlinear Estimation. Il riferimento sull’UKF e i sigma points, per chi vuole capire l’estensione non lineare senza Jacobiani.
  • Gu, A. & Dao, T. (2023). Mamba: Linear-Time Sequence Modeling with Selective State Spaces (arXiv:2312.00752). Per vedere come la forma stato-spazio del filtro rivive, appresa dai dati, nelle architetture di deep learning moderne.