ALMA MATER STUDIORUM – UNIVERSITÀ DI BOLOGNA FACOLTÀ DI INGEGNERIA CORSO DI LAUREA SPECIALISTICA IN INGEGNERIA INFORMATICA DIPARTIMENTO DI ELETTRONICA, INFORMATICA E SISTEMISTICA RICONOSCIMENTO DI ATTIVITÀ IN VIDEO TRAMITE MODELLI GRAFICI STIMA DI FUNZIONI DI USCITA: MEAN SHIFT Tesi in ELABORAZIONE DELL’IMMAGINE Candidato: Relatore: ROBERTO AMICI Chiar.mo Prof. Ing. LUIGI DI STEFANO Correlatore: Chiar.mo Prof. Ing. MASSIMO PICCARDI Sessione I Anno Accademico 2008/2009 ad Alberto Indice 1 Stima di funzioni di densità di probabilità 1.1 1.2 1.3 1.4 2 11 1.0.1 Cosa sono e come si rappresentano . . . . . . . . . . . . . . . . 11 1.0.2 Stima e apprendimento di modelli . . . . . . . . . . . . . . . . . 13 1.0.3 Stimatori e funzioni di densità di probabilità nella Computer Vision 16 Gaussiana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.1.1 Struttura del modello . . . . . . . . . . . . . . . . . . . . . . . . 16 1.1.2 Apprendimento del modello . . . . . . . . . . . . . . . . . . . . 20 Gaussian Mixture Model . . . . . . . . . . . . . . . . . . . . . . . . . . 23 1.2.1 Struttura del modello . . . . . . . . . . . . . . . . . . . . . . . . 24 1.2.2 Apprendimento del modello . . . . . . . . . . . . . . . . . . . . 27 Kernel Density Estimation (KDE) . . . . . . . . . . . . . . . . . . . . . 33 1.3.1 Il modello: struttura ed apprendimento . . . . . . . . . . . . . . 33 Mean Shift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 1.4.1 Struttura del modello . . . . . . . . . . . . . . . . . . . . . . . . 39 1.4.2 Apprendimento del modello . . . . . . . . . . . . . . . . . . . . 40 Dati Sequenziali e Modelli Grafici 49 2.1 Struttura del modello . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 2.1.1 Markov Model . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 2.1.2 Hidden Markov Model . . . . . . . . . . . . . . . . . . . . . . . 54 Apprendimento del modello . . . . . . . . . . . . . . . . . . . . . . . . 59 2.2.1 La funzione di likelihood . . . . . . . . . . . . . . . . . . . . . . 60 2.2.2 L’algoritmo di Baum-Welch . . . . . . . . . . . . . . . . . . . . 63 Utilizzo del modello . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 2.2 2.3 5 6 INDICE 2.3.1 2.3.2 3 4 State Decoding . . . . . . . . . . . . . . . . . . . . . . . . . . . Evaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Esperimenti 3.1 Le tre versioni . . . . . . . . . . . . . . . . . . . . . 3.1.1 Hidden Markov Model con Gaussian Mixture 3.1.2 Hidden Markov Model con KDE . . . . . . . 3.1.3 Hidden Markov Model con Mean Shift . . . 3.2 Risultati sperimentali . . . . . . . . . . . . . . . . . 3.2.1 Accuratezza a confronto . . . . . . . . . . . Conclusioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 73 77 78 78 80 83 89 90 97 Introduzione L’aumento vertiginoso dell’uso di telecamere per compiti di sorveglianza a cui stiamo assistendo negli ultimi anni è un forte traino per lo sviluppo di sistemi che permettono l’automatizzazione del trattamento delle informazioni provenienti dalle sequenze video che le telecamere forniscono, richiedendo un intervento umano diretto solo nei casi in cui è strettamente necessario. Il riconoscimento di attività è il processo di classificazione attraverso cui una sequenza video si trasforma in informazioni sulla semantica delle azioni compiute dai soggetti della sequenza. Se proviamo a pensare quali sono i vantaggi che sistemi di questo tipo possono offrire, è facile individuare numerosi ambiti che trarrebbero grande beneficio dall’uso di riconoscitori automatici: dalla rilevazione automatica di furti o rapine alle semplici indagini statistiche sulle abitudini di shopping, l’utilità dei sistemi di classificazione di attività è innegabile. La comunità scientifica internazionale non è insensibile di fronte alle necessità di un simile mercato, infatti questo genere di argomenti è stato largamente investigato ed è tutt’ora di grande interesse, attenzione che si traduce in un elevatissimo numero di pubblicazioni e ricerche. I metodi che permettono di approcciare un problema come quello del riconoscimento di attività sono simili a quelli che possiamo ritrovare in altri ambiti come il riconoscimento vocale o più in generale la classificazione di sequenze di eventi. Questi metodi sono sostanzialmente modelli probabilistici che consentono, a partire da un insieme di dati conosciuti, di apprendere un modello di classificazione. La particolarità dei modelli grafici è la possibilità di trattare in modo semplificato l’intriseca dipendenza tra le osservazioni all’interno di una sequenza, introducendo il concetto di stato come variabile nascosta (non osservabile direttamente) che influisce sulla modalità di presentarsi del fenomeno osservato, eliminando la dipendenza diretta tra i valori effettivamente osservati. Il modello grafico che prenderemo in esame è detto modello nascosto di Markov e fa uso di una catena di Markov del primo ordine per costruire la struttura degli stati nascosti. Il più complesso 7 8 INDICE tra i parametri che definiscono un modello nascosto di Markov è il metodo di stima delle funzioni di probabilità di uscita (dette anche probabilità di emissione) che caratterizzano le possibilità che uno stato generi certi tipi di fenomeni osservabili. Il più comune di questi metodi è detto misto di Gaussiane e, sotto certe ipotesi, garantisce buoni risultati. Un approccio differente è stato proposto in [14], in cui viene usato un metodo nonparametrico, chiamato Kernel Density Estimation, per sostituire il misto di Gaussiane. Tuttavia, nonostante risultati incoraggianti dal punto di vista della qualità delle stima e della robustezza rispetto ai parametri iniziali, questo approccio soffre di una scarsa compattezza per quanto riguarda i risultati finali. Obiettivo di questa tesi è estendere questa ricerca sviluppando una libreria che consenta di mantenere la qualità e la robustezza del metodo presentato, fornendo una rappresentazione delle funzioni di densità di probabilità più compatta e meno onerosa computazionalmente in fase di esecuzione grazie ad una tecnica che ha acquisito molta popolarità negli ultimi anni: il Mean Shift. Il sistema finale, pur rimanendo un modello valido per una moltitudine di applicazioni, è stato testato per un’applicazione di riconoscimento di attività umane, in cui si vuole discriminare lo stato delle persone che compaiono all’interno di una sequenza video secondo tre diverse categorie: persone inattive (ferme), persone che camminano e persone che corrono. Metteremo a confronto il metodo classico con misto di Gaussiane con i due modelli basati su KDE semplice e su KDE con post-processing tramite Mean Shift. Noteremo un mantenimento delle performance qualitative di KDE con un grande guadagno in termini di sforzi computazionali in fase di esecuzione, grazie alla rappresentazione compatta delle funzioni di emissione fornita dal Mean Shift. Il lavoro svolto durante questa tesi si è articolato in tre attività principali: lettura e comprensione degli articoli e pubblicazioni scientifiche sugli argomenti attinenti alle tematiche trattate; progettazione e implementazione di una libreria Matlab per la stima di funzioni di emissione tramite Mean Shift; sperimentazione della libreria all’interno di un sistema basato su modelli nascosti di Markov, parte di un progetto di ricerca del dipartimento di Computer Systems della facoltà di Information Technology della University of Technology, Sydney. La tesi è strutturata nel seguente modo: nel primo capitolo introdurremo il concetto di stima di funzioni di probabilità, mostrando diversi modelli per l’apprendimento e la costruzione di una funzione probabilistica a partire da una serie di osservazioni sperimentali indipendenti tra loro. In particolare vedremo le tecniche che useremo poi all’interno di un INDICE 9 ambiente più complesso come i modelli nascosti di Markov. Nel secondo capitolo inseriremo il vincolo di dipendenza tra le osservazioni all’interno di una sequenza, descrivendo la struttura e il funzionamento dei modelli nascosti di Markov, con specifici riferimenti alle procedure di apprendimento e di utilizzo. Il terzo capitolo espone il sistema utilizzato per le rilevazioni sperimentali, con particolare attenzione per il componente implementato durante lo svolgimento di questa tesi, oltre ad i risultati delle suddette rilevazioni. Seguiranno infine le conclusioni sul lavoro svolto e le estensioni per il futuro. 10 INDICE Capitolo 1 Stima di funzioni di densità di probabilità La discussione degli argomenti trattati in questa tesi passa inevitabilmente da una panoramica degli strumenti matematici che andremo ad usare. Introdurremo quindi in questa sezione le funzioni di densità di probabilità, conosciute in altri contesti con funzioni di uscita o di emissione, vedremo cosa sono e a cosa servono. Sfortunatamente esiste una grande varietà di situazioni in cui la funzione di densità di probabilità di un evento non è nota a priori: da questo nasce la necessità di stimare la funzione di probabilità a partire da una serie di osservazioni; esistono diversi metodi per calcolarla: illustreremo i più comuni. 1.0.1 Cosa sono e come si rappresentano Una funzione di densità di probabilità (conosciuta anche con l’acronimo inglese pdf probability density function) è una funzione che associa le modalità in cui un evento si può presentare con le effettive probabilità che le varie modalità hanno di presentarsi. La distribuzione di probabilità è rappresentata in termini di integrali: b p(x ∈ (a, b)) = p(x)dx a La probabilità che x cada nell’intervallo (a, b) è quindi data dall’integrale della funzione p(x) nell’intervallo desiderato. Intuitivamente possiamo pensare alla funzione di densità 11 12 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ di probabilità come alla versione continua di un istogramma, con i valori assumibili da x in ascissa e i valori di probabilità p(x) associati in ordinata. Le prime considerazioni da fare riguardo a questa funzione, cioè la non-negatività delle probabilità e la necessità del valore x di avere un valore all’interno del dominio, ci portano a definire formalmente due proprietà fondamentali per le funzioni di densità di probablità p(x): • p(x) > 0 • ∞ −∞ p(x)dx = 1 La probabilità che x giaccia nell’intervallo (−∞, z) è data dalla funzione di distribuzione cumulativa, definita come: z p(x)dx P (z) = −∞ che soddisfa P 0 (x) = p(x), come mostrato in figura 1.1. Figura 1.1: La figura mostra in rosso la funzione di probabilità p(x), in blu la funzione di distribuzione cumulativa P (x) ed in verde l’area sottesa in un intervallo δx, che rappresenta la probabilità che x assuma un valore compreso tra x e x + δx. Di particolare interesse è la possibilità di poter calcolare la media pesata di una funzione f (x) che segue una certa distribuzione di probabilità p(x). Questo valore si chiama valore atteso (o speranza matematica) e si calcola facilmente con: +∞ E[f (x)] = p(x)f (x)dx −∞ 13 La varianza di una funzione f (x) fornisce una misura su concentrazione e variabilità della funzione attorno al suo valore atteso E[f (x)] ed è definita come la media delle differenze al quadrato tra il valore atteso e ogni singolo punto della funzione: var[f (x)] = E[(f (x) − E[f (x)])2 ] Espandendo il quadrato, possiamo notare che la varianza può essere riscritta in termini di differenza tra la media dei quadrati della funzione e la media al quadrato della stessa: var[f (x)] = E[f (x)2 ] − E[f (x)]2 Le definizioni e le proprietà descritte finora sono facilmente trasportabili da un dominio monodimensionale a domini multidimensionali, che sono certamente più frequenti nei casi reali e nelle applicazioni di cui questa tesi si occupa. Ovviamente la varianza, essendo una misura quadratica, avrà una forma matriciale (D × D con D numero di dimensioni) anziché vettoriale come ci si attende da altre variabili come la media. 1.0.2 Stima e apprendimento di modelli Come già accennato, gran parte degli eventi che riscontriamo nel mondo reale seguono una distribuzione di probabilità non nota. Quello che generalmente si fa quando si ha a che fare con eventi di questo tipo è cercare di stimare la funzione di densità di probabilità ignota attraverso l’osservazione dell’evento. Saranno necessarie, quindi, una serie di misurazioni (dette anche osservazioni) dell’evento per poter calcolare una stima della funzione di probabilità desiderata: ovviamente il numero e la qualità (in termini di rumore) delle osservazioni giocheranno un ruolo fondamentale all’interno del processo di stima e quindi influenzeranno inevitabilmente l’affidabilità della stima ottenuta. Cercare di minimizzare l’impatto del rumore è uno degli obiettivi che i vari metodi di stima si pongono, oltre ovviamente all’accuratezza della stima stessa. Un esempio delle insidie che può riservare il processo di stima di una pdf può essere un semplice esercizio di interpolazione di una curva polinomiale. Partendo da un set di osservazioni per la variabile x, vogliamo costruire una funzione che ci permetta di stimare il valore di f (x) per valori di x non osservati in precedenza. Quello che normalmente si fa è cercare una funzione che massimizzi la “somiglianza” tra la funzione di interpolazione e le 14 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ osservazioni che abbiamo a disposizione. Massimizzare questa somiglianza è equivalente a minimizzare una funzione di errore, che può essere facilmente modellata considerando la distanza tra l’osservazione e il valore della funzione di stima. Una funzione di errore comunemente usata è la somma dei quadrati delle distanze tra ogni osservazione e il corrispondente valore di f (x). Chiamando xn le osservazioni e tn i valori osservati, possiamo scrivere la funzione di errore come: Err(x) = N X (f (xn ) − tn )2 n=1 Cercheremo quindi una funzione f (x) che minimizzi l’errore calcolato con questo metodo. Senza complicare inutilmente le cose, possiamo decidere di utilizzare una f (x) polinomiale del tipo 2 f (x) = w0 + w1 x + w2 x + .... + wM x M = M X w j xj j=0 Dove i wj sono i coefficienti del polinomio e M è il grado dello stesso. Questi due parametri determineranno la forma della nostra funzione. Essendo la funzione di errore quadratica rispetto ai coefficienti wj , la sua derivata sarà lineare e quindi, fissato il grado del polinomio M , la minimizzazione della funzione Err(x) avrà un risultato univoco. Il grado del polinomio rappresenta la complessità della funzione (e quindi del modello) che stiamo costruendo, che avrà infatti M gradi di libertà. Intuitivamente si potrebbe pensare che modelli più complessi rispondano (in generale) meglio in qualunque tipo di situazione. Questo è vero solo in parte, infatti concedendo troppi gradi di libertà alla funzione, questa rischia, guidata dalla minimizzazione della funzione di errore, di ricalcare esattamente i punti del campione osservato. Possiamo notare in figura 1.2 come la scelta di un valore di M troppo elevato porti la funzione di errore a valori molto prossimi allo zero, ma è facilmente intuibile che la somiglianza tra le osservazioni (generate per questo esempio da una funzione sinusoidale) e le varie funzioni di stima è massima per il caso di M = 3. Il fenomeno che osserviamo per il caso M = 9 è chiamato overfitting, per indicare l’eccessiva somiglianza tra il modello e le osservazioni (chiamati dati di apprendimento o training). L’overfitting si manifesta attraverso ottimi risultati della funzione di errore durante la 15 Figura 1.2: Il grafico mostra polinomi aventi diverso ordine M , mostrati in rosso, che cercano di stimare la distribuzione disegnata in verde a partire dalle osservazioni (punti blu). fase di apprendimento ma scarsa affidabilità durante il reale utilizzo del modello. Risulta evidente che non possiamo basarci solo sui risultati della funzione di errore calcolati sui dati di apprendimento per valutare la bontà di una stima: avremo bisogno di un set di osservazioni non utilizzate durante l’apprendimento per poter testare il comportamento della funzione stimata al presentarsi di punti “nuovi”, cioè non visti in fase di training (queste osservazioni sono chiamate di test). Quello che normalmente si fa, quindi, è dividere il dataset di dati etichettati (cioè dati di cui è conosciuto il valore osservato di f (x)) in due parti: una verrà utilizzata per l’apprendimento e l’altra per il test. Il valore della funzione di errore calcolata sui dati di test ci darà una misura sull’accuratezza della nostra stima. E’ piuttosto intuitivo notare che il fenomeno di overfitting si presenta quando il numero di gradi di libertà del polinomio si avvicina al numero di osservazioni: una euristica usata in qualche caso è di usare modelli di complessità 5 o 10 volte inferiore del numero dei punti. E’ chiaro quindi che il metodo migliore per evitare il presentarsi dell’overfitting è l’uso di dataset di dimensioni significative. 16 1.0.3 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ Stimatori e funzioni di densità di probabilità nella Computer Vision L’uso che si fa delle funzioni di densità di probabilità in campo scientifico è decisamente vasto. In qualunque campo applicativo può essere utile essere in grado di apprendere modelli di eventi a partire da semplici osservazioni di un fenomeno. Il settore della Computer Vision non fa eccezione: un esempio significativo può essere il cosiddeto tracking, cioè la capacità di un sistema automatico di seguire un soggetto che si muove all’interno di una sequenza video. Immaginiamo la sequenza video come una partita di calcio: se riuscissimo a costruire uno stimatore in grado di “imparare” in modo non supervisionato una funzione di densità di probabilità rispetto al colore delle maglie dei giocatori che si muovono sul campo, saremo in grado di distinguere in modo automatico i giocatori di una squadra dall’arbitro e da quelli dell’altra squadra e seguirli all’interno del campo di gioco durante la riproduzione della sequenza video, perché saremo in grado di definire, per ogni pixel, la probabilità di appartenenza ad una certa classe (che potrebbe essere per esempio “squadra A”, “squadra B”, “arbitro”, “sfondo”). In realtà la stima di una densità di probabilità viene spesso usata come dato di partenza per analisi più complesse che fanno uso di modelli a stati per modellare situazioni più complesse di una semplice classificazione come quella illustrata poc’anzi. In particolare, nel sistema che abbiamo usato per i nostri esperimenti, useremo uno strumento chiamato Hidden Markov Model per il riconoscimento automatico di attività umane (che possono essere per esempio saltare, camminare, correre, ecc.) attraverso l’osservazione di sequenze video. 1.1 Gaussiana Per iniziare la trattazione dei modelli di stima delle funzioni di probabilità, iniziamo da una delle più semplici a cui si può pensare, ma che possiede proprietà che saremo interessati a sfruttare in modelli più complessi. 1.1.1 Struttura del modello La distribuzione normale, conosciuta anche come Gaussiana, è largamente usata per modellare distribuzioni continue. I motivi di un così frequente utilizzo sono la molteplicità 17 1.1. GAUSSIANA di contesti in cui questa particolare distribuzione si presenta e la moltitudine di importanti proprietà analitiche che la Gaussiana possiede, come il teorema del limite centrale (LaPlace) e la proprietà di essere la distribuzione che massimizza l’entropia. La distribuzione Gaussiana è definita a partire da due parametri µ e σ 2 , chiamati rispettivamente media e varianza della distribuzione: (x−µ)2 1 e− 2σ2 G(x|µ, σ 2 ) = p (2πσ 2 ) Da questa forma si può notare che la distribuzione soddisfa la proprietà di non-negatività ed è di diretta soluzione anche il calcolo dell’area sottesa, che dimostra l’unitarietà dell’integrale di G(x). I nomi dei due parametri non sono un caso, infatti tramite semplici calcoli dei valori attesi E[x] = µ ed E[x2 ] = σ 2 + µ2 è immediato ricondurre i valori di µ e σ 2 a media e varianza della distribuzione. La notazione esposta è propria dei domini monodimensionali, i quali rappresentano una semplificazione efficace e trattabile con facilità. E’ bene però anche mostrare le differenze e le proprietà delle Gaussiane a molte dimensioni. Dato quindi come ingresso un vettore D-dimensionale x = (x1 , x2 , ..., xD ), la distribuzione Gaussiana multidimensionale risulta essere 1 − (x−µ)T Σ−1 (x−µ) 1 2 e G(x|µ, Σ) = (2π)D/2 |Σ|1/2 dove µ è un vettore D-dimensionale che rappresenta la media e Σ una matrice D × D che rappresenta la covarianza. Analizzando le differenze tra il caso monodimensionale e quello multidimensionale, notiamo che la covarianza è rappresentata da una matrice, ma, può essere presa una matrice simmetrica senza perdita di generalità perché qualsiasi componente asimmetrico scomparirebbe con l’operazione di esponenziazione. Il fattore che dà la dipendenza nei confronti di x è di forma quadratica: ∆2 = (x − µ)T Σ−1 (x − µ) La quantità ∆ è detta distanza di Mahalanobis da x a µ e si riduce alla distanza euclidea nel caso in cui Σ sia la matrice identità. Essendo ∆ l’unico valore che dipende da x all’interno della formula che descrive la distribuzione, è chiaro che ogni valore di x che mantiene costante il valore di ∆ avrà un valore di G(x) costante. E’ inoltre dimostrabile che, estraendo 18 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ gli autovettori e gli autovalori della matrice di covarianza è possibile modificare il sistema di riferimento e allineare gli assi agli autovettori della matrice di covarianza. Quello che si otterrebbe è qualcosa di simile a quello che possiamo vedere in figura 1.3. Figura 1.3: La curva rossa mostra una superficie ellittica di probabilità costante per una Gaussiana bi-dimensionale con matrice di covarianza caratterizzata da autovettori (u1 , u2 ) e autovalori (λ1 , λ2 ) E’ chiaro quindi che la matrice di covarianza Σ usata all’interno della distanza di Mahalanobis non fornisce altro che una rotazione (attraverso i suoi autovettori unitari) e una dilatazione (attraverso gli autovalori) lungo gli assi descritti dagli autovettori. Riscrivendo l’espressione della distribuzione in accordo con il nuovo sistema di riferimento yi = uTi (x − µ) otteniamo: D Y 2 y 1 − 2λj j G(y) = e 1/2 (2πλ ) j j=1 in cui abbiamo scomposto la matrice di covarianza ed abbiamo usato gli autovettori uj per effettuare il cambio di variabile e gli autovalori λj per imprimere i valori di variabilità della distribuzione dati dalla matrice di covarianza Σ. Notiamo quindi che una distribuzione Gaussiana multidimensionale non è altro che il prodotto di D Gaussiane monodimensionali indipendenti. Inoltre è dimostrabile facilmente che: E[x] = µ 19 1.1. GAUSSIANA E[xT x] = µµT + Σ e cov[x] = E[(x − E[x])(x − E[x])T ] = Σ Nonostante la distribuzione Gaussiana sia largamente usata, soffre di limitazioni significative. In primo luogo il numero di parametri liberi è non banale: la matrice di covarianza, seppur simmetrica, presenta D(D + 1)/2 parametri indipendenti, più altri D parametri per specificare la media µ, per un totale di D(D + 3)/2 parametri totali. Per valori di D elevati, la complessità cresce quadraticamente con il numero di dimensioni, rendendo il costo computazionale di manipolazione e inversione della matrice di covarianza proibitivo. Un modo di evitare questo problema è semplificare la matrice di covarianza Σ, rendendola diagonale (D parametri) oppure proporzionale alla matrice di identità (un solo parametro, conosciuta come covarianza isotropa). I tre possibili casi di matrici di covarianza sono illustrate in figura 1.4. Le limitazioni di questo metodo sono evidenti: rendendo diagonale la matrice di covarianza stiamo eliminando i fattori di rotazione della gaussiana, rendendo impossibile catturare alcune possibile correlazioni tra i dati. Figura 1.4: Contorni a probabilità costante per distribuzioni Gaussiane bi-dimensionali in cui la matrice di covarianza è in forma generale (a), diagonale (b) o isotropa (c) Un altro limite significativo è l’unimodalità intrinseca della distribuzione e quindi l’incapacità di fornire una buona approssimazione per distribuzioni multimodali. La distribuzione Gaussiana è quindi da un lato troppo flessibile a causa della moltitudine di parametri e dall’altra troppo limitata come gamma di distribuzioni che può rappresentare in modo adeguato. Il motivo per cui è così largamente usata è che esistono svariati modi per ovviare a questi difetti e approssimare con buon grado di precisione un gran numero di distribuzioni. Ne vedremo in seguito una in particolare. 20 1.1.2 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ Apprendimento del modello Ovviamente l’uso di una singola Gaussiana per stimare una distribuzione sconosciuta assume come ipotesi che i dati da stimare seguano approssimativamente un tipo di distribuzione normale. Essendo questo tipo di tecnica piuttosto semplice, si utilizzano strumenti di complessità piuttosto relativa. Andremo comunque a esaminarli, perché saranno largamente usati in seguito per i modelli più complessi. Supponiamo di avere un dataset di N osservazioni D = (x1 , x2 , ..., xN ) di una variabile scalare x. Assumiamo che le osservazioni siano estratte da una distribuzione Gaussiana la cui media µ e varianza σ 2 sono sconosciute e che le osservazioni siano estratte indipendentemente una dall’altra a partire dalla stessa distribuzione (si definisce questo tipo di dati independent and identically distributed, abbreviabile con l’acronimo i.i.d.). Quest’ultima assunzione ci permette di poter calcolare le probabilità congiunte delle varie osservazione con una semplice moltiplicazione delle probabilità di ogni singola estrazione. Possiamo quindi scrivere la probabilità che il nostro dataset D segua una distribuzione normale di media µ e varianza σ 2 come: 2 p(D|µ, σ ) = N Y G(xn |µ, σ 2 ) n=1 Se guardiamo questa probabilità come una funzione di µ e σ 2 , possiamo interpretarla per ricercare i valori di media e varianza che consentono la miglior aderenza (in inglese fitting) di una distribuzione Gaussiana con il nostro dataset D. Questo tipo di funzione è chiamata likelihood e può essere interpretata graficamente come in figura 1.5. Il modo più comune di determinare il valore dei parametri in una distribuzione di probabilità usando un insieme di osservazioni è cercare i parametri che massimizzano la funzione di likelihood. Questo potrebbe sembrare un criterio strano, perché potrebbe sembrare più diretto calcolare la probabilità dei parametri dato il dataset (cioè p(µ, σ 2 |D)) anzichè la probabilità che il dataset si adatti a certi parametri. In realtà le due cose sono strettamente correlate, come il teorema di Bayes dimostra. Continueremo quindi ad usare questo metodo. Nelle applicazioni reali risulta spesso complesso calcolare il valore della funzione di likelihood perché è in prima analisi un prodotto, e quindi richiede operazioni di complessità non trascurabile, ed in secondo luogo i fattori sono valori di probabilità (quindi minori di 1) 21 1.1. GAUSSIANA Figura 1.5: Illustrazione di una distribuzione Gaussiana di media e varianza note, mostrata in rosso. I punti neri rappresentano i valori {xn } del dataset e la funzione di likelihood corrisponde al prodotto dei punti blu. Calcolare il massimo della funzione di likelihood comporta la correzione dei parametri di media e varianza della distribuzione Gaussiana in modo da massimizzare il prodotto. a volte molto piccole, spesso molto numerose e di conseguenza il calcolo potrebbe portare ad un underflow della precisione numerica del calcolatore. Per questi motivi generalmente si adotta una funzione logaritmica della likelihood, detta log-likelihood, che permette di trasformare i prodotti in somme e, grazie alla proprietà di monotonicità del logaritmo, il massimo della funzione di likelihood coinciderà sempre con il massimo del suo logaritmo. Possiamo quindi scrivere la funzione di log-likelihood come: ln p(D|µ, σ 2 ) = − N N N 1 X 2 2 ln σ − ln(2π) (x − µ) − n 2σ 2 n=1 2 2 Massimizzando la log-likelihood rispetto a µ, otteniamo la soluzione di massima likelihood: N 1 X µM L = xn N n=1 che non è altro che altro che la semplice media aritmetica dei valori {xn }del campione. Similarmente, massimizzando la log-likelihood rispetto a σ 2 otteniamo una soluzione per la varianza: N 1 X 2 σM = (xn − µM L )2 L N n=1 che è la varianza dei valori del campione misurata rispetto alla media del campione µM L . Purtroppo il metodo di massimizzazione della likelihood ha alcune debolezze intrinse- 22 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ che, la più importante delle quali è una sottostima della varianza dovuta ad un fenomeno chiamato bias e correlato al problema di overfitting che abbiamo discusso in precedenza. 2 Per analizzare il problema, iniziamo notando che µM L e σM L sono funzioni del dataset D. Considerando i valori attesi di queste quantità rispetto ai valori estratti da vari dataset (tutti provenienti dalla stessa una distribuzione normale con parametri µ e σ 2 ), è diretto mostrare che E[µM L ] = µ N −1 2 σ2 E[σM L ] = N quindi la stima fornita dal metodo di massimizzazione della likelihood stima correttamente la media ma sottostimerà la varianza reale di un fattore (N − 1)/N . L’intuzione che sta dietro a questo metodo è mostrata in figura 1.6. Figura 1.6: La figura mostra come il fenomeno del bias generi problemi di sottostima della varianza. La curva verde mostra la distribuzione Gaussiana incognita da cui i vari dataset (punti blu) sono generati. Le tre curve rosse sono le distribuzioni Gaussiane ottenute attraverso il metodo della massima likelihood. Le medie tra i tre diversi dataset mostrano chiaramente che la media è stimata correttamente, mentre la varianza è sottostimata perché il suo calcolo è basato sulla media stimata e non su quella reale. Ne segue che per calcolare il parametro esente dal bias dobbiamo applicare un fattore di correzione alla media stimata: N σ̃ 2 = N 1 X 2 σM (xn − µM L )2 L = N −1 N − 1 n=1 1.2. GAUSSIAN MIXTURE MODEL 23 E’ immediato notare che questa correzione risulta irrilevante per N sufficientemente grandi. In realtà in problemi in cui il numero di parametri risulta elevato, il bias torna ad essere influente; infatti esattamente come l’overfitting, da cui deriva, aumenta il proprio peso con l’aumentare della molteplicità dei parametri. Come già accennato in precedenza, questo modello mostra ovviamente tutti i suoi limiti nel momento in cui la distribuzione da stimare si discosta dalla classica forma a campana presentando più di un modo. Un’idea per superare questo limite è presentata nella sezione seguente. 1.2 Gaussian Mixture Model Nonostante la moltitudine di importanti proprietà analitiche che la distribuzione Gaussiana possiede, il limite di modellazione di dataset reali causato dalla monomodalità intrinseca della Gaussiana risulta un problema significativo. Per superare questa limitazione, diversi studi hanno portato alla definizione di modelli probabilistici che prevedessero combinazioni lineari di più distribuzioni semplici per formarne una complessa. Il caso che studieremo propone un misto di Gaussiane (in inglese Gaussian Mixture) per la modellazione di distribuzioni complesse (ne vediamo un esempio in figura 1.7). Da non dimenticare il fatto che la distribuzione Gaussiana non è la sola possibilità di misto: esistono modelli che prevedono diverse tipologie di distribuzioni, più importante delle quali i misti di distribuzioni di Bernoulli. Figura 1.7: Esempio di un misto di Gaussiane monodimensionali. La figura mostra tre Gaussiane in blu (ognuna normalizzata secondo un coefficente moltiplicativo) e la loro somma in rosso. 24 1.2.1 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ Struttura del modello Usando quindi un numero sufficiente di singole Gaussiane e correggendo le loro medie e covarianze, oltre ai coefficienti della combinazione lineare, possiamo stimare la maggior parte delle distribuzioni di densità con un grado di accuratezza arbitrario. Per iniziare consideriamo un misto di K distribuzioni Gaussiane, che possiamo immaginare scritto in questa forma: pGM (x) = K X πk G(x|µk , Σk ) k=1 Ogni distribuzione Gaussiana G(x|µk , Σk ) è chiamata componente del misto ed ha una propria media µk e covarianza Σk . I parametri πk sono chiamati coefficienti di mix. Figura 1.8: Illustrazione di un mix di tre Gaussiane in uno spazio bi-dimensionale. Nella figura (a) vediamo i contorni a densità costante di ognuna delle tre componenti, colorate in rosso, blu e verde. In (b) è illustrato il contorno a densità costante della distribuzione marginale di probabilità p(x). (c) presenta un grafico tridimensionale della distribuzione p(x). Osservando l’equazione precendente, notiamo che l’integrale della parte sinistra deve essere sicuramente uguale ad uno, così come gli integrali delle singole Gaussiane sulla parte destra: da questo risulta evidente che la responsabilità di far sì che la somma di tutte le K Gaussiane abbia integrale unitario è dei coefficienti di mix, e quindi: X k πk = 1 25 1.2. GAUSSIAN MIXTURE MODEL Inoltre il requisito p(x) > 0, assieme a G(x|µk , Σk ) > 0, implica πk > 0 per ogni k. Combinando questo requisito con quello precedente otteniamo 0 6 πk 6 1 ∀k Possiamo interpretare questo risultato come una verifica che tutti i coefficienti πk soddisfano le proprietà per essere definiti come probabilità. Ci serviremo di questa intuizione tra breve. Per poter manipolare al meglio questo particolare modello faremo uso di altre variabili, chiamate variabili latenti. Queste variabili sono contenitori di informazioni non strettamente necessari, ma introdotti per permettere di definire il modello in modo più accurato ed esprimere complesse distribuzioni marginali su variabili osservabili in termini di distribuzioni congiunte sullo spazio delle variabili osservabili unito a quello delle variabili latenti. Introduciamo quindi una variabile K-dimensionale z avente una rappresentazione di tipo 1-su-K, in cui cioè un suo particolare elemento zk è uguale ad 1 e tutti gli altri P elementi sono uguali a 0. Espresso in formule matematiche: zk ∈ {0, 1} e k zk = 1. La variabile z ha quindi K stati, dipendentemente da quale dei suoi elementi è diverso da zero. Definiamo la funzione di probabilità associata a z in relazione ai coefficienti di mix (interpretati come probabilità di un generico punto di appartenere alla Gaussiana k): p(zk = 1) = πk e, più in generale: p(z) = K Y πkzk k=1 Possiamo definire ora la probabilità congiunta p(x, z) in termini di distribuzione marginale p(z) e distribuzione condizionale p(x|z). Dobbiamo solo definire la distribuzione condizionale, facilmente intuibile come la probabilità di x dato un particolare valore di z: p(x|zk = 1) = G(x|µk , Σk ) 26 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ che può essere riscritto nella forma: p(x|z) = K Y G(x|µk , Σk )zk k=1 La distribuzione di probabilità congiunta p(x, z) può quindi essere calcolata ora come p(z)p(x|z) e la distribuzione marginale p(x) è ottenuta come somma delle probabilità congiunte su tutti i possibili stati di z: p(x) = X p(z)p(x|z) = z K X πk G(x|µk , Σk ) k=1 Ovviamente se abbiamo diverse osservazioni x1 , x2 , ..., xN avremo, per come abbiamo strutturato il modello, diverse variabili latenti zn , ognuna associata ad una osservazione xn . Abbiamo quindi usato la variabile latente z per raggiungere la forma del modello ipotizzata all’inizio. Potrebbe sembrare di non aver guadagnato molto da questa rappresentazione, ma in realtà ora abbiamo l’opportunità di lavorare sulla distribuzione congiunta p(x, z) anzichè sulla distribuzione marginale p(x), e questo ci porterà significative semplificazioni e notevoli vantaggi all’interno della procedura di stima. A questo proposito, è bene introdurre un’altra importante grandezza, cioè la probabilità condizionale di z dato x. Useremo per semplicità la notazione γ(zk ) per indicare p(zk = 1|x), il cui valore può essere calcolato usando il teorema di Bayes: γ(zk ) = p(zk = 1|x) = πk G(x|µk , Σk ) p(zk = 1)p(x|zk = 1) = K K P P p(zj = 1)p(x|zj = 1) πj G(x|µj , Σj ) j=1 j=1 Possiamo quindi vedere πk come la probabilità a priori di zk = 1 e la quantità γ(zk ) come la corrispondente probabilità a posteriori, una volta osservato x. γ(zk ) può anche essere vista come la responsabilità che il componente k si assume per “motivare” l’osservazione x. Per chiarire il concetto, le varie probabilità sono riportate in figura 1.9. 27 1.2. GAUSSIAN MIXTURE MODEL Figura 1.9: La figura mostra un dataset di esempio formato da 500 punti estratti da un misto di 3 Gaussiane. In (a) i campioni hanno colori diversi per indicare che sono stati estratti da diverse Gaussiane: il colore non è altro che il valore di z. (b) mostra il dataset incompleto, cioè senza informazioni sulla provenienza dei campioni e quindi su z. In (c) i punti sono stati colorati con una proporzione di colori collegata ai valori di responsabilità γ(zk ). 1.2.2 Apprendimento del modello Come nel caso di singola Gaussiana, il metodo che useremo per stimare la funzione incognita mira alla massimizzazione della funzione di likelihood. A partire da un dataset di osservazioni {x1 , ..., xN } rappresentato come una matrice X a N × D dimensioni, in cui la n-esima riga è l’osservazione xTn , e le corrispondenti variabili latenti, memorizzate in una matrice N × K che chiameremo Z, assumeremo che le osservazioni sono estratte dalla stessa distribuzione di partenza in modo indipendente una dall’altra e potremo scrivere una funzione di likelihood di questo tipo: N Y p(X|π, µ, Σ) = p(xn ) n=1 che scritta sottoforma di log-likelihood diventa: ln p(X|π, µ, Σ) = N X n=1 ln (K X ) πk G(xn |µk , Σk ) k=1 Prima di parlare di come massimizzare questa funzione, faremo una piccola divagazione riguardo ai problemi che questo compito può nascondere. A prima vista può infatti 28 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ sembrare che non ci siano grosse differenze tra il caso a singola Gaussiana e questo caso. La prima cosa che si nota però è la presenza della sommatoria, che non permette al logaritmo di agire direttamente sulla formula della Gaussiana, rendendo l’annullamento delle derivate prime della log-likelihood non più una soluzione in forma chiusa: per questo dovremo applicare un algoritmo iterativo, chiamato EM, per cercare la soluzione ottima per la massimizzazione della likelihood. Il secondo problema che incontriamo, cioè quello dovuto alla presenza di eventi noti come singolarità, necessita di una trattazione più accurata. Ipotizziamo per semplicità che le matrici di covarianza siano isotrope, cioè Σk = σk2 I per ogni valore di k, considerato che questa semplificazione non porterà differenze sul risultato finale. Supponiamo inoltre che il j-esimo componente abbiam media µj esattamente uguale ad una delle osservazioni xn . Questa osservazione contribuirebbe alla likelihood con un valore dato da: G(xn |xn , σ 2 I) = 1 √ σj 2π Un metodo che miri alla massimizzazione della likelihood cercherà senza dubbio di massimizzare ogni singolo termine, compreso quello in esame. Se consideriamo il limite σj → 0, allora è chiaro che questo termine tenderà ad infinito, così come, di conseguenza, la likelihood. Intuitivamente avere una singola Gaussiana che collassa su una sola osservazione non è una cosa desiderabile. Possiamo vedere in figura 1.10 una rappresentazione grafica di questo fenomeno. Figura 1.10: Singolarità. Il metodo di massimizzazione della likelihood fa collassare una intera Gaussiana su una singola osservazione, guidato dalla likelihood tendente all’infinito di una componente con varianza tendente a zero. La massimizzazione della likelihood, quindi, è un problema più complesso di quanto 1.2. GAUSSIAN MIXTURE MODEL 29 potesse sembrare nel caso di una singola Gaussiana. A questo punto però viene da chiedersi perché nel modello a singola Gaussiana questo problema non viene sollevato. La risposta è piuttosto semplice: se una singola Gaussiana collassa su un solo punto, tutti gli altri punti porterebbero un fattore di moltiplicazione della likelihood uguale a zero, fattori che convergono a zero molto più velocemente di quanto il solo punto di singolarità non tenda ad infinito. Questo non succede se abbiamo più di una Gaussiana, infatti, se un punto tende a diventare una singolarità, gli altri punti potrebbero essere associati ad un’altra Gaussiana, portando un contributo non nullo e quindi non azzerando il valore di likelihood. Approcci di tipo diverso da quello che studieremo consentono di evitare a priori questo problema, ma nel caso in esame ci limiteremo ad individuare quando una soluzione tende a creare una singolarità, scartarla e continuare con l’ottimizzazione. Il terzo tema su cui ci soffermeremo è di rilevanza minore rispetto agli altri due, ma una citazione è doverosa in quanto questo problema, anche se prevalentemente ininfluente nel nostro caso, diventa di importanza non trascurabile in altri contesti. Il problema in questione è noto in letteratura come identificabilità (dall’inglese identifiability) e sorge dalla necessità di assegnare K valori (set di parametri) a K componenti. E’ chiaro che ci sono K! modi di assegnare alle diverse Gaussiane la stessa soluzione, modificando solo l’assegnazione dei vari parametri. In altre parole, data una soluzione, ne esistono altre K! − 1 che danno luogo alla stessa distribuzione finale. Come detto, questo problema risulta irrilevante per il nostro caso perché noi siamo interessati solo alla bontà della stima della soluzione finale e non al confronto tra diverse soluzioni dello stesso modello. Siamo ora pronti ad introdurre l’algoritmo di Expectation-Maximization [13], abbreviato con EM, che ci porterà alla soluzione del problema di massimizzazione della likelihood per misti di Gaussiane. La versione dell’algoritmo che illustreremo sarà specifica per la soluzione di questo problema; gli algoritmi di tipo EM sono infatti largamente usati in vari campi: per una trattazione più generale degli algoritmi EM, consultare [2]. Riprendiamo ora da dove avevamo lasciato la funzione di log-likelihood. Per massimizzare questa funzione, è necessario trovare i parametri che ne azzerino le derivate non solo rispetto a µ e Σ, come accadeva nel caso di singola Gaussiana, ma anche rispetto ai πk . Eguagliando a zero la derivata rispetto a µk otteniamo: K X π G(xn |µk , Σk ) Pk Σ−1 k (xn − µk ) = 0 π G(x |µ , Σ ) j n j j j k=1 30 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ in cui possiamo ritrovare la definizione che abbiamo dato prima di responsabilità γ(znk ) all’interno della sommatoria. Da notare che appare un Σ−1 k , quindi la matrice di covarianza è assunta non singolare. Risolvendo l’equazione ricaviamo: N 1 X γ(znk )xn µk = Nk n=1 in cui abbiamo definito Nk come Nk = N X γ(znk ) n=1 interpretabile come l’effettivo numero di punti assegnati alla Gaussiana k. Con questa interpretazione, il calcolo della media µk non è altro che una media pesata di tutti i punti xn del dataset, in cui i pesi sono dati dalle probabilità che il componente k abbia generato il punto xn , cioè le responsabilità γ(znk ). Similarmente possiamo massimizzare la log-likelihood azzerando la derivata rispetto a Σk : N 1 X Σk = γ(znk )(xn − µk )(xn − µk )T Nk n=1 Anche qui abbiamo la stessa forma di equazione del caso di singola Gaussiana adattata all’intero dataset, ma in cui ogni punto è opportunamente pesato dalla responsabilità che quel componente k si assume per quel punto. Infine massimizziamo la log-likelihood rispetto ai coefficienti di mix πk . In questo caso dobbiamo tener conto del vincolo per cui questi valori devo avere somma complessiva unitaria, quindi applichiamo un moltiplicatore Lagrangiano alla funzione obiettivo, che ci permette di rilassare il vincolo. La funzione da massimizzare risulterà quindi ln p(X|π, µ, Σ) + λ K X ! πk − 1 k=1 che porterà a N X G(xn |µk , Σk ) +λ=0 j πj G(xn |µj , Σj ) P n=1 1.2. GAUSSIAN MIXTURE MODEL 31 in cui appaiono ancora una voltà le responsabilità γ(znk ). Moltiplicando entrambi i lati dell’equazione per πk , sommando su k e sfruttando il vincolo di somma unitaria dei coefficienti di mix otteniamo λ = −N . Sfruttando questo risultato per eliminare λ, ricaviamo Nk πk = N quindi il coefficiente di mix per il generico componente k è dato dalla responsabilità media che quel componente si assume per la generazione di tutti i punti del dataset. A questo punto potrebbe sembrare di aver risolto il problema in modo molto simile a quanto fatto per il caso della singola Gaussiana. Questa impressione è presto smentita dal fatto che ognuno dei singoli risultati ottenuti finora ha una dipendenza dai valori γ(znk ), che però dipendono a loro volta dai parametri µk , Σk e πk . E’ chiaro quindi che non è possibile ottenere una soluzione in forma chiusa, ma bisognerà seguire la struttura iterativa che le dipendenze tra i parametri suggeriscono. Lo sviluppo di un algoritmo che calcoli iterativamente i valori dei parametri fino a convergenza risulterà portare ad una specializzazione per il misto di Gaussiane degli algoritmi EM. Abbiamo già visto tutti gli strumenti e le formule matematiche che ci serviranno durante l’algoritmo, quindi possiamo iniziare a vederne la struttura, che in realtà è molto semplice: si parte da valori iniziali arbitrari dei parametri e si alternano i due passi fondamentali dell’algoritmo (cioè il passo di expectation e il passo di maximization) fino a convergenza. Nel passo di expectation usiamo i valori correnti dei parametri per valutare le probabilità a posteriori (responsabilità) di ogni punto per ogni componente. Usiamo queste responsabilità nel passo di maximization per ricalcolare media, covarianza e coefficienti di mix. E’ dimostrabile che ogni iterazione expectation+maximization porta ad un aumento del valore di log-likelihood. In pratica, siamo certi che l’algoritmo convergerà, nel senso che la variazione della log-likelihood o dei parametri sarà inferiore ad una certa soglia e ci permetterà di terminare l’algoritmo. In figura 1.11 vediamo un’illustrazione grafica del funzionamento. Dalle figure appare chiaro che un algoritmo di questo tipo assomiglia molto ad un algoritmo di clustering. La ricerca di una stima accurata di una funzione di densità di probabilità attraverso il riconoscimento di K modi è infatti un problema che include il clustering. Il famoso algoritmo K-Means per il clustering non è altro che una versione semplificata di EM, in cui nel passo di expectation si decide il bacino di attrazione di ogni cluster in 32 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ Figura 1.11: In (a) vediamo il dataset con le scelte iniziali dei parametri, la dimensione dei cerchi ci suggerisce la varianza associata a quel componente. (b) mostra il risultato del primo passo di expectation: per ogni punto è stata calcolata la responsabilità di ogni componente ed è stato colorato con una quantità di colore proporzionale alla responsabilità di ogni componente. Nella figura (c) osserviamo il risultato del primo passo di maximization, in cui sono stati calcolati dei possibili valori dei parametri. I grafici (d), (e) ed (f) mostrano i risultati dopo rispettivamente 2, 5 e 20 iterazioni di EM. Nella figura (f) l’algoritmo è vicino alla convergenza. base al valore attuale del centroide, mentre nel passo di maximization si riposizionano i centroidi in base ai punti che fanno riferimento a quel cluster. La funzione obiettivo è la minimizzazione delle distanze tra i punti ed i rispettivi centroidi. K-Means è un algoritmo molto più semplice di un EM generico, ed in particolare anche degli EM specializzati per il misto di Gaussiane, perché è studiato per stimare molti meno parametri rispetto ai suoi parenti più complessi e di conseguenza è anche molto più veloce in termini sia di calcoli da effettuare per ogni iterazione, sia come numero di iterazioni per giungere a convergenza. Per questo generalmente si usa l’algoritmo K-Means per inizializzare i parametri di EM e permettere a quest’ultimo di partire da una soluzione di partenza migliore e di trovare 1.3. KERNEL DENSITY ESTIMATION (KDE) 33 un ottimo relativo finale di qualità migliore, oltre ad ottenere una convergenza quindi più rapida. 1.3 Kernel Density Estimation (KDE) Un approccio totalmente diverso è quello basato su un’analisi locale del vicinato di ogni punto. L’idea di fondo è la seguente: se vogliamo stimare la funzione di densità di probabilità in un dato punto x, questa funzione dipenderà verosimilmente dai punti vicini ad x e saranno questi punti a dover essere studiati per determinare il valore di p(x). Vedremo presto cosa questo significa. Un’altra peculiarità del metodo KDE è l’appartenenza alla cosidetta famiglia dei metodi non parametrici, cioè possiede la proprietà di essere poco influenzato dalla scelta dei parametri iniziali, problema che affligge pesantemente modelli come il misto di Gaussiane (basti pensare all’impossibilità di conoscere a priori il numero dei modi). Inoltre questo metodo si pone come obiettivo quello di superare la limitazione del misto di Gaussiane nel caso di distribuzioni uniformi, difficilmente approssimabili con precisione attraverso una distribuzione normale. 1.3.1 Il modello: struttura ed apprendimento L’intuizione che risiede alla base di questo modello è piuttosto semplice: se ipotizziamo che un’osservazione xn abbia molte altre osservazioni vicine ad essa, allora sarà molto probabile che il valore di densità di probabilità associato a quella zona sia piuttosto alto. Una prima stima della densità potrebbe essere la seguente: p(x) = mx N · Vx in cui mx è il numero di osservazioni contenute in un vicinato di volume Vx . Il vicinato può essere scelto di varie forme, ma generalmente è piuttosto semplice: cubico, sferico o ellisoidale. Questa formula si presta comunque a due differenti interpretazioni pratiche: • Possiamo tenere fisso il numero di vicini mx costante e cercare, per ogni x, il valore di Vx che contiene il numero corretto di vicini. Ovviamente più è piccolo il volume Vx , più alto sarà il valore di densità di probabilità. Questo approccio è chiamato nearest neighbours, per indicare la ricerca degli mx vicini più prossimi ad x. Una 34 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ tecnica piuttosto famosa che segue questo approccio è la Minimum Volume Ellipsoid (MVE), che fa uso di vicinati di forma ellittica: proprio questa peculiarità è un punto debole della tecnica, infatti l’imposizione di una forma ben precisa per i vicinati porta alla creazione di diversi artefatti all’interno della funzione di probabilità: questo è uno dei maggiori motivi per cui questa tecnica non ha mai avuto grande successo nelle applicazioni di computer vision. • L’altro approccio (che studieremo più in dettaglio) è detto kernel density in quanto il volume di ricerca dei vicini (il kernel, appunto) rimane lo stesso per ogni punto preso in esame e ci si limita a considerare i vicini contenuti in quel volume. Chiaramente, più punti sono presenti all’interno del volume, più alto sarà il valore di densità di probabilità associato ad x. I modelli di kernel density estimation sono largamente utilizzati in statistica (ad esempio in [16] e [20]), data mining e computer vision, in cui sono conosciuti anche sotto il nome di metodi della finestra di Parzen ([8] e [11]). Il caso più semplice con cui possiamo iniziare è quello monodimensionale. Date N osservazioni estratte da una distribuizione incognita p(x), cercheremo di stimare questa funzione utilizzando una funzione kernel K(u) e una banda h calcolando la media pesata dalla funzione kernel di tutte le osservazioni: N 1 X K pKDE (x) = N h n=1 x − xn h Ovviamente considerare tutte le N osservazioni ha poco senso pratico, quindi considereremo solo i kernel a supporto limitato, cioè quelle funzioni che ci permetteranno di considerare solo un piccolo sottoinsieme di N . Una funzione kernel dovrà soddisfare le seguenti proprietà: K(u) = 0 per |u| > 1 1 K(u) = 1 −1 K(u) = K(−u) > 0 K(u1 ) > K(u2 ) per |u1 | 6 |u2 | 1.3. KERNEL DENSITY ESTIMATION (KDE) 35 Altre proprietà della funzione kernel sono di interesse pratico irrilevante. Il fatto che il kernel sia una funzione pari ci permette semplificarne la definizione e decrivere un profilo k(u) tale che: K(u) = ck k(u2 ) e k(u) > 0 per 0 6 u 6 1 dove ck è una costante di normalizzazione dovuta alla necessità di K(u) di avere integrale unitario. Da notare che k(u) è una funzione monotona decrescente a causa della forma del kernel K(u). La funzione che deriva dalla somma di questi kernel è quindi una funzione continua estratta da una serie (discreta) di osservazioni. Possiamo vedere un’illustrazione grafica in figura 1.12. Figura 1.12: Nel grafico a sinistra possiamo vedere le varie osservazioni ed i correspondenti kernel utilizzati. A destra vediamo la funzione continua risultante dalla somma di tutti i kernel impiegati. Quindi per calcolare il valore della stima della funzione di probabilità per un certo punto x non bisognerà far altro che sommare i valori di tutti i kernel in quel punto. Ovviamente, considerato che la funzione kernel ha supporto limitato, solo una piccola parte degli N kernel sarà effettivamente utilizzata. Nel caso generale, ovvero quello di variabili multidimensionali, possiamo pensare ad una matrice di banda H definita positiva in modo da poter modellare il raggio di influenza 36 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ dei kernel indipendentemente nelle varie dimensioni. Possiamo scrivere la formula della stima di funzione di probabilità come: N 1 X KH (x − xn ) pKDE (x) = N n=1 dove la banda H definisce un kernel a simmetria radiale, cioè di forma ellittica e dimensioni date da: 1 1 KH (u) = |H|− 2 K(H − 2 u) dove |H| identifica il determinante della matrice H. Visto che i kernel devono rispettare la proprietà di simmetricità, possiamo usare, per semplificare i calcoli, un profilo k(u) tale che K(u) = ck k(uT u) In questo caso la funzione di probabilità stimata si può scrivere come N N X X ck ck T −1 p p pKDE (x) = k (x − xn ) H (x − xn ) = k d [x, xn , H]2 N · |H| n=1 N · |H| n=1 dove l’espressione d [x, xn , H] denota la distanza di Mahalanobis tra x e xn . Tuttavia è molto più comune il caso in cui i kernel hanno supporto circolare e di conseguenza la matrice H è proporzionale alla matrice identità (H = h2 I); in questo caso infatti le dimensioni dei kernel saranno controllate dal solo parametro h. Nonostante il kernel density estimator sia classificato come una tecnica non parametrica, i parametri che appaiono sulla formula della funzione di uscita appaiono piuttosto rilevanti. L’effettiva forma del kernel, data sia dalla funzione K(u) che lo definisce sia dalla sua “larghezza” h, è infatti l’unico elemento di variabilità possibile all’interno del metodo. Partendo dalla funzione K(u), sono stati definiti diversi kernel di uso comune, ognuno tendente a migliorare una specifica caratteristica della stima a leggero discapito di altre. Il kernel che minimizza una funzione di errore chiamata AMISE (errore asintotico integrato medio) è il cosiddetto kernel di Epanechnikov, caratterizzato dal profilo 37 1.3. KERNEL DENSITY ESTIMATION (KDE) kE (u) = 1 − u 06u61 0 u>1 Un altro kernel molto usato è la normale troncata: kG (u) = e−au 06u61 0 u>1 Nessuno di questi due kernel è però derivabile sui bordi u = 1. Questa proprietà è verificata (per le prime due derivate) dal kernel quadratico (biweight in inglese, chiamato in alcuni contesti anche triweight - cubico): kB (u) = (1 − u)3 06u61 0 u>1 E’ comunque sperimentalmente provato e condiviso che la scelta del kernel influisce solo marginalmente sull’effettiva qualità del risultato. Il parametro h ha molta più incidenza sulla funzione di uscita rispetto alla forma del kernel usato. Esso definisce l’ampiezza dei kernel ed è quindi responsabile del numero effettivo di punti che bisognerà considerare nel momento del calcolo di una stima, ma soprattutto ha una forte influenza sulla quantità di “smoothing” presente nella funzione finale. Possiamo vederne un chiarissimo esempio in figura 1.13. Appare quindi molto evidente l’importanza del parametro h nella generazione dell’output di questo metodo. In realtà il problema è molto meno grave di quanto può sembrare, infatti esistono molti metodi di facile applicabilità per stimare un buon valore di h. Uno di questi metodi si avvale del classico metodo di massimizzazione della likelihood per la funzione pKDE (x) in modo simile a quanto fatto per il caso del misto di Gaussiane: se osserviamo la formula della stima di probabilità fatta con il metodo di KDE ed usiamo un kernel Gaussiano è molto facile ricondursi al caso di misto di Gaussiane. Ovviamente è necessario fare le dovute distinzioni: le Gaussiane usate per il KDE devono essere troncate, il numero di Gaussiane che effettivamente si sommano non è minimamente confrontabile (sono molto limitate per il misto di Gaussiane tradizionale, N per il KDE) e due dei tre parametri che governano le funzioni Gaussiane per il caso del KDE sono già predefiniti (il 38 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ Figura 1.13: Applicazione di KDE allo stesso data set con tre valori di banda h diversi. In verde vediamo la distribuzione incognita da cui le osservazioni sono state generate ed in blu la stima ricavata usando KDE con parametro h indicato. coefficiente di mix πk è uguale per tutti i punti e la media è fissata sulla singola osservazione). L’unico parametro che bisognerà stimare è l’ampiezza h, riconducibile alla varianza σ 2 delle Gaussiane. Anche qui esistono diversi metodi per la determinazione del massimo della likelihood, tra cui un algoritmo iterativo proposto da Duin in [6] ed una specializzazione dell’algoritmo EM [14]. Altri metodi per la determinazione del valore ottimo di banda h si possono trovare in [18]. Considerata l’importanza fondamentale che ha l’uso di un valore di h corretto, è intuibile che usare la stessa banda per tutte le osservazioni può portare a una degenerazione della qualità dei risultati. Se infatti la densità di probabilità incognita ha contemporaneamente zone molto smussate e zone in cui la densità varia con alta frequenza, un parametro h unico per tutto il dataset che permetta di stimare con precisione tutte le zone della funzione di densità incognita non esiste. Per questo esistono tecniche di stima della densità chiamate dei punti campione; è dimostrabile che le proprietà statistiche di queste tecniche sono superiori a quelle del KDE classico. 1.4 Mean Shift L’idea alla base della tecnica di kernel density estimation è sicuramente molto buona, permette infatti un notevole miglioramento della qualità dell’output rispetto al caso del misto di Gaussiane e contemporaneamente è molto meno sensibile alla scelta dei parametri. Il 1.4. MEAN SHIFT 39 difetto principale della tecnica di KDE è però quello di non fornire una rappresentazione compatta dell’output: a differenza del misto di Gaussiane infatti, dove la funzione di uscita era una semplice somma di K componenti (con K N ), se vogliamo avere una rappresentazione completa della pdf di uscita nel KDE dobbiamo effettuare una somma di potenzialmente N elementi per ogni singolo punto del dominio, il che porta ad un costo computazionale decisamente consistente. Una limitazione del genere può essere inaccettabile in più di un campo applicativo ed è per questo motivo che molti ricercatori si sono concentrati sullo sviluppo di metodi che cercano di unire la precisione del KDE con la compattezza di rappresentazione del misto di Gaussiane: un risultato di queste ricerche sono i metodi di Mean Shift. Il Mean Shift non è però un’idea nuova: le prime proposte sono di oltre 20 anni fa, il primo paper rilevante è infatti [9] datato 1975, ma solo recentemente, a partire dal 1995, si è data nuova luce a questo metodo, proponendo nuove versioni più veloci, più precise e di applicabilità più ampia. Come detto, il metodo di Mean Shift sfrutta lo stesso principio del KDE, ma senza la necessità di calcolare il valore della funzione per tutti i punti del dominio: si effettua infatti un “hill climbing” nella direzione indicata dal gradiente, a sua volta calcolato attraverso la media dei valori delle osservazioni vicine, fino a convergenza. E’ dimostrabile che il metodo converge sempre su un massimo relativo, identificando un modo che sarà rappresentato attraverso una componente Gaussiana all’interno del modello finale. Vedremo comunque questa procedura nel dettaglio nei prossimi paragrafi. La descrizione di questo metodo e delle sue varianti sarà più dettagliata rispetto alle altre tecniche presentate finora essendo il Mean Shift l’oggetto delle sperimentazioni che affronteremo in seguito. 1.4.1 Struttura del modello A differenza del KDE, quindi, i metodi di Mean Shift non forniscono una stima completa della funzione incognita, ma sono un metodo per ricercare i modi di questa funzione. In molti campi questo è più che sufficiente, sopratutto se possiamo evitare il calcolo esplicito del valore della stima in ogni punto del dominio. Per i nostri scopi, però, la ricerca dei modi non soddisfa le nostre necessità di stima di funzioni incognite e dovremo quindi usare tecniche “laterali” per cercare di stimare non solo le coordinate dei modi, ma anche qualche altro descrittore che ci permetta di definirne la forma; per sfruttare qualcosa che abbiamo già visto possiamo pensare di stimare varianza e coefficiente di mix per ricondurci ad un 40 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ modello come il misto di Gaussiane. L’indubbio vantaggio del Mean Shift risiede nella bassa dipendenza dai parametri che i metodi di KDE (e di conseguenza di Mean Shift in quanto suo derivato) possiedono, superando la principale debolezza dei metodi parametrici come il Gaussian Mixture: basti pensare al comunissimo caso in cui non si possa conoscere a priori il numero dei modi: una tecnica di massimizzazione della likelihood attraverso un algoritmo EM per il misto di Gaussiane non è nemmeno applicabile, mentre una tecnica non parametrica può essere applicata con successo senza il minimo problema. Ovviamente il numero iniziale di modi non è, come abbiamo visto, l’unico parametro di un modello Gaussian Mixture infatti scelte infelici per i valori iniziali di medie, varianze e coefficienti di mix possono facilmente portare a risultati scadenti, effetto che viene eliminato alla base grazie alla bassa dipendenza dai parametri propria di KDE e MeanShift. Per il momento ci concentreremo però sulla ricerca dei modi anzichè sulle tecniche laterali per la stima di varianza e coefficienti di mix, che comunque esporremo brevemente in seguito. 1.4.2 Apprendimento del modello Riprendendo da dove avevamo lasciato il KDE, riscriviamo la formula che serve a calcolare la stima della pdf: N x − xn ck,d X k p̂h,K (x) = N · hd h n=1 in cui usiamo un kernel a supporto circolare, per cui possiamo sostituire la matrice H con l’uso di uno scalare h ed abbiamo cambiato il nome della stima da pKDE (x) a p̂(x) per non creare confusione dato che ci stiamo muovendo verso un metodo diverso da KDE. Partendo da questa formula, possiamo sfruttarne la linearità per ottenere facilmente una formula di stima del gradiente: 2 ! N X 2c x − x n k,d ˆ h,K (x) = ∇p̂h,K (x) = ∇p (x − xn ) k 0 d+2 N ·h h n=1 Per semplificare i successivi calcoli, introduciamo un cambio di funzione, assumendo la derivabilità, a meno di un numero finito di punti, di k nell’intervallo [0, +∞): s(x) = −k 0 (x) 41 1.4. MEAN SHIFT da cui possiamo definire un “nuovo kernel” S(x) usando s(x) come suo profilo: S(x) = cs,d s kxk2 dove, come prima, cs,d è una costante di normalizzazione. In alcuni contesti il kernel originale K(x) è chiamato ombra di S(x). Da notare che il kernel di Epanechnikov è l’ombra di un kernel uniforme (una sfera unitaria d-dimensionale) ed il kernel Gaussiano e la sua ombra hanno la stessa espressione, grazie alle proprieta di derivabilità della Gaussiana. Introducendo il nuovo kernel nell’espressione del gradiente otteniamo: ˆ h,K (x) = ∇p = 2ck,d N · hd+2 " 2ck,d N · hd+2 ! x − xn 2 (xn − x) s h n=1 N X N P x−xn 2 !# N h X n=1xn s x − xn 2 s − x P N h 2 n n=1 s x−x h n=1 P x−xn 2 > 0, condizione s in cui assumiamo di aver scelto un kernel tale per cui N n=1 h facilmente soddisfabile nella pratica. Osservando l’espressione ottenuta possiamo notare la distinzione tra tre fattori principali, ognuno dei quali assume un significato particolare. Il primo è di scarso interesse, in quanto è soltanto un coefficiente di normalizzazione. Il secondo è molto simile alla funzione di stima della densità fornita da KDE (a parte l’uso del kernel s(x) anzichè k(x), che sappiamo essere uno la derivata dell’altro). La terza parte è definita Mean Shift ed è data dalla differenza tra la media pesata delle osservazioni, in cui il peso è dato dal kernel s(x), e l’attuale centro del kernel, cioè il punto x. Possiamo quindi riscrivere la stima del gradiente come: ˆ h,K (x) = ∇p dove 2ck,d p̂h,S (x)mh,S (x) N · hd+2 ! N x − xn 2 cs,d X p̂h,S (x) = s h N · hd n=1 42 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ e N P mh,G (x) = 2 n xn s x−x h n=1 N P −x x−xn 2 s n=1 h Ribaltando i termini, possiamo estrarre il cosiddetto vettore di Mean Shift a partire dalla stima della densità e dal suo gradiente: ˆ h,K (x) 1 ∇p mh,G (x) = h2 c 2 p̂h,S (x) da cui possiamo trarre un paio di considerazioni. La prima è che il vettore di Mean Shift è un vettore proporzionale al gradiente della stima della funzione di densità di probabilità calcolata con il kernel k(x). La seconda è che la normalizzazione è effettuata tramite la stima della pdf calcolata con il kernel s(x). La relazione espressa da questa formula è intuitiva: il vettore di Mean Shift rappresenta uno spostamento verso la zona più densamente popolata; spostamento che diverrà via via minore all’avvicinarsi di un massimo della stima della funzione. La normalizzazione consente di effettuare grandi spostamenti dove la densità delle osservazioni è bassa e spostamenti più piccoli dove c’è alta frequenza di osservazioni, permettendo un’analisi più raffinata. Il funzionamento di un algoritmo basato sul Mean Shift sarà quindi fondato sull’iterazione di due passi fondamentali: • computazione del vettore di Mean Shift mh,G (x) • traslazione del kernel S(x) della quantità e direzione indicate da mh,G (x) Il Mean Shift è quindi definibile come tecnica di risalita del gradiente ed ha la garanzia di convergenza verso un massimo locale. Convergenza e scelta del kernel E’ interessante, ai fini della comprensione del metodo, studiare la modalità di convergenza dello stesso per meglio individuare i vantaggi e le debolezze che il Mean Shift possiede. Abbiamo detto che una procedura per la ricerca di un modo che utilizzi il Mean Shift utilizza una serie di iterazioni che portano a costruire una serie di “salti”; ognuno di questi 43 1.4. MEAN SHIFT Figura 1.14: La figura a sinistra mostra un semplificato processo di costruzione del gradiente in una procedura di Mean Shift: tutti i punti la cui banda comprende il punto su cui stiamo stimando il gradiente verranno considerati nel processo di calcolo dello stesso. Nel caso in cui il valore di banda sia uguale per tutti i punti, ci possiamo ricondurre al caso a destra, in cui possiamo notare che il punto blu sarà attratto maggiormente verso la zona di alta densità. Da non dimenticare che questa semplificazione non è possibile nel caso in cui la banda sia diversa per ogni punto: quello che si valuta per decidere se il punto è da prendere in considerazione o meno è sempre la banda dei “punti rossi”. movimenti è diretto dal Mean Shift Vector e consente di costruire, riprendendo la formula del vettore, una sequenza {yi }i=1,2,... di locazioni successive toccate da una traiettoria: N P yi+1 = x−xn 2 xn s h n=1 N P i = 1, 2, ... 2 s x−xn n=1 h Nella formula si considera x come il punto di partenza dello spostamento, identificabile in questa notazione come yi . Ovviamente il punto y1 è una osservazione ed il punto di partenza della specifica traiettoria. Da notare che lo spostamento è calcolato con il kernel S, mentre possiamo similmente calcolare la sequenza dei valori di stima della pdf {p̂h,K (yi )}i=1,2,... usando però il metodo del kernel density estimation e quindi il kernel K. E’ dimostrabile che se il kernel K ha un profilo convesso e monotono decrescente, le sequenze {yi }i=1,2,... e {p̂h,K (yi )}i=1,2,... convergono e la sequenza {p̂h,K (yi )}i=1,2,... è monotona crescente. La dimostrazione passa attraverso la considerazione che, essendo il numero N di punti considerati finito, è sufficiente dimostrare che {p̂h,K (yi )}i=1,2,... è stret- 44 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ tamente monotona crescente cioè che {p̂h,K (yi )} < {p̂h,K (yi+1 )}. Intuitivamente, essendo lo spostamento da yi a yi+1 effettuato seguendo le zone con maggiore densità di punti, questa proprietà sarà sicuramente soddisfatta. Vedere [4] per la completa dimostrazione di questo teorema. Per un esempio di kernel che non garantisce la convergenza vedere il riferimento bibligrafico numero [5], pagina 16. Altre tecniche di risalita del gradiente verificano la proprietà di convergenza, ma solo per salti infinitesimali. Il vantaggio del Mean Shift è infatti proprio adattare la dimensione dei salti in relazione al numero di punti del vicinato: una strategia di salti che non tenesse conto di questo fattore rischierebbe di divergere nel caso in cui la dimensione dei salti fosse scelta troppo grande e convergere in modo molto lento in caso di dimensione troppo piccola; inoltre si evita il passo di pre-processing in cui si determina la dimensione ottima dei salti. Abbiamo detto in precedenza per il KDE che la scelta del kernel non influisce di molto sul risultato finale: questo accade anche per il Mean Shift (sempre all’interno della scelta di kernel dal profilo convesso decrescente), ma è comunque interessante considerare le piccole differenze tra la scelta di un kernel e l’altro. In generale il tipo di kernel scelto influisce sul numero di passi che l’algoritmo dovrà fare per raggiungere il massimo relativo della pdf stimata. Se il kernel S usato è quello uniforme, la convergenza è garantita in un numero finito di passi perché il numero di locazioni che generano valori di media distinti è finito. In caso di kernel che prevedano un peso diverso in base alla distanza dal centro, invece, la procedura diventa asintoticamente convergente perché i passi tendono a rimpicciolirsi sempre di più all’avvicinarsi del massimo. Quello che si fa in pratica in questi casi per terminare le iterazioni è inserire una soglia minima per la dimensione del salto, sotto la quale si considera conclusa la traiettoria. Una menzione particolare la merita il kernel Gaussiano, infatti, in caso di impiego di questo kernel, le traiettorie formate dalle varie iterazione del Mean Shift avranno la proprietà di essere “morbide”, cioè non avranno il profilo tortuoso tipico di altre tecniche di risalita del gradiente (più famosa delle quali la standard steepest ascent method, in cui, nel caso di “crinali” molto stretti, le traiettorie tendono ad avere un andamento zig-zagante, rallentando la convergenza verso il massimo); è infatti dimostrabile che due successivi vettori di una traiettoria del metodo di Mean Shift non avranno mai tra loro un angolo minore di 90°, garanzia che le traiettorie saranno piuttosto smussate, apparenza teorica di una convergenza più veloce. In realtà il kernel Gaussiano soffre del difetto accennato prima riguardo alla convergenza asintotica, quindi 1.4. MEAN SHIFT 45 generalmente si preferisce, per questioni di velocità, usare un kernel uniforme per cui la caratteristica di traiettorie morbide non è dimostrabile analiticamente, ma è riscontrata in pratica nella grande maggioranza dei casi. Per quanto riguarda invece la qualità dei modi rilevati, possiamo affermare con certezza matematica che la procedura converge in punti stazionari, cioè in cui la stima del gradiente è nulla. Inoltre, considerato che la sequenza {p̂h,K (yi )}i=1,2,... è crescente, possiamo applicare il teorema della cattura ([1], pag. 45), il quale afferma che le traiettorie di un metodo di risalita del gradiente che soddisfi questa proprietà sono attratti da massimi locali se questi ultimi sono punti stazionari unici (all’interno di un certo vicinato). In altre parole, una volta che yi è sufficientemente vicino ad un un modo della funzione stimata, la convergenza verso quel modo è assicurata. Ora non resta che domandarci se quel modo, un massimo locale all’interno di una piccola sfera, è rilevante all’interno della stima complessiva o è solo un valore “sporco” causato dal rumore. Per affrontare questo interrogativo, dobbiamo partire dalla fase di costruzione della stima che stiamo effettuando. Esistono due situazioni che possono dare luogo a massimi relativi della stima della pdf: il primo, e meno preoccupante, è dovuto alla soglia minima imposta sul modulo del gradiente per evitare la convergenza asintotica. Interrompere la traiettoria quando si è “ragionevolmente vicini” al vero valore del massimo crea una serie di modi rilevati nell’intorno del vero massimo relativo. Ovviamente tutti questi modi “sporchi” si riferiscono allo stesso modo reale e andranno quindi riuniti attraverso una ricerca nell’intorno di uno di questi modi. Il secondo fattore è invece più complesso ed ha le sue basi molto più in profondità. E’ ovvio che ogni tecnica basata sull’uso di campioni soffre delle imprecisioni dovute al rumore. Questo rumore può facimente causare massimi locali poco rilevanti come indicato in figura 1.15-a in rosso. Le tecniche che sfruttano una somma di kernel per estrarre una stima della pdf reale hanno l’ulteriore svantaggio (mostrato in figura 1.15-b) di generare piccoli “falsi picchi” in corrispondenza di ogni kernel, creando il rischio che la procedura di Mean Shift venga intrappolata in uno di questi massimi spuri, falsando di fatto la stima dei modi. Il rischio di rimanere “intrappolati” è dovuto alla limitatezza del kernel usato per ricercare i vicini su cui calcolare la stima del gradiente. Con kernel più grandi, infatti, aumenta la larghezza di “banda di ricerca” e quindi diminuisce la possibilità di bloccarsi su massimi poco rilevanti. D’altra parte, però, l’aumento della larghezza di banda rischia di compromettere la qualità della stima, non catturando possibili elementi a varianza bassa. Il tutto 46 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ Figura 1.15: Possibilità di falsi massimi all’interno di tecniche basate sulla stima di campioni (a) e con uso di kernel locali (b) si riconduce quindi ad una scelta ottimale del parametro h, che, nel caso semplificato ma molto comune di uso di una matrice di covarianza radiale H = h2 I, controlla la varianza dei kernel e quindi la larghezza di banda. La scelta di h risulta quindi di fondamentale importanza per la buona riuscita di una stima di pdf. Fortunatamente, pur essendo h un parametro molto importante, la sensibilità del metodo rispetto a tale parametro è piuttosto relativa se confrontata con altri parametri di altri metodi; esistono comunque una serie di tecniche differenti per la scelta della banda ottimale, tra cui anche delle versioni dell’algoritmo che risolvono il problema utilizzando una banda variabile. Andando con ordine, molto interessante è il lavoro presentato nel paper [21], in cui è dimostrata una dipendenza diretta tra il valore di h e la rilevazione di falsi massimi ed inoltre viene proposto un algoritmo iterativo apposito per la determinazione del valore di banda che minimizza il numero di falsi picchi ottenuti. Purtroppo questo algoritmo ripete ad ogni iterazione l’intera procedura di Mean Shift e può quindi risultare in un carico computazionale significativo. Altre tecniche prevedono la massimizzazione di varie misure di bontà dei cluster rilevati, come la varianza inter-cluster e intra-cluster oppure l’isolamento dei cluster rilevati. Per quanto riguarda i metodi a banda variabile, di cui è stata implementata una versione adatta al trattamento di dati ad alte dimensioni, la procedura principale non subisce grosse variazioni. L’unica differenza significativa è che i valori di banda h sono definiti per ogni 1.4. MEAN SHIFT 47 osservazione n in relazione al valore di densità della zona in cui l’osservazione risiede: parleremo quindi di bande hn . Ovviamente però i valori di densità non sono noti a priori ed è necessario quindi un passo di stima preventiva per poter assegnare valori corretti alle varie bande hn . Esistono diversi metodi per stimare una pdf di primo tentativo, oppure si può ricorrere più semplicemente alla ricerca del vicinato (un’osservazione con molti vicini sarà in una zona ad alta densità ed avrà quindi una banda piuttosto piccola, mentre un’osservazione con pochi vicini sarà in una zona a bassa densità e quindi un valore di banda ampio). Conseguenza inevitabile dall’uso della banda variabile è che ogni punto preso in considerazione per la stima del gradiente sarà pesato usando come peso l’inverso del suo valore di banda: osservazioni in zone molto sparse avranno una banda ampia ed un peso limitato, mentre osservazioni in zone densamente popolate avranno un valore di banda ridotto e quindi un peso alto, contribuendo maggiormente nel processo di costruzione della stima del gradiente. 48 CAPITOLO 1. STIMA DI FUNZIONI DI DENSITÀ DI PROBABILITÀ Capitolo 2 Dati Sequenziali e Modelli Grafici Finora abbiamo parlato di dati estratti in modo indipendente a partire dalla stessa distribuzione (dati i.i.d. - independent and identically distributed). Questa assunzione ci ha permesso di semplificare diverse cose, come ad esempio la scrittura della funzione di likelihood come un semplice prodotto delle probabilità di tutti i punti del dataset. Purtroppo però per molti casi reali questa semplificazione risulterebbe in un impoverimento eccessivo del modello e non sarebbe quindi applicabile. La particolare classe di dati di cui ci occuperemo sono detti dati sequenziali, cioè dati che provengono principalmente da serie temporali, cioè sequenze di eventi che avvengono in successione. La successione non deve però necessariamente suggerire un’idea di tempo, se infatti i primi esempi che vengono in mente possono essere quelli della quantità giornaliera di pioggia o di una sequenza di frame in un video, il modello dei dati sequenziali è applicabile anche a sequenze di nucleotidi del DNA o a successioni di caratteri all’interno di una frase. Quindi, anche se spesso si usano termini come “osservazione passata” e “osservazione futura”, tutto ciò che vedremo in seguito è applicabile anche a dati sequenziali non strettamente legati ad un concetto di tempo. Per iniziare è utile fare una prima distinzione all’interno delle distribuzioni sequenziali: esistono infatti le distribuzioni stazionarie, in cui i dati evolvono nel tempo ma la distribuzione da cui sono generati rimane la stessa; e le più complesse distribuzioni non-stazionarie, in cui la distribuzione generatrice evolve nel tempo. 49 50 2.1 CAPITOLO 2. DATI SEQUENZIALI E MODELLI GRAFICI Struttura del modello Per molti campi applicativi, come ad esempio le previsioni dei mercati finanziari, vorremmo essere capaci di predire il prossimo valore di una serie temporale, data la conoscenza dei valori precedenti. Intuitivamente ci aspettiamo che le osservazioni più recenti giochino un ruolo più importante rispetto ad osservazioni molto datate. Inoltre è facile intuire che considerare tutte le osservazioni precedenti all’interno del processo di predizione dei valori futuri implica la creazione di un modello di complessità che cresce al crescere del numero di osservazioni, proprietà decisamente non desiderabile. In generale ci si limita quindi a considerare la previsione del valore futuro indipendente da tutte le altre osservazioni tranne le più recenti: questo approccio è quello che caratterizza i Modelli di Markov. Purtroppo questo tipo di modello è piuttosto limitato: si è cercato quindi di espanderlo introducendo, come abbiamo visto per il Misto di Gaussiane, delle variabili latenti che catturino un concetto di stato e portino quindi a costruire un modello che faccia uso del cosidetto spazio degli stati. Il modello che andremo a studiare è chiamato Hidden Markov Model e appartiene alla famiglia di modelli probabilistici detti modelli grafici. 2.1.1 Markov Model Il modo più banale in cui si può trattare un insieme di dati sequenziali è semplicemente ignorare le correlazioni tra i dati e trattarli come se fossero dati di tipo i.i.d.: possiamo vederne uno schema in figura 2.1. Un approccio del genere, però, fallirà nell’evidenziare i pattern all’interno dei dati, come ad esempio correlazioni tra osservazioni successive. Figura 2.1: Il modo più semplice di trattare un dataset è considerare tutte le osservazioni indipendenti, il che risulta in un grafo senza collegamenti. Supponiamo, ad esempio, di osservare l’andamento della pioggia durante un certo periodo di tempo. Se usiamo una variabile binaria che indichi se un particolare giorno è stato piovoso e volessimo predirre se un giorno futuro pioverà o no, usando l’approccio che prevede indipendenza tra i dati, l’unica informazione che potremmo ricavare è la frequenza relativa dei giorni di pioggia. Ma è chiaro che le osservazioni sulle piovosità di ieri e di oggi dovrebbero avere più influenza sulla previsione per domani. 51 2.1. STRUTTURA DEL MODELLO Per esprimere questo tipo di relazioni dobbiamo abbandonare l’assunzione di indipendenza ed il modo più semplice di farlo è considerare un Modello di Markov. Per prima cosa notiamo che possiamo usare la regola del prodotto per eprimere la distribuzione congiunta di probabilità di una sequenza di osservazioni: p(x1 , ..., xN ) = N Y p(xn |x1 , ..., xn−1 ) n=1 Se assumiamo che ogni distribuzione condizionale sulla parte destra dell’equazione sia indipendente da tutte le osservazioni precedenti eccetto la più recente, otteniamo una catena di Markov di primo ordine, che possiamo riprodurre graficamente come il modello disegnato in figura 2.2. Figura 2.2: Catena di Markov del primo ordine In modo più formale, stiamo assumendo che p(xn |x1 , ..., xn−1 ) = p(xn |xn−1 ) La distribuzione congiunta per una sequenza di N osservazioni rispetto a questo modello è data da N Y p(x1 , ..., xN ) = p(x1 ) p(xn |xn−1 ) n=2 In molte applicazioni le distribuzioni condizionali p(xn |xn−1 ) che definiscono il modello sono vincolate ad essere sempre uguali, il che corrisponde ad assumere di utilizzare una serie temporale di tipo stazionario. Per esempio, se la distribuzione condizionale dipende da alcuni parametri, allora tutte le distribuzioni usate nella catena dovranno condividere gli stessi valori per i parametri. Questo modello è noto come catena di Markov omogenea. Seppur questo sia senza dubbio un modello più generale rispetto a quello con ipotesi di indipendenza, rimane piuttosto restrittivo. Potrebbe infatti, per molte applicazioni reali, tenere in considerazione, ai fini della predizione del valore futuro, non solo l’ultimo valore osservato ma anche osservazioni più datate. Possiamo muoverci in questa direzione pensando a catene di Markov di ordine maggiore. Se per esempio consideriamo non solo 52 CAPITOLO 2. DATI SEQUENZIALI E MODELLI GRAFICI l’ultimo valore, ma anche il penultimo otteniamo le catene di Markov di secondo ordine, rappresentate dal grafico in figura 2.3. Figura 2.3: Catena di Markov del secondo ordine. Formalmente, la distribuzione congiunta è data da p(x1 , ..., xN ) = p(x1 )p(x2 |x1 ) N Y p(xn |xn−1 , xn−2 ) n=3 Ogni osservazione è ora influenzata dalle due precedenti osservazioni. Possiamo pensare di estendere questo modello e considerare catene di Markov di M -esimo ordine in cui la distribuzione condizionale di una particolare variabile dipenda dalle M osservazioni precedenti. Purtroppo l’aumento di flessibilità implica un costo da pagare in termini di numero di parametri del modello. Per renderci conto di questo effetto, supponiamo di osservare variabili discrete che possono assumere K stati. In questo caso la distribuzione condizionale p(xn |xn−1 ) in una catena di Markov del primo ordine sarebbe specificata da un insieme di K − 1 parametri per ognuno dei K stati di xn−1 , per un totale di K(K − 1) parametri. Supponiamo ora di estendere il modello ad una catena di Markov di M -esimo ordine, in modo che la distribuzione congiunta sia generata a partire da distribuzioni condizionali del tipo p(xn |xn−M , ..., xn−1 ). Se, come prima, le variabili sono discrete e caratterizzate da K stati possibili, allora il numero di parametri di un modello del genere sarà K M −1 (K − 1), che è esponenziale in M e quindi inutilizzabile per valori di M significativamente grandi. Abbiamo quindi bisogno di un modello per manipolare dati sequenziali che non sia limitato da un punto di vista del numero di osservazioni passate che si tengono in considerazione e che abbia allo stesso tempo un numero limitato di parametri liberi. Possiamo pensare di raggiungere questo risultato con l’introduzione di variabili latenti, che permetteranno di costruire una classe di modelli flessibili attraverso la combinazione di semplici componenti. Supponiamo di introdurre una variabile latente zn per ogni osservazione xn . Da notare che le variabili latenti possono avere tipo e dimensionalità diversi dalle osservazioni, poichè rappresentano lo stato dell’ambiente in cui l’osservazione xn è stata rilevata. 53 2.1. STRUTTURA DEL MODELLO Se assumiamo che queste variabili latenti siano collegate da una catena di Markov, possiamo catturare la relazione tra diverse osservazioni senza esplicitare la dipendenza direttamente sulle osservazioni: questo tipo di struttura si chiama modello a spazio degli stati e ne possiamo vedere una rappresentazione grafica in figura 2.4. Figura 2.4: Modello a spazio degli stati. Il modello rappresentato in figura è utilizzabile sia per i modelli di Markov nascosti che per i modelli lineari dinamici. Questo modello soddisfa una proprietà importante, cioè l’indipendenza tra due stati non successivi, dati gli stati intermedi. In pratica, dato lo stato zn , gli stati zn−1 e zn+1 sono indipendenti tra loro: questo limita le dipendenze esplicite tra diverse variabili e quindi diminuisce il numero di parametri liberi del modello senza però limitarne la flessibilità, infatti le variabili latenti sono in grado di catturare al loro interno tutta la dinamicità di un sistema. La probabilità congiunta per questo modello è data da " p(x1 , ..., xN , z1 , ..., zN ) = p(z1 ) N Y n=2 # p(zn |zn−1 ) N Y p(xn |zn ) n=1 Si può notare che c’è sempre un percorso che collega due osservazioni xn e xm attraverso le variabili latenti, il che significa che la distribuzione predittiva p(xn+1 |x1 , ..., xn ) per l’osservazione xn+1 , date le precedenti n osservazioni, non mostra alcuna indipendenza e quindi la predizione dipenderà da tutti i valori precedenti. Esistono diversi modelli che seguono il grafico mostrato in figura per trattare dati sequenziali: noi ci occuperemo solo del più importante ai fini della comprensione del sistema implementato: i modelli nascosti di Markov (meglio conosciuti come Hidden Markov Models, comunemente abbreviato con l’acronimo HMM). In questo particolare tipo di modello le variabili latenti devono necessariamente essere discrete, mentre non c’è limitazione riguardo alla natura del fenomeno osservato, che può essere sia discreto che continuo. 54 CAPITOLO 2. DATI SEQUENZIALI E MODELLI GRAFICI 2.1.2 Hidden Markov Model I modelli nascosti di Markov possono essere visti come una specifica istanza del modello a spazio degli stati illustrato in figura 2.4 in cui le variabili latenti sono assunte tutte discrete. Se però esaminiamo il sistema in un preciso istante, notiamo che è molto simile al modello di misto di Gaussiane che abbiamo visto nella prima parte di questa tesi: le variabili latenti zn descrivono quale componente (o quale stato) del misto è responsabile per la generazione della corrispondente osservazione xn . Anche in questo caso le variabili latenti zn hanno una rappresentazione di tipo 1-su-K, però ora la distribuzione di probabilità di zn dipende dallo stato della precedente variabile latente zn−1 attraverso una distribuzione condizionale p(zn |zn−1 ). Considerato che le variabili latenti sono variabili binarie K-dimensionali, questa distribuzione condizionale può essere espressa attraverso una matrice, che indicheremo con A, di elementi conosciuti come probabilità di transizione. La matrice A prende quindi il nome di matrice di transizione ed i suoi elementi sono dati da Aj,k = p(zn,k = 1|zn−1,j ) P e siccome sono probabilità, soddisferanno le proprietà 0 6 Aj,k 6 1 e k Aj,k = 1. La matrice avrà quindi K(K − 1) parametri indipendenti. Possiamo scrivere la distribuzione condizionale in modo esplicito nella forma: p(zn |zn−1 , A) = K K Y Y z n−1,j Aj,k zn,k k=1 j=1 Il nodo latente iniziale z1 è speciale in quanto non possiede un nodo padre e quindi la distribuzione marginale p(z1 ) è rappresentata da un vettore di probabilità π i cui elementi rappresentano la probabilità che il sistema si trovi inizialmente nello stato k, cioè πk = p(z1,k = 1) e quindi K Y z p(z1 |π) = πk1,k k=1 P dove k πk = 1. Per avere un’idea più precisa del ruolo della matrice di transizione A si può darne una rappresentazione grafica. Esistono diversi tipi di grafici per questo tipo di situazione. Il primo è quello che vediamo in figura 2.5. Da notare che i quadrati rappresentano stati diversi della stessa variabile invece che diverse variabili come accadeva negli altri diagrammi con i nodi di forma circolare. Se applichiamo questo diagramma al caso degli hidden Markov models, otteniamo un 2.1. STRUTTURA DEL MODELLO 55 Figura 2.5: Diagramma di transizioni in cui le variabili latenti hanno 3 stati corrispondenti ai 3 quadrati. La frecce nere rappresentano gli elementi della matrice di transizione A grafico come quello in figura 2.6. Questo tipo di grafico è chiamato diagramma a reticolo. Figura 2.6: Se espandiamo il diagramma in figura 2.5 otteniamo un diagramma a reticolo in cui ogni colonna corrisponde ad una delle variabili latenti zn . Per terminare la specifica del modello probabilistico, dobbiamo definire le distribuzioni condizionali delle variabili osservate p(xn |zn , φ), dove φ è un insieme di parametri che governano la distribuzione. Queste probabilità sono conosciute come probabilità di uscita (o probabilità di emissione) e possono, ad esempio, essere date da misti di Gaussiane nella forma già vista se le gli elementi di x sono variabili continue. Siccome xn è un valore osservato, la distribuzione p(xn |zn , φ) consisterà, per un dato valore di φ, in un vettore di K numeri corrispondenti ai K possibili stati del vettore binario zn . Possiamo rappresentare 56 CAPITOLO 2. DATI SEQUENZIALI E MODELLI GRAFICI le probabilità di uscita nella forma p(xn |zn , φ) = K Y p(xn |φk )zn,k k=1 che non è altro che il caso generale di quanto visto per il misto di Gaussiane. Per ora focalizzeremo la nostra attenzione sul caso di modelli omogenei, cioè in cui le distribuzioni condizionali che governano le variabili latenti condividono tutte la stessa matrice di transizione A e similmente tutte le funzioni di uscita hanno gli stessi parametri φ; estendere poi questi risultati al caso generale sarà un compito piuttosto semplice. Semplificando ulteriormente ritroveremmo l’ipotesi di indipendenza dei dati: se infatti i valori della matrice A sono tutti uguali, le variabili zn−1 e zn possono essere considerate indipendenti. Graficamente sarebbe come eliminare i link orizzontali nella figura 2.4. La distribuzione di probabilità congiunta di variabili latenti ed osservate è quindi data da " p(X, Z|θ) = p(z1 |π) N Y n=2 # p(zn |zn−1 , A) N Y p(xm |zm , φ) m=1 dove X è l’insieme delle osservazioni {x1 , ..., xN }, similmente Z è l’insieme delle variabili latenti {z1 , ..., zN } e θ è l’insieme dei parametri che governano il modello {A, φ, π}. Questa formulazione è piuttosto generica: infatti le discussioni che seguiranno sono applicabili per un’ampia gamma di distribuzioni probabilistiche tra cui Gaussiane, misti di Gaussiane e modelli a kernel locale come KDE. Per comprendere meglio il funzionamento del modello, possiamo considerarlo da un punto di vista di generazione di dati: anzichè partire dalle osservazioni per stimare il modello, partiremo dal modello per generare le osservazioni. Iniziamo dal modello del misto di Gaussiane. In quel caso, se volessimo generare dei dati a partire dalla distribuzione, dovremmo per prima cosa scegliere in modo casuale il componente responsabile della generazione del punto, basandosi sui coefficienti di mix πk e successivamente generare un vettore x dalla corrispondente componente k. Ripeteremo il processo N volte per ottenere un dataset di N osservazioni indipendenti. Questa procedura va leggermente modificata nel caso di osservazioni non indipendenti e quindi in caso di uso di un modello diverso dal misto di Gaussiane. Sceglieremo per prima cosa il valore della variabile latente iniziale z1 in base alle probabilità di stato iniziale πk e genereremo di conseguenza il primo 2.1. STRUTTURA DEL MODELLO 57 campione x1 . Supponiamo che per z1 sia stato scelto un valore corrispondente allo stato j. Per decidere il valore di z2 dovremo basarci sulle probabilità definite dalla matrice A in corrispondenza della riga j come stato di partenza. Una volta scelto z2 , genereremo l’osservazione x2 in base alla distribuzione corrispondente a quello stato e potremo procedere scegliendo z3 e così via. Ovviamente le transizioni da uno stato ad un altro dipendono dalla matrice di transizione A, quindi se per esempio la matrice ha gli elementi sulla diagonale principale molto più grandi di quelli fuori dalla diagonale principale, il sistema tenderà a rimanere nello stesso stato molto a lungo e “saltare” ad un altro stato con bassa probabilità. Le varianti del metodo base degli Hidden Markov Model sono diverse, per esempio si possono porre vincoli alla forma della matrice A. Un caso degno di nota è quello chiamato comunemente modello left-to-right, in cui gli elementi Aj,k della matrice A sono forzati a zero se k < j. Questo significa che la transizione degli stati può solo “andare avanti” e non ritornare su stati già visitati in precedenza. Possiamo vedere una rappresentazione grafica in figura 2.7. Figura 2.7: Esempio di diagramma di transizione degli stati per un hidden Markov model left-to-right a 3 stati. Una volta che uno stato viene abbandonato, non è possibile tornarci. Tipicamente per questo tipo di modelli le probabilità per lo stato iniziale sono modificate in modo che lo stato iniziale sia sempre j = 1. Un altro vincolo che spesso si usa è quello del limitare i grandi salti all’interno dello spazio degli stati, in altre parole si vincola Aj,k = 0 per tutti i k tali che k > j + ∆. Questo tipo di modello è illustrato in figura 2.8. Tutti questi vincoli potrebbero sembrare una grossa limitazione, ma in realtà questi sistemi sono usatissimi in molti ambiti applicativi, come ad esempio il riconoscimento vocale o della scrittura. Per comprendere meglio i vantaggi indubbi di un sistema di questo tipo, vediamo ancora un modello generativo. Uno dei più grandi vantaggi dei sistemi basati sugli hidden Markov model è l’abilità di essere piuttosto resistenti a variazioni sull’asse temporale, cioè rallentamenti o accelerazioni dell’evento osservato. Prendiamo come esempio, come fatto altre volte, un caso presentato in [2]. L’esempio riguarda il riconosci- 58 CAPITOLO 2. DATI SEQUENZIALI E MODELLI GRAFICI Figura 2.8: Diagramma a reticolo per un hidden Markov model left-to-right a 3 stati in cui l’incremento massimo dell’indice di stato k è vincolato ad 1. mento di caratteri per la scrittura manuale. La cifra “2” è comunemente disegnata come due sezioni distinte unite da una cuspide: la prima parte inizia solitamente nella parte in alto a sinistra e ha un arco curvo fino ad una cuspide (o un piccolo anello) in basso a sinistra ed è seguita dalla seconda parte che è un tratto generalmente rettilineo verso la parte in basso a destra della sezione. Possiamo vedere diversi modi di scrivere un “due” in figura 2.9 in alto. Variazioni della calligrafia di persone diverse portano le varie sezioni ad avere dimensioni diverse e quindi la locazione della cuspide (o dell’anello) all’interno della sequenza temporale di scrittura della cifra può variare. Un modello a spazio degli stati come un HMM è perfettamente resistente a variazioni di questo tipo, perchè si traducono semplicemente in variazioni più veloci o più lente dello stato delle variabili latenti. Purtroppo è anche facile notare un punto debole del sistema: nel caso in cui la cifra fosse scritta “al contrario”, cioè partendo dalla parte in basso a destra e risalendo verso la cuspide e poi in alto a sinistra, il sistema avrebbe una scarsissima probabilità di riconoscere la cifra, anche se il movimento della penna fosse perfettamente sovrapposto ad un esempio presente nel training set. Sarebbe quindi il caso di considerare anche modelli non strettamente left-toright per applicazioni di riconoscimento di caratteri. Fortunatamente nel riconoscimento vocale questo tipo di situazioni non accadono e i modelli nascosti di Markov risultano molto utili, essendo poco disturbati da variazioni di velocità nella voce da riconoscere. Il nostro modello, comunque, non è di tipo left-to-right perché il riconoscimento di attività umane non permette questo tipo di vincoli. 2.2. APPRENDIMENTO DEL MODELLO 59 Figura 2.9: Linea superiore: esempi di cifre manoscritte. Linea inferiore: risultato della generazione di cifre da parte di un hidden Markov model left-to-right il cui apprendimento è stato fatto su un insieme di 45 cifre manoscritte. 2.2 Apprendimento del modello Abbiamo illustrato finora le caratteristiche del modello. Riassumendo i parametri necessari alla sua definizione, possiamo individuare una tripla di valori {A, φ, π}. Per farci un’idea di quello che dovremo esplicitare come input per il nostro modello, cerchiamo di identificare la dimensionalità dei parametri in gioco. Abbiamo già parlato a lungo di A, la matrice di transizione degli stati, che sarà una matrice K × K, dove K è il numero degli stati assumibili dal sistema e quindi la dimensionalità delle variabili latenti z. Il vettore K-dimensionale π rappresenta le probabilità iniziali per ognuno dei K possibili stati. Il discorso per φ è più complesso, infatti questo parametro dipende strettamente dal tipo di distribuzione di uscita scelta, in quanto ne controllerà la forma. Indicativamente come esempio possiamo pensare di usare il misto di Gaussiane: in questo caso dovremo avere una distribuzione per ognuno dei K stati ed ognuna di queste distribuzioni dovrà avere i parametri standard per il misto di Gaussiane, cioè coefficiente di mix (scalare), media (vettore D-dimensionale) e covarianza (matrice D × D) per ognuna delle M componenti del misto, per un totale di K ·M ·(1+D+D) parametri, nel caso in cui la matrice di covarianza sia limitata ad una matrice diagonale, caso già discusso in precedenza. E’ ovvio che risulta impossibile definire tutti questi parametri in modo manuale; andrà quindi usata una tecnica per imparare questi parametri a partire dalle cosiddette “soluzioni di primo tentativo” e da un dataset di addestramento. Il metodo per consentire a questi parametri di essere più aderenti possibili ai valori ottimali è già di nostra conoscenza: la massimizzazione della 60 CAPITOLO 2. DATI SEQUENZIALI E MODELLI GRAFICI funzione di likelihood attraverso un algoritmo di tipo EM. 2.2.1 La funzione di likelihood Se abbiamo osservato un dataset X = {x1 , ..., xN }, possiamo quindi determinare i parametri di un modello di tipo HMM usando la massimizzazione della likelihood. Per ottenere la funzione di likelihood dobbiamo partire dalla distribuzione congiunta vista in precedenza, chiamata anche “likelihood completa”, e marginalizzata rispetto alle variabili latenti z nel modo seguente: X p(X|θ) = p(X, Z|θ) z A differenza del caso già visto del misto di Gaussiane, in questa situazione le osservazioni appartenenti alla matrice X non sono indipendenti tra loro e non potremo quindi fattorizzare rispetto ad n, il che ci permetterebbe di trattare separatamente ognuna delle somme su z. Inoltre non potremo neanche calcolare esplicitamente queste somme, perché si tratterebbe di sommare N variabili, ognuna delle quali è caratterizzata da K stati, il che risulterebbe in un totale di K N termini. La somma cresce quindi in modo esponenziale con la lunghezza N della catena. Ci si può rendere un’idea della complessità della somma osservando il diagramma a reticolo in figura 2.6 e immaginando di dover tener traccia di tutti i possibili cammini. Un’altra difficoltà legata a questa espressione è dovuta al fatto che i modelli nascosti di Markov sono una generalizzazione dei misti di distribuzione (di cui il misto di Gaussiane è un esempio) e risente quindi dello stesso problema: siccome la somma sulle probabilità di uscita è fatta rispetto a diversi valori delle variabili latenti, la massimizzazione diretta della funzione di likelihood non ha una soluzione in forma chiusa e quindi, come nel caso di misto di Gaussiane, dovremo ricorrere ad un algoritmo iterativo di tipo EM. Come nel caso già visto del misto di Gaussiane, dovremo scegliere dei valori di primo tentativo, che indicheremo con θold . Nel passo di expectation, come d’abitudine, calcoleremo, a partire da θold , l’equivalente dei valori di responsabilità e nel passo di maximization cercheremo, partendo da questi valori di responsabilità, un valore di θ che massimizzi la funzione di likelihood. Ma andiamo più nel dettaglio. Massimizzare la likelihood è equivalente ad massimizzare una funzione ausiliaria Q, definita come il valore atteso del logaritmo della funzione di likelihood completa, che non fa altro che svolgere il ruolo che 61 2.2. APPRENDIMENTO DEL MODELLO la log-likelihood svolgeva nel caso del misto di Gaussiane: una funzione i cui massimi sono gli stessi della likelihood originale, ma più facili da calcolare. Possiamo scrivere questa funzione come X Q(θ, θold ) = p(Z|X, θold ) ln p(X, Z|θ) z Prima di procedere è utile introdurre una nuova notazione. Indicheremo con γ(zn ) la probabilità marginale a posteriori di una variabile latente zn , cioè le probabilità che all’istante n il sistema si trovi in uno dei K stati previsti: γ(zn ) = p(zn |X, θold ) e con ξ(zn−1 , zn ) la distribuzione congiunta a posteriori di due variabili latenti successive, cioè le probabilità che il sistema transiti da uno dei K stati ad un altro tra l’istante n − 1 e l’istante n: ξ(zn−1 , zn ) = p(zn−1 , zn |X, θold ) Possiamo memorizzare, per ogni n, il valore di γ(zn ) usando un vettore di K elementi a somma unitaria e similmente ξ(zn−1 , zn ) in una matrice K×K anch’essa a somma unitaria. Useremo la notazione γ(zn,k ) per indicare la probabilità condizionata che zn,k = 1 ed un uso similare per ξ(zn−1,j , zn,k ) ed altre variabili probabilistiche che vedremo in seguito. Siccome il valore atteso di una variabile aleatoria binaria è uguale alla parobabilità che essa assuma il valore 1, abbiamo che γ(zn,k ) = E[zn,k ] = X γ(z)zn,k z ξ(zn−1,j , zn,k ) = E[zn−1,j , zn,k ] = X γ(z)zn−1,j zn,k z Con qualche passaggio algebrico, sfruttando l’espressione della likelihood e della funzione ausiliaria ed applicando le nuove notazioni, otteniamo Q(θ, θold ) = K X k=1 N X K X K N X K X X ξ(zn−1,j , zn,k ) ln Aj,k + γ(zn,k ) ln p(xn |φk ) γ(z1,k ) ln πk + n=2 j=1 k=1 n=1 k=1 che può sembrare un’espressione complessa, ma ha l’indubbio vantaggio di esplicititare 62 CAPITOLO 2. DATI SEQUENZIALI E MODELLI GRAFICI tutti i termini a cui siamo interessati. L’obiettivo del passo di expectation è stimare le quantità γ(zn ) e ξ(zn−1 , zn ). Vedremo nel prossimo paragrafo come farlo in modo efficiente. Il passo di maximization cerca di trovare un valore di θ = {π, A, φ} che massimizzi la funzione Q(θ, θold ), mantenendo costanti i valori di γ(zn ) e ξ(zn−1 , zn ) calcolati nel passo di expectation. La massimizzazione rispetto a π ed A è piuttosto semplice ed è effettuata usando dei moltiplicatori Lagrangiani con i seguenti risultati: γ(z1,k ) π k = PK j=1 γ(z1,j ) N P Aj,k = ξ(zn−1,j , zn,k ) n=2 K P N P ξ(zn−1,j , zn,l ) l=1n=2 Ovviamente i valori di primo tentativo con cui vengono inizializzati π ed A devono rispettare i vincoli di somma unitaria associati alla loro interpretazione probabilistica. Da notare che ogni elemento di π od A che è inizializzato a zero rimarrà zero in ogni seguente iterazione dell’algoritmo EM. Bisognerà quindi fare attenzione ai valori iniziali di θold perché influiranno sicuramente sull’esito finale dell’algoritmo. Questo comportamento è però molto utile nel caso in cui vogliamo costruire un modello left-to-right, infatti in questo caso basterà porre a zero i giusti elementi di A per essere certi che il sistema non ritorni in stati già visitati in precedenza. Per quanto riguarda la massimizzazione rispetto a φ, possiamo notare che solo l’ultimo termine di Q(θ, θold ) dipende da φk ed inoltre questo termine ha esattamente la stessa forma del caso del misto di Gaussiane per dati i.i.d. in cui le quantità γ(zn,k ) svolgono il ruolo delle responsabilità. Se i parametri φk sono indipendenti tra i vari stati allora possiamo scomporre questo termine in una somma di termini, uno per ogni valore di k, ognuno dei quali può essere massimizzato in modo indipendente. Tutto quello che dovremo fare è quindi massimizzare una log-likelihood per le probabilità di uscita p(x|φk ) pesata dai coefficienti di responsabilità γ(zn,k ). Ovviamente dipende tutto da quale distribuzione usiamo per modellare le propabilità di uscita: un caso comune è l’uso del misto di Gaussiane, in cui possiamo usare le stesse formule viste in precedenza per l’algoritmo EM specifico. I valori iniziali sono richiesti anche per i parametri delle distribuzioni di uscita: una 2.2. APPRENDIMENTO DEL MODELLO 63 procedura piuttosto popolare è trattare il dataset in esame come se si trattasse di dati i.i.d. e modellare la pdf con una delle tecniche illustrate nei capitoli precedenti. Si useranno i parametri forniti da questa tecnica per inizializzare i parametri del modello HMM. 2.2.2 L’algoritmo di Baum-Welch Vedremo ora una procedura efficiente per stimare le quantità γ(zn,k ) e ξ(zn−1,j , zn,k ), corrispondente al passo di expectation dell’algoritmo EM. Questo metodo è stato proposto per la prima volta dalla coppia di ricercatori da cui prende il nome nel 1972 ed è conosciuto sotto diversi nomi a causa delle numerose varianti e specializzazioni che esistono (tra cui un lavoro di Rabiner del 1989, chiamato algoritmo di forward-backward). Parleremo in particolare della versione più comunemente usata, detta alpha-beta, che comunque non differisce di molto da tutte le altre. Prima di iniziare è bene evidenziare che la stima delle probabilità a posteriori delle variabili latenti è indipendente sia dalla forma delle distribuzioni di probabilità d’uscita p(x|z) che dal tipo delle variabili osservate (discrete o continue). Tutto quello di cui abbiamo bisogno per effettuare la stima sono i valori di p(xn |zn ) per ogni z e per ogni n. In seguito quindi ometteremo la dipendenza esplicita dai parametri del modello θold perché non strettamente necessaria. Inoltre iniziamo esplicitando una indipendenza che ci servirà a breve. Questa proprietà è dimostrabile attraverso le regole di somma e prodotto oppure, più semplicemente, attraverso il metodo di d-separation, una tecnica che in modo molto intuitivo usa le dipendenze esplicitate in un grafico orientato come quello in figura 2.4 per evidenziare indipendenze tra le varie variabili (vedere [7] per i dettagli). In seguito poi introdurremo altre indipendenze, tutte ottenibili a partire dal grafico della figura 2.4. La prima parte dal riconoscere che ogni percorso da qualunque nodo x1 , ..., xn−1 verso il nodo xn passa per il nodo zn , che è supposta conosciuta. Siccome tutti questi percorsi terminano in zn , la proprietà di indipendenza tra questi percorsi e i percorsi futuri è assicurata: p(X|zn ) = p(x1 , ..., xn |zn )p(xn+1 , ..., xN |zn ) In altre parole, una volta conosciuto il valore della variabile aleatoria zn , il fatto di conoscere o meno tutto il percorso che ha portato zn ad assumere quel valore non aggiunge informazioni alla conoscenza dei nodi successivi. 64 CAPITOLO 2. DATI SEQUENZIALI E MODELLI GRAFICI Dopo questo breve preambolo, iniziamo a valutare come possiamo calcolare la stima di γ(zn,k ). Ricordiamo che, per una variabile binaria multidimensionale, il valore atteso di uno dei suoi componenti non è altro che la probabilità che quel componente sia uguale ad 1; siamo quindi interessati a trovare la distribuzione a posteriori di zn noto il dataset osservato X = {x1 , ..., xN } , cioè p(zn |x1 , ..., xN ). Siccome zn è una variabile con rappresentazione 1-su-K, questa distribuzione non sarà altro che un vettore K-dimensionale i cui componenti corrispondono ai valori attesi delle singole variabili zn,k . Tenendo presente questa considerazione e usando il teorema di Bayes otteniamo γ(zn ) = p(zn |X) = p(zn )p(X|zn ) p(X) Notare che il denominatore p(X) è implicitamente condizionato anche dal parametro θold e quindi rappresenta ancora la funzione di likelihood per il modello HMM. A questo punto possiamo sfruttare la proprietà di indipendenza enunciata prima che, in combinazione con la regola del prodotto, produrrà questo risultato: γ(zn ) = = p(zn )p(x1 , ..., xn |zn )p(xn+1 , ..., xN |zn ) p(X) p(x1 , ..., xn , zn )p(xn+1 , ..., xN |zn ) α(zn )β(zn ) = p(X) p(X) in cui abbiamo rinominato le probabilità congiunte che tutte le osservazioni passate portino ad uno stato corrente zn come α(zn ) e le probabilità condizionali delle osservazioni future, dato un certo valore di zn , β(zn ). Anche in questo caso α(zn ) e β(zn ) sono grandezze vettoriali, in cui ogni elemento rappresenta la probabilità di ognuna di K possibili stati di zn ed useremo, in modo simile a quanto fatto per γ(zn ), la notazione α(zn,k ) e β(zn,k ) per indicare il valore di probabilità nel caso in cui zn,k = 1. Prima di derivare una regola di ricorsione che permetta di stimare in modo efficiente i valori di α(zn,k ) e β(zn,k ), dobbiamo introdurre altre due regole di indipendenza. La prima è piuttosto intuitiva e dice che, una volta conosciuto lo stato corrente zn , la probabilità delle osservazioni passate (da 1 a n − 1) non è influenzata dall’osservazione corrente xn . La seconda, in modo simile, afferma che, se conosciamo il valore degli stati zn−1 e zn , la probabilità delle osservazioni passate x1 , ..., xn−1 non è influenzata dal valore dello stato 65 2.2. APPRENDIMENTO DEL MODELLO nell’istante successivo, cioè zn . In modo più formale: p(x1 , ..., xn−1 |xn , zn ) = p(x1 , ..., xn−1 |zn ) p(x1 , ..., xn−1 |zn−1 , zn ) = p(x1 , ..., xn−1 |zn−1 ) A questo punto, usando le due proprietà di indipendenza in combinazione con le regole del prodotto e somma, possiamo riscrivere le probabilità α(zn ) come α(zn ) = p(x1 , ..., xn , zn ) = p(x1 , ..., xn |zn )p(zn ) = p(xn |zn )p(x1 , ..., xn−1 |zn )p(zn ) = p(xn |zn )p(x1 , ..., xn−1 , zn ) X = p(xn |zn ) p(x1 , ..., xn−1 , zn−1 , zn ) zn−1 X = p(xn |zn ) p(x1 , ..., xn−1 , zn |zn−1 )p(zn−1 ) zn−1 = p(xn |zn ) X p(x1 , ..., xn−1 |zn−1 )p(zn−1 )p(zn |zn−1 ) zn−1 = p(xn |zn ) X p(x1 , ..., xn−1 , zn−1 )p(zn |zn−1 ) zn−1 che, applicando la definizione originale di α(zn ), diventa: α(zn ) = p(xn |zn ) X α(zn−1 )p(zn |zn−1 ) zn−1 che è la relazione ricorsiva che stavamo cercando. Possiamo farci un’idea del funziomento di un algoritmo di questo tipo osservando la figura 2.10. La sommatoria è su K termini ed il lato destro dell’equazione va valutato per ognuno dei K valori di zn , quindi la formula ricorsiva per calcolare α(zn ) ha un costo computazionale di O(K 2 ). Inoltre per poter iniziare ad assegnare valori, la forma ricorsiva deve “raggiungere il fondo”, cioè dovrà compiere N passi per poter valutare la catena completa: 66 CAPITOLO 2. DATI SEQUENZIALI E MODELLI GRAFICI Figura 2.10: Diagramma a reticolo che illustra il funzionamento della ricorsione in avanti per il calcolo di α(zn ). Nel grafico, le quantità α(zn,1 ) sono ottenute prendendo gli elementi α(zn−1,j ) di α(zn−1 ) al passo n − 1 e sommandoli con pesi dati da Aj,1 , corrispondenti ai valori di p(zn |zn−1 ), e successivamente moltiplicandoli con il contributo dato dalle osservazioni p(xn |zn,1 ). il costo totale sarà quindi O(K 2 N ). La condizione iniziale da cui la ricorsione può iniziare a costruire i valori da calcolare è data da α(z1 ) = p(x1 , z1 ) = p(z1 )p(x1 |z1 ) = K Y [πk p(x1 |φk )]z1,k k=1 In modo molto simile possiamo ricavare una ricorsione che calcoli le quantità β(zn ) facendo uso però di queste nuove proprietà di indipendenza: p(xn+1 , ..., xN |zn , zn+1 ) == p(xn+1 , ..., xN |zn+1 ) p(xn+2 , ..., xN |zn+1 , xn+1 ) = p(xn+2 , ..., xN |zn+1 ) Da cui: β(zn ) = p(xn+1 , ..., xN |zn ) X = p(xn+1 , ..., xN , zn+1 |zn ) zn+1 = X zn+1 p(xn+1 , ..., xN |zn+1 , zn )p(zn+1 |zn ) 67 2.2. APPRENDIMENTO DEL MODELLO = X p(xn+1 , ..., xN |zn+1 )p(zn+1 |zn ) zn+1 = X p(xn+2 , ..., xN |zn+1 )p(zn+1 |zn )p(xn+1 |zn+1 ) zn+1 Nella quale possiamo sostituire la definizione originale di β(zn ) per ottenere la definizione ricorsiva: X β(zn ) = β(zn )p(zn+1 |zn )p(xn+1 |zn+1 ) zn+1 In questo caso la ricorsione non è più in avanti come prima, ma all’indietro. Similmente però dovremo avere una condizione iniziale da cui partire. Questa condizione è ricavabile partendo dalla definizione di γ(zn ) per n = N : γ(zN ) = p(zN |X) = p(X, zN )β(zN ) p(X) Da cui è diretto ricavare che β(zN ) = 1 per ogni valore di zN . Da notare che p(X) rappresenta la likelihood ed avremo perciò un certo interesse nel monitorarla durante i cicli dell’algoritmo EM. Partendo ancora dalla definizione di γ(zn ) e considerando il fatto che la parte sinistra dell’equazione è una distribuzione normalizzata, possiamo ricavare la seguente formula: p(X) = X α(zn )β(zn ) zn Con questa formula possiamo calcolare il valore corrente di likelihood per qualsiasi scelta di n. Se volessimo sapere solo il valore di likelihood finale, disinteressandoci degli altri parametri, potremmo calcorare la somma per n = N , sfruttando il fatto che β(zN ) = 1 e quindi dovendo eseguire la ricorsione solo per i valori di α(zn ): p(X) = X α(zN ) zN Fermiamoci un istante ad interpretare questo risultato. Ricordiamo di aver detto che per calcolare la likelihood p(X) avremmo dovuto prendere in considerazione la probabilità congiunta p(X, Z) e sommarla su tutti i possibili valori di Z, ognuno dei quali rappresenta una delle possibili scelte per lo stato della variabile latente per un certo istante. La 68 CAPITOLO 2. DATI SEQUENZIALI E MODELLI GRAFICI rappresentazione grafica di questo processo è considerare tutti i possibili percorsi in un diagramma a reticolo, cioè un numero esponenziale di cammini. Con quest’ultima formula invece riusciamo a ridurre il costo computazionale da esponenziale rispetto alla lunghezza della catena a lineare rispetto alla stessa, invertendo l’ordine di somme e prodotti in modo che per ogni istante n sommiame i contributi di ogni cammino passante per lo stato zn,k in modo da avere le quantità intermedie α(zn ). Tornando alla stima dei parametri che competono al passo di expectation, dobbiamo calcolare le quantità ξ(zn−1 , zn ), che corrispondono ai valori di probabilità condizionale p(zn−1 , zn |X), cioè una matrice K ×K di valori che corrispondono a tutte le possibili combinazioni di valori che i due stati zn−1 e zn possono assumere. Prima di farlo, introduciamo un’altra proprietà di indipendenza: p(X|zn−1 , zn ) = p(x1 , ..., xn−1 |zn−1 )p(xn |zn )p(xn+1 , ..., xN |zn ) Utilizzando questa proprietà unitamente alla definizione di ξ(zn−1 , zn ) ed applicando il teorema di Bayes otteniamo: ξ(zn−1 , zn ) = p(zn−1 , zn |X) = = p(X|zn−1 , zn )p(zn−1 , zn ) p(X) p(x1 , ..., xn−1 |zn−1 )p(xn |zn )p(xn+1 , ..., xN |zn )p(zn |zn−1 )p(zn−1 ) p(X) = α(zn−1 )p(xn |zn )p(zn |zn−1 )β(zn ) p(X) Siamo quindi in grado di calcolare i valori di ξ(zn−1 , zn ) riutilizzando i risultati delle ricorsioni di α e β. Tiriamo ora le somme dei passi necessari per l’apprendimento di un modello nascosto di Markov tramite un algoritmo EM. Prima di tutto si decide una stima iniziale dei parametri, il famoso θold = {π, A, φ}, in cui A e π sono inizializzati in modo casuale a partire da una distribuzione uniforme (rispettando sempre le proprietà di non-negatività e integrazione unitaria) mentre l’inizializzazione di φ dipende dalla forma della distribuzione scelta: per esempio se usassimo un misto di Gaussiane potremmo sfruttare un algoritmo K-Means per trovare le medie dei modi e sfruttare le informazioni sull’appartenenza delle varie osservazione ai vari modi per calcolare una prima matrice di covarianza. Dopo l’i- 2.2. APPRENDIMENTO DEL MODELLO 69 nizializzazione possiamo iniziare le iterazioni E-M: nel passo di expectation lanciamo le iterazioni α e β ed usiamo i risultati per calcolare i valori di γ(zn ) e ξ(zn−1 , zn ). A questo punto possiamo anche ottenere il valore corrente della funzione di likelihood. Nel passo di maximization usiamo questi risultati per calcolare un miglioramento dei parametri della distribuzione di probabilità, in modo ovviamente dipendente dalla distribuzione usata. Si alternano questi due passi fino a che la differenza tra la likelihood di due iterazioni successive non scende al di sotto di una certa soglia. Nell’algoritmo EM che abbiamo visto nei capitoli precendenti, il numero di osservazioni era fondamentale per la buona riuscita del processo di massimizzazione della likelihood. Anche nel caso di algoritmi EM per hidden Markov model il numero di osservazioni (inteso come lunghezza della catena) è molto importante. Alternativamente a catene molto lunghe si possono usare una pluralità di piccole catene. Quest’ultima soluzione è particolarmente efficace per modelli left-to-right, in cui altrimenti le transizioni da uno stato all’altro (cioè gli elementi non sulla diagonale principale della matrice A) sarebbero viste al massimo una volta. Un’interessante applicazione diretta di un modello di questo genere è il tentativo di calcolare un valore per un’osservazione in un istante futuro N + 1. Le applicazioni di predizione solitamente fanno uso di una singola catena (spesso molto lunga) di osservazioni e di volta in volta si cerca di stimare il prossimo valore sulla catena. L’importanza di questo tipo di applicazioni è intuitiva, basti pensare ad ambienti di previsioni finanziarie. Calcolare questi valori è piuttosto semplice e possiamo fare uso di molte formule ed intuizioni usate in fase di traning. Introducendo le relazioni di indipendenza p(zN +1 |zN , X) = p(zN +1 |zN ) p(xN +1 |zN +1 , X) = p(xN +1 |zN +1 ) e facendone uso combinato con le regole di prodotto e somma possiamo derivare questo risultato: X p(xN +1 |X) = p(xN +1 , zN +1 |X) zN +1 = X zN +1 p(xN +1 |zN +1 )p(zN +1 |X) 70 CAPITOLO 2. DATI SEQUENZIALI E MODELLI GRAFICI = X p(xN +1 |zN +1 ) X zN +1 = X = X X p(zN +1 |zN )p(zN |X) zN p(xN +1 |zN +1 ) zN +1 = zN p(xN +1 |zN +1 ) zN +1 p(zN +1 , zN |X) X p(zN +1 |zN ) zN p(zN , X) p(X) X 1 X p(xN +1 |zN +1 ) p(zN +1 |zN )α(zN ) p(X) z z N +1 N che può essere valutato in due fasi: per prima cosa si calcolano i valori della ricorsione α, poi si calcolano le somme finali. Il risultato della somma su zN può essere memorizzato ed usato una volta che il valore di xN +1 è stato realmente osservato per poter lanciare la ricorsione α in avanti per poter stimare il successivo valore futuro, xN +2 . Da notare che l’influenza data al risultato dalle osservazioni passate è tutta memorizzata nelle K variabili di α(zN ), quindi la distribuzione predittiva può essere portata avanti in modo indefinito usando un quantitativo fisso di memoria, capacità molto utile nel caso di serie temporali in casi reali. 2.3 Utilizzo del modello Senza dubbio il problema più complesso quando si ha a che fare con un modello nascosto di Markov è l’apprendimento, di cui abbiamo già visto la soluzione più popolare. Una volta appresi i parametri che consentono la costruzione del modello, però, sorge il dubbio su come usare questo modello. Data la complessità dello stesso, esistono diversi modi di usarlo, dipendentemente dal particolare aspetto del fenomeno osservato che ci interessa. Possiamo infatti decidere di cercare, data una serie di osservazioni di test, la sequenza di stati che con più probabilità il sistema ha attraversato, oppure possiamo decidere di stimare, data sempre una sequenza di osservazioni, la probabilità che quella sequenza sia dello stesso tipo delle sequenze apprese durante la fase di training. Chiameremo il primo caso state decoding ed il secondo evaluation. 71 2.3. UTILIZZO DEL MODELLO 2.3.1 State Decoding In molte applicazioni di uso pratico le variabili latenti hanno un’interpretazione ricca di significato, quindi risulta spesso interessante trovare la sequenza più probabile di stati, data una certa serie di osservazioni. Per esempio in una applicazione di riconoscimento vocale, data una serie di osservazioni acustiche, quello che vogliamo ottenere è la più probabile sequenza di fonemi pronunciati. Ma poniamo la questione in termini matematici per renderci effettivamente conto di quello di cui stiamo parlando: data una sequenza X = {x1 , ..., xN } di osservazioni, vogliamo trovare la sequenza di stati Z = {z1 , ..., zN } che massimizza la probabilità congiunta p(X, Z). Massimizzare la probabilità congiunta di una serie di osservazioni e dei relativi stati è equivalente a massimizzare il prodotto delle probabilità del percorso seguito, cioè A0,z1 pz1 (x1 )Az1 ,z2 pz2 (x2 )....AzN −1 ,zN pzN (xN ), in cui con Azn ,zn+1 intendiamo il valore di probabilità presente nella matrice di transizione degli stati A in corrispondenza della transizione tra gli stati identificati dalle variabili latenti zn e zn+1 e con pzn (xn ) il valore di probabilità associato all’osservazione xn per il particolare stato definito da zn , che specifica quindi una certa funzione di uscita da usare. Il metodo più comunemente usato per risolvere questo problema è chiamato algoritmo di Viterbi ed è un algoritmo ricorsivo. L’idea di base su cui questo metodo pone le fondamenta è che il meglior percorso di stati che porta ad ottenere una certa osservazione xn , per ogni istante n compreso tra 1 ed N , è parte del percorso migliore per l’intera sequenza. Quello che si fa in pratica è costruire una matrice di programmazione dinamica V di dimensioni N × K, in cui ovviamente K è il numero di stati del sistema (dimensionalità delle variabili latenti) ed N è il numero di osservazioni (lunghezza della sequenza). I valori all’interno della tabella V saranno definiti da: Vn,k = max {z1 ,...,zn−1 } p(x1 , ..., xn , z1 , ..., zn−1 , zn,k = 1) quindi Vn,k è la likelihood del percorso di stati più probabile che il sistema ha attraversato per generare la sequenza di osservazioni X, considerando k come stato finale all’istante n. Ora supponiamo di aver calcolato Vn,k per ognuno dei K stati all’istante n e consideriamo l’istante successivo n + 1. Dalla definizione di Vn,k abbiamo che: Vn+1,j = max p(x1 , ..., xn+1 , z1 , ..., zn , zn+1,j = 1) {z1 ,...,zn } 72 CAPITOLO 2. DATI SEQUENZIALI E MODELLI GRAFICI = max p(xn+1 , zn+1,j = 1|x1 , ..., xn , z1 , ..., zn )p(x1 , ..., xn , z1 , ..., zn ) {z1 ,...,zn } = max p(xn+1 , zn+1,j = 1|zn )p(x1 , ..., xn−1 , z1 , ..., zn−1 , xn , zn ) {z1 ,...,zn } = max(p(xn+1 , zn+1,j = 1|zn,k = 1) k max {z1 ,...,zn−1 } p(x1 , ..., xn , z1 , ..., zn−1 , zn,k = 1) = max(p(xn+1 |zn+1,j = 1)p(zn+1,j = 1)Vn,k k = pj (xn+1 ) max Ak,j Vn,k k dove la seconda espressione è una semplice applicazione della regola del prodotto, la terza deriva dalle proprietà delle catene di Markov, la quarta è una riformulazione in termini leggermente diversi, la quinta è segue dalla definizione di Vn,k e l’ultima dalla riscrittura delle probabilità in termini di funzioni di emissione relative allo stato j e probabilità di transizione. La formula evidenzia chiaramente la struttura ricorsiva della soluzione e ci dà un metodo per poter calcolare , una per volta, tutte le probabilità associate ai diversi percorsi permettendoci di riutilizzare quanto già calcolato in precedenza, cioè il contenuto della tabella. A questo punto il funzionamento dell’algoritmo è piuttosto intuitivo: dovremo decidere uno stato iniziale e fissare la prima riga della tabella, corrispondente all’istante iniziale della sequenza, nel caso più semplice con tutti zero ed un uno in correspondenza dello stato iniziale scelto, altrimenti con le relative probabilità di inizio per ogni stato. A questo punto si comincia la ricorsione, calcolando di volta in volta il valore di Vn,k per ogni possibile stato prima di procedere all’istante n + 1 successivo. Inoltre, per ogni istante e per ogni stato (quindi per ogni elemento della tabella) manteniamo un puntatore allo stato dell’istante precedente da cui siamo provenuti, per essere in grado, al termine dell’algoritmo, di recuperare il percorso migliore. Una volta riempita la tabella, non bisognerà far altro che individuare il maggiore tra i vari VN,k e seguire i puntatori all’indietro per recuperare il cammino migliore. La complessità temporale dell’algoritmo di Viterbi è O(K 2 N ) e quella spaziale è O(KN ) perché necessita di spazio dipendentemente dalle dimensioni della tabella. Uno dei problemi implementativi più comuni è dovuto alle moltiplicazioni di valori probabilistici che portano, come accadeva nel caso del misto di Gaussiane, ad un rapido underflow della precisione numerica, siccome le probabilità tendono a diventare molto piccole. Anche in questo caso la soluzione è usare una scala logaritmica per tutti i valori di probabi- 2.3. UTILIZZO DEL MODELLO 73 lità, il che ci permette, oltre ad evitare i problemi di underflow, anche di calcolare somme anzichè moltiplicazioni. 2.3.2 Evaluation Un modello di tipo HMM può essere interpretato anche in altri modi. Potremmo per esempio essere poco interessati a conoscere la sequenza degli stati che il sistema attraversa, mentre potrebbe essere più utile poter dire se, e con che probabilità, una certa sequenza di osservazioni può essere stata generata dal modello in questione. Per capire meglio questa necessità, prendiamo un caso pratico: supponiamo di avere delle serie di rilevazioni atmosferiche (temperatura, pressione, umidità, piovosità, ...) e di voler usare un sistema basato sui modelli nascosti di Markov per poter determinare se una certe serie di osservazioni appartiene ad una certa stagione. Dovremo avere un certo numero di sequenze di osservazioni “etichettate”, cioè di cui sappiamo il “macrostato”, in questo caso la stagione a cui la sequenza si riferisce. Per prima cosa dovremo far apprendere il concetto di stagione al nostro modello. Creeremo quindi quattro modelli, ognuno addestrato con osservazioni omogenee per stagione. A questo punto, data una sequenza “nuova” non etichettata, vorremo sapere con che probabilità appartiene a ciascuna delle quattro stagioni, cioè la probabilità con cui la sequenza di test aderisce al modello appreso dai dati di training. Se pensiamo alle osservazioni come una sequenza di dati di temperatura e umidità in diverse ore della giornata, possiamo pensare, in modo piuttosto semplificativo, che il modello mapperà sugli stati qualcosa come la situazione metereologica complessiva della giornata (soleggiato, nuvoloso, piovoso, eccetera). E’ intuitivo che possiamo ricavare la sequenza di situazioni metereologiche giornaliere ed unitamente un valore di probabilità associato alla specifica sequenza ottima per ognuno dei quattro modelli attraverso l’algoritmo di Viterbi che abbiamo appena visto. Ma la probabilità della sequenza ottima di stati attraversati non è necessariamente uguale alla probabilità che la serie di osservazioni sia stata generata dal modello. Inoltre possiamo pensare ad un’altra domanda: se volessimo sapere, data una sequenza di osservazioni X, la probabilità di trovarsi in un certo stato k in un certo istante n, l’algoritmo di Viterbi non sarebbe in grado di darci una risposta perché calcola le probabilità basandosi su un percorso in particolare (il migliore), mentre noi vogliamo considerare tutti i percorsi possibili. Cerchiamo di esprimere queste considerazioni in un modo più formale: nel primo caso cercheremo la probabilità di aderenza di una sequen- 74 CAPITOLO 2. DATI SEQUENZIALI E MODELLI GRAFICI za di osservazioni X rispetto ad un modello caratterizzato dai parametri θ = {A, φ, π} (matrice A di probabilità di transizione, parametri φ che governano le funzioni di densità di probabilità di emissione, vettore π di probabilità per gli stati iniziali), cioè cercheremo p(X|θ). Nel secondo caso invece vorremo la probabilità a posteriori per un certo stato k in un dato istante n, cioè p(zn,k = 1|X). Esistono due algoritmi per risolvere questi problemi: il forward algorithm ed il backward algorithm. I nomi possono ricordare il già citato secondo nome dell’algoritmo di Baum-Welch: non è un caso, infatti una combinazione degli algoritmi di forward e backward dà esattamente luogo ad una parte importante dell’algoritmo di apprendimento, nello specifico le ricorsioni α e β. Iniziamo dalla ricerca della propobabilità di appartenenza di una sequenza X al modello θ. D’ora in poi riferiremo la probabilità p(X|θ) semplicemente come p(X), essendo θ sempre costante all’interno dell’algoritmo. Per calcolare questa probabilità, scomporremo p(X) nella somma delle probabilità di X su tutti i possibili percorsi di stati, perché X è stato generato da un qualche cammino e siccome tutti i diversi possibili percorsi sono indipendenti, possiamo calcolare p(X) come somma di tutti i possibili eventi indipendenti che possono generare X: p(X) = X Z p(X, Z) = X p(X|Z)p(Z) Z Questa formula comunque non ci aiuta dal punto di vista dell’algoritmo, perché contine un numero esponenziale di possibili cammini: k stati possibili elevati al numero di osservazioni, cioè alla lunghezza del percorso, cioè k N possibili cammini. Adotteremo quindi un approccio ricorsivo per affrontare questo problema. Costruiremo quindi una una matrice di programmazione dinamica tale che: fn,k = p(x1 , ..., xn , zn,k = 1) dove fn,k rappresenta la probabilità che le prime n osservazioni portino a raggiungere all’istante n lo stato k. Se riguardiamo la definizione di α(zn ), noteremo che stiamo parlando della stessa probabilità. Allo stesso modo di α, possiamo ricavare la soluzione ricorsiva 75 2.3. UTILIZZO DEL MODELLO per calcolare questi valori: fn,k = p(x1 , ..., xn , zn,k = 1) = p(xn |zn,k = 1) X fn−1,j p(zn,k = 1|zn−1,j = 1) j = pk (xn ) X fn−1,j Aj,k j Possiamo quindi costruire la tabella f assegnando dei valori iniziali a f1,k per ogni k e calcolando ricorsivamente tutti i valori di probabilità per ogni istante n. Da notare la somiglianza con l’algoritmo di Viterbi: l’unica differenza nella costruzione della tabella di programmazione dinamica è l’uso di una somma delle probabilità precedenti (considero tutti i possibili cammini) anzichè la scelta del massimo (considero solo il cammino migliore). Per quanto riguarda l’altro caso, cioè la ricerca della probabilità che lo stato in un certo istante n della sequenza sia uguale a k, data la sequenza di osservazioni, identificabile come p(zn,k = 1|X), possiamo iniziare calcolando la probabilità congiunta: p(X, zn,k = 1) = p(x1 , ..., xn , zn,k = 1, xn+1 , ..., xN ) = p(x1 , ..., xn , zn,k = 1)p(xn+1 , ..., xN |x1 , ..., xn , zn,k = 1) = p(x1 , ..., xn , zn,k = 1)p(xn+1 , ..., xN |zn,k = 1) Abbiamo separato la probabilità congiunta nel prodotto di due probabilità, una calcolabile fino all’istante n attraverso la ricorsione α come abbiamo già visto e l’altra relativa agli istanti futuri, cioè la probabilità che le osservazioni vengano generate a partire dallo stato k all’istante n. Queste seconde probabilità non sono altro che quelle definite con β in precedenza. Possiamo costruire la tabella di programmazione dinamica sfruttando la ricorsione: X bn,k = pj (xn+1 )Ak,j bn+1,j j ed ottenere quindi la probabilità condizionale che stavamo cercando tramite il prodotto di fn,k e bn,k , diviso per p(X) (ottenibile eseguendo la ricorsione α fino ad N ). Avevamo già visto questo procedimento, avevamo infatti bisogno della stessa probabilità durante l’algoritmo di Baum-Welch durante il passo di expectation e la calcolavamo nello stesso 76 CAPITOLO 2. DATI SEQUENZIALI E MODELLI GRAFICI modo. Come per l’algoritmo di Viterbi, la complessità temporale dell’algoritmo è O(K 2 N ) ed entrambi gli algoritmi hanno una complessità spaziale di O(KN ). Anche questo algoritmo ha lo stesso problema di underflow che affligge l’algoritmo di Viterbi. In questo caso purtroppo l’uso dei logaritmi è reso inapplicabile dalla presenza delle somme, quindi utilizza un cambio di scala moltiplicando i valori di probabilità per delle costanti e mantenendo traccia delle costanti usate per essere in grado di recuperare il valore di probabilità quando richiesto. Capitolo 3 Esperimenti Ora che abbiamo descritto tutti gli strumenti di cui ci serviremo, possiamo passare a descrivere il sistema su cui abbiamo lavorato. Si tratta di un progetto sviluppato dal dipartimento di Computer Systems della facoltà di Information Technology della University of Technology, Sydney che tratta del riconoscimento di attività umane all’interno di sequenze video. Il sistema si basa su un modello nascosto di Markov che, a partire da una sequenza video, cerca di discriminare l’attività del soggetto umano presente nella sequenza rispetto a tre diversi comportamenti: correre, camminare, stare fermi. Esistono tre versioni del sistema, dipendentemente dal modello usato per stimare le probabilità di emissione all’interno dell’hidden Markov model. La versione di base utilizza un misto di Gaussiane, la cui eccessiva dipendenza dai parametri è però fonte di errori nella stima; una seconda versione che è stata studiata fa uso di un modello di tipo KDE, opportunamente adattato, in cui la larghezza di banda viene stimata attraverso le iterazioni dell’algoritmo di Baum-Welch. Il modello KDE consente di migliorare la qualità della stima e la robustezza rispetto ai parametri, ma ha il problema di non restituire una rappresentazione compatta della funzione di densità di probabilità; per questo la terza versione del sistema prevede l’utilizzo di un metodo Mean Shift per sintetizzare la stima della pdf sfruttando le potenzialità del KDE e senza perdere di robustezza rispetto alla scelta dei parametri iniziali. Vedremo brevemente le tre versioni dell’algoritmo, con particolare attenzione al metodo di Mean Shift implementato e oggetto di questa tesi, ed i risultati a cui queste ci hanno portato. 77 78 3.1 CAPITOLO 3. ESPERIMENTI Le tre versioni Nella trattazione del capitolo precedente, la parte riguardante la fase di maximization dell’algoritmo di Baum-Welch è stata volutamente lasciata piuttosto generale, perché esistono diverse possibilità di implementazione della stessa, dipendentemente dal tipo di distribuzione usata per modellare le probabilità di emissione. Vedremo ora nello specifico tre diverse possibilità per la modellazione delle probabilità di uscita e come apprendere questi modelli all’interno della procedura EM dell’algoritmo di Baum-Welch. Da tenere in considerazione il fatto che le tre implementazioni illustrate non sono le uniche possibilità: esistono infatti molti lavori che propongono approcci diversi; nel paper [17] si studia come utilizzare le reti neurali artificiali per la stima della funzione di probabilità; in [12] si pensa di sfruttare le macchine a vettori di supporto per lo stesso obiettivo. Purtroppo questi approcci richiedono un apprendimento supervisionato in cui gli stati delle variabili latenti delle sequenze di training siano conosciute a priori, un requisito impossibile da verificare nel caso generale. 3.1.1 Hidden Markov Model con Gaussian Mixture L’uso di un misto di Gaussiane per la modellazione delle probabilità di emissione è la scelta classica che viene fatta quando si tratta di costruire un sistema di base. Il misto di Gaussiane infatti consente una modellazione precisa e compatta di un grande numero di distribuzioni probabilistiche ed inoltre il suo apprendimento si integra senza alcuno sforzo all’interno di un algoritmo EM. Ma passiamo direttamente a vedere quali solo le formule che ci consentono la stima dei parametri per il misto, formule utilizzate all’interno del passo di maximization dell’algoritmo di Baum-Welch. Ricordiamo che ogni modello di tipo Gaussian Mixture è caratterizzato da M pesi, M medie e M matrici di covarianza, che l’algoritmo dovrà apprendere a partire da valori iniziali arbitrari. Questi parametri dovranno essere migliorati ad ogni iterazione dell’algoritmo di apprendimento, fino a raggiungere la massimizzazione della funzione di likelihood. Vediamo in figura 3.1 la struttura di base dell’algoritmo. Nei capitoli precedenti abbiamo visto quali calcoli effettuare per il passo di expectation: vedremo ora il passo di maximization. Derivare le formule per il calcolo dei parametri delle distribuzioni d’uscita per un modello di tipo HMM non è molto complesso: basterà infatti riutilizzare le formule che ab- 79 3.1. LE TRE VERSIONI Figura 3.1: Rappresentazione schematica dell’algoritmo di Baum-Welch. biamo già visto per la stima dei parametri di un modello a misto di Gaussiane classico e riadattarle per tenere in considerazione anche i pesi dati dalle probabilità di trovarsi in un certo stato k all’istante n, dato, come abbiamo visto nel capitolo precedente, dalla quantità γ(zn,k ). Utilizzeremo quindi le formule: N P ωk,j = pk (j|xn , θ)γ(zn,k ) n=1 N P γ(zn,k ) n=1 N P µk,j = xn pk (j|xn , θ)γ(zn,k ) n=1 N P p(j|xn , θ)γ(zn,k ) n=1 N P 2 σk,j = (xn − µk,j )2 pk (j|xn , θ)γ(zn,k ) n=1 N P pk (j|xn , θ)γ(zn,k ) n=1 in cui k rappresenta lo stato per cui stiamo modellando la distribuzione, j identifica la componente del misto che stiamo considerando, ωk,j è il coefficiente di mix della j-esima componente per la distribuzione relativa allo stato k (in precedenza avevamo chiamato π i coefficienti di mix, ma cambieremo notazione per non confonderli con le probabilità degli stati iniziali, anch’esse indicate con π) ed infine pk (j|xn , θ) è il valore di responsabilità che la j-esima componente del misto si assume per “spiegare” l’osservazione xn : abbiamo già visto questa grandezza (l’avevamo al tempo indicata con γ(zj )), ma ne riscriviamo la 80 CAPITOLO 3. ESPERIMENTI formula per chiarezza: 2 ) ωk,j G(xn , µk,j , σk,j pk (j|xn , θ) = M P 2 ) ωk,i G(xn , µk,i , σk,i i=1 A questo punto abbiamo tutti gli elementi per poter effettivamente utilizzare un modello nascosto di Markov usando il misto di Gaussiane per modellare le funzioni di uscita relative ai vari stati. L’uso del misto di Gaussiane, però, risente anche all’interno di un modello di questo tipo delle limitazioni che lo contraddistinguono: l’eccessiva dipendenza dai parametri e la difficoltà di modellazione di zone a probabilità uniforme. Per risolvere questi problemi, esistono due strade: una è la ricerca di un modello di stima delle funzioni di uscita che dia più garanzie rispetto ai due problemi citati, l’altra è lo sviluppo di tecniche che, pur restando all’interno del modello di misto di Gaussiane, consentano di ridurre l’incidenza sul risultato delle debolezze intrinseche del modello. Siccome però stiamo cercando strade nuove per la stima di modelli sequenziali, scarteremo la possibilità di “mettere delle toppe” al modello di misto di Gaussiane, privilegiando la ricerca di nuove soluzioni, che consentono possibilità di miglioramento più ampie. 3.1.2 Hidden Markov Model con KDE Come abbiamo già avuto modo di vedere, il metodo di Kernel Density Estimation garantisce una scarsa dipendenza dai parametri di ingresso e consente una stima di alta accuratezza grazie al fatto che è un metodo che si basa sull’uso di kernel locali. Ricordiamo però, dalla trattazione precedente, che il KDE non necessita di un algoritmo EM per la costruzione del modello: l’unico parametro da stimare era la larghezza di banda h, ricavabile attraverso una numerosa serie di tecniche diverse. L’adattamento di un modello KDE all’interno di un algoritmo EM studiato per apprendere un modello nascosto di Markov si annuncia quindi compito non immediato. Dovremo quindi studiare un metodo per adattare un approccio di massimizzazione della likelihood ad un modello come KDE. Ricordiamo la formula di stima della densità di KDE: N 1 X pKDE (x) = K N h n=1 x − xn h 81 3.1. LE TRE VERSIONI in cui la funzione K(·) è detta kernel e presenta le caratteristiche enunciate nei capitoli precedenti. Tra le varie funzioni kernel che possiamo impiegare, c’è anche il kernel Gaussiano che trasformerebbe la funzione di stima in: N 1 X G x|xn , σ 2 pKDE (x) = N n=1 nella quale abbiamo rinominato h con σ. Notiamo che scritta in questa forma la funzione di densità non è altro che un misto di Gaussiane in cui i coefficienti di mix sono tutti uguali e raggruppabili quindi come una divisione per N . Ci sono però notevoli differenze nell’interpretazione di questo modello rispetto ad un misto di Gaussiane classico: in primo luogo il numero di componenti Gaussiane in questo caso è uguale al numero di campioni invece che un numero M molto più piccolo del caso classico. Inoltre con il KDE non c’è la necessità di stimare i coefficienti di mix (perchè tutti uguali) e le medie (ogni Gaussiana ha come media l’osservazione a cui fa riferimento). L’utilizzo all’interno di un modello EM sembra ora meno ostico. Possiamo esplicitare la funzione di likelihood pensando alla probabilità delle osservazioni: LKDE (x1 , ..., xN ) = p(x1 , ..., xN |h) = N Y pKDE (xn ) = N Y n=1 n=1 ! N 1 X 2 G xn |xi , σ N i=1 Il tentativo di massimizzare questa funzione porta inevitabilmente ad una soluzione tanto ovvia quanto indesiderata: siccome ogni Gaussiana è posizionata su una osservazione, assegnare un valore tendente a zero alla varianza farebbe tendere ad infinito la likelihood, portando all’estremo il problema delle singolarità incontrato nella trattazione del modello di Gaussian Mixture. Un semplice ed elegante modo per evitare il problema è escludere il campione xn nel calcolo della likelihood della Gaussiana centrata su xn stesso. La funzione di pseudo-likelihood che potremo usare è quindi data da: P LKDE (x1 , ..., xN ) = N Y n=1 1 N N X G xn |xi , σ ! 2 i=1,xn 6=xi Esistono diversi metodi per la massimizzazione della likelihood diversi dagli algoritmi EM, noi però siamo interessati ad adattare il processo di stima della funzione di probabilità all’algoritmo di Baum-Welch, quindi sfrutteremo la somiglianza del modello KDE al 82 CAPITOLO 3. ESPERIMENTI modello di Gaussian Mixture per derivare le espressioni per il calcolo dei parametri. Abbiamo detto che un modello KDE non necessita della stima dei coefficienti di mix. Questo è vero solo in parte in un contesto di Hidden Markov Model: se infatti normalmente i coefficienti di mix sono tutti uguali per una determinata funzione di uscita, non possiamo esimerci dal valutare le probabilità dei punti di essere generati a partire da un certo stato e quindi da una certa distribuzione. Questo porterà ad assegnare ad ogni punto j un peso ωk,j associato ad ogni stato k per fare in modo che osservazioni che hanno poca attinenza con lo stato corrente k abbiano bassa rilevanza nel modello finale per quello stato. Seguendo questi principi e prendendo spunto dalle formule derivate per il misto di Gaussiane, è facile ottenere le seguenti espressioni: N P ωk,j = pk (j|xn , θ)γ(zn,k ) n=1,xn 6=xj N P γ(zn,k ) n=1 µk,j = xj N P 2 σk,j = N P (xn − xj )2 pk (j|xn , θ)γ(zn,k ) n=1j=1,xn 6=xj N P N P pk (j|xn , θ)γ(zn,k ) n=1j=1,xn 6=xj A questo punto possiamo inserire il modello KDE all’interno della stima di funzioni di uscita per un modello nascosto di Markov. Come vedremo in seguito, i risultati ottenuti con questa tecnica mostrano un’accuratezza comparabile alle migliori prestazioni del modello a misto di Gaussiane, ma con una netta robustezza rispetto ai parametri iniziali, obiettivo che ci eravamo preposti. Come già sapevamo, però, un modello KDE ha una rappresentazione piuttosto onerosa: ogni volta che si vuole calcolare il valore di probabilità di un punto, bisogna effettuare una somma in potenzialmente N termini, operazione che non è accettabile a tempo di esecuzione, cioè quando andremo ad usare il modello con gli algoritmi visti per lo state decoding o l’evaluation. 3.1. LE TRE VERSIONI 3.1.3 83 Hidden Markov Model con Mean Shift Ovviamente ci serve un modo per mantenere l’indipendenza dai parametri del KDE, ma allo stesso tempo rendere più compatta la sua rappresentazione. Cercando di sfruttare al massimo quanto già fatto, possiamo cercare di sintetizzare le informazioni apprese dall’algoritmo EM in una forma che sia più comoda da utilizzare in fase di evaluation o state decoding. L’idea è di sfruttare un metodo di Mean Shift riadattato in modo da trasformare il modello delle funzioni di uscita KDE in un modello probabilistico a misto di Gaussiane classico. Questo consentirebbe di avere una rappresentazione della funzione di probabilità come una somma non più in N termini, ma in M componenti Gaussiani, in cui M è molto minore di N e soprattutto non noto a priori (come invece accadeva per il misto di Gaussiane standard). Figura 3.2: Algoritmo di Baum-Welch applicato ad un modello KDE con post-processing tramite Mean Shift Le necessità di adattamento in questo caso sono piuttosto limitate: la convergenza del metodo di Mean Shift è garantita grazie alle sue proprietà teoriche (viste nei capitoli precedenti), l’unico accorgimento necessario è assicurarsi che il valore di banda σ 2 e di peso ω siano correttamente presi in considerazione al momento del calcolo del vettore di Mean Shift, caratteristica che un algoritmo standard non presenta. Infatti, avendo la necessità di stimare K distribuzioni probabilistiche - una per ogni stato, bisognerà lanciare una procedura di Mean Shift per ognuno degli stati previsti, assegnando ogni volta ai punti i coefficienti ω appropriati. 84 CAPITOLO 3. ESPERIMENTI Implementazione L’implementazione realizzata si basa sulle idee presentate nel paper [10], in cui gli obiettivi principali sono la realizzazione di un metodo di mean shift applicabile per dataset ad alte dimensioni. Quando si tratta di effettuare analisi video, infatti, le informazioni estratte dalla sequenza in esame vengono spesso tradotte all’interno di spazi vettoriali (detti spazi delle feature o feature spaces), che permettono di ridurre la quantità di informazioni dell’immagine originale in un vettore a d dimensioni. Purtroppo però il valore di d è spesso più grande delle dimensioni che riusciamo a trattare con algoritmi di Mean Shift classici. Gli spazi ad alte dimensioni, infatti, ingannano la nostra percezione di spazio tridimensionale: i punti tendono solitamente ad essere molto distanti tra loro, rendendo spesso complesse applicazioni di tipo locale, come per esempio la ricerca dei vicini, compito particolarmente importante nell’esecuzione del Mean Shift. Questo effetto è conosciuto come dimensionality curse ed è un problema ben noto in letteratura ([16], sez 4.5.1). Per i nostri esperimenti utilizzeremo un dataset a due dimensioni, ma la necessità di creare una libreria riutilizzabile in altri contesti ci ha spinti a scegliere questa strada di implementazione. La procedura implementata è di tipo Mean Shift a banda variabile, cioè ad ogni osservazione è assegnato uno specifico valore di banda hn . Questo permette in generale una stima della funzione di densità di probabilità più accurata, ma è comunque stata implementata anche la possibilità di utilizzare un valore di banda fisso nel caso in cui ce ne sia necessità. I valori di banda variabile possono essere stimati automaticamente dall’algoritmo, prendendo come base un vicinato di k punti, oppure caricati da file, sfruttando le informazioni ricavate dall’algoritmo di Baum-Welch applicato al modello KDE. Nel caso specifico di un utilizzo della banda variabile con calcolo attraverso il k-vicinato, i valori di banda sono scelti come la distanza tra il punto xn e la k-esima osservazione più vicina xn,k : hn = kxn − xn,k k Il tipo di distanza scelto nell’implementazione è la distanza L1 (conosciuta anche come distanza di Manhattan o city-block), per ragioni di aderenza alla struttura dati (che vedremo in seguito), unitamente alla semplicità di calcolo. La scelta della distanza non ha comunque grossi effetti sulle performance complessive dell’algoritmo. La dipendenza dal numero di vicini k è piuttosto scarsa anche se non ininfluente, soprattutto in caso di dataset di dimensioni ridotte; possiamo vedere risultati sperimentali su dataset sintetici in [10] oppure 85 3.1. LE TRE VERSIONI controllare i risultati da noi ottenuti in seguito. La struttura dati utilizzata per affrontare il problema dell’alta dimensionalità dei dati è una tecnica approssimata per la ricerca del k-vicinato ed è stata presentata per la prima volta in [15] e riadattata per l’uso all’interno di una tecnica di computer vision in [10]. Una tecnica di questo tipo è senza dubbio necessaria, data la complessità del problema e il frequente utilizzo che ne viene fatto all’interno di una procedura di Mean Shift: un metodo non indicizzato di ricerca del k-vicinato in un dataset formato da n punti a d dimensioni ha una complessità di O(N D) ed andrebbe usato T volte per ognuno degli N punti (in cui T è un valore che dipende dalla banda dei valori e dall’effettiva distribuzione dei punti), risultando in una complessità totale di O(N 2 DT ). La struttura implementata prevede l’utilizzo di L tassellazioni dei dati attraverso la creazione di partizioni random, ognuna definita da K disuguaglianze del tipo: xn,dk 6 vk n = 1, ..., N in cui dk è un intero random scelto tra 1 e d, vk è un valore random scelto all’interno del range dei valori della dk -esima coordinata del dataset e xn,dk è dk -esima coordinata dell’osservazione xn . Quindi, per ogni punto xn e per ognuna delle L partizioni, esiste un vettore binario, che chiameremo , a K dimensioni che rappresenta la veridicità delle K disuguaglianze. Ovviamente punti che hanno un vettore uguale risideranno nella stessa partizione. Usando una funzione hash, potremo raggruppare tutti i punti facenti parte di una stessa partizione all’interno della stessa cella di una opportuna tabella hash. Siccome creeremo L partizioni, ogni punto apparterrà contemporaneamente a L celle della tabella. Quello a cui siamo interessati è trovare tutti i vicini di un punto q all’interno di un certo raggio h. Per farlo, calcoleremo gli L vettori corrispondenti al punto q, che indirizzeranno L celle Cl della tabella hash. L’unione degli insiemi dei punti recuperati dalle varie celle forma il risultato che stiamo cercando, un insieme di punti vicini a q, tra cui cercare quelli all’interno del raggio h. Da notare che tutti i punti contenuti nell’intersezione degli insiemi Cl restituiranno lo stesso risultato, perchè condividono gli stessi valori per gli L vettori L T binari. Possiamo quindi definire C∩ = Cl come la precisione massima della struttura l=1 dati, mentre C∪ = L S Cl come il risultato della query di vicinato. Questa tecnica è illustrata l=1 in figura 3.3 ed è chiamata locality-sensitive hashing (LSH). 86 CAPITOLO 3. ESPERIMENTI Figura 3.3: Query su una struttura di tipo LSH. Dato un punto q, il risultato della query è dato dalla sovrapposizione delle regioni di cui q fa parte all’interno delle L partizioni. Quindi, punti che sono molto vicini nello spazio d-dimensionale hanno un’alta probabilità di collisione nella tabella hash. Siccome C∩ risiede vicino al centro di C∪ , la query restituirà gran parte dei vicini più prossimi di q. Dalla figura però è chiara la natura approssimativa di questo metodo: parte del vicinato L1 di q è escluso dalla regione C∪ , che ha una forma diversa. L’errore causato dalla struttura può essere ridotto costruendo aree C∪ più grandi, a spese però della velocità di ricerca. I valori di K ed L determineranno ovviamente la dimensione attesa di C∪ e C∩ . Il numero medio di disuguaglianze per ogni dimensione dei dati sarà K/d, partizionando quindi i dati in K/d + 1 regioni lungo quella coordinata. Il numero medio di punti NCl in una cella Cl e NC∪ nella loro unione C∪ è dato da: NCl ≈ N (K/d + 1)−d NC∪ ≈ LNCl Quantitativamente, è intuibile che valori grandi di K genereranno regioni più piccole, quindi celle contenenti meno punti. Similmente, aumentando il valore di L, il volume delle intersezioni C∩ diminuirà mentre quello delle unioni C∪ aumenterà. Ovviamente non saremo interessanti ad ingrandire L sopra un certo valore, per cui tutti i vicinati di raggio h saranno coperti da C∪ , situazione in cui aumentare ancora L non darebbe vantaggi sulla 87 3.1. LE TRE VERSIONI qualità del risultato ma porterebbe solo ad un peggioramento dei tempi di risposta delle query. Il nostro obiettivo è quello di trovare la miglior coppia di valori K ed L che minimizzi il tempo di risposta medio delle query, senza però eccedere nelle approssimazioni e mantenendo l’errore al di sotto di una certa soglia fissabile dall’utente. Per valutare l’errore commesso dalla struttura, determineremo la distanza “vera” dal k-esimo vicino, indicata con hj , per un set di m punti campione attraverso la ricerca classica lineare ed in parallelo cercheremo le distanze rilevabili attraverso la struttura LSH con parametri K ed L per gli (K,L) stessi punti campione e la indicheremo con hj . Ovviamente avremo degli errori nel (K,L) caso in cui hj > hj perchè significherà che qualcuno dei primi k vicini risiede nella zona di distanza L1 non coperta dalla struttura LSH. Più formalmente possiamo scrivere: (K, L) = arg min t(K, L) K,L m s.t. (K,L) 1 X hj m j=1 hj 6 (1 + ) L’ottimizzazione è implementata tramite una ricerca numerica all’interno dei range [Kmin , ..., Kmax ]con step definiti da Kjump e 1, ..., Lmax , in cui tutte le costanti indicate sono parametri dell’algoritmo di ricerca. Non solo le dimensioni di K ed L sono importanti al fine della buona riuscita delle query: fondamentale è infatti la scelta delle zone in cui effettuare i tagli K: la prima idea che viene in mente è usare tagli uniformemente distribuiti all’interno del range in cui le osservazioni variano. I limiti di questo approccio sono chiaramente mostrati in figura 3.4-a. Risulta ovvio che un partizionamento guidato dai dati offre migliori performance, riuscendo a mantenere una certa costanza nel numero di punti all’interno di ogni cella, cosa che non avviene nel caso di partizionamento uniforme. La scelta dei valori di vk è quindi fatta attraverso un campionamento casuale dei punti, in cui si sceglie una coordinata in modo random e si utilizza per effettuare il taglio k. Il risultato (figura 3.4-b) mostra la possibilità di avere celle grandi in corrispondenza di regioni sparse e celle piccole in corrispondenza di regioni dense, consentendo possibilità di ricerca più fini. Un accorgimento per velocizzare la ricerca dei modi è il seguente: se due punti risiedono nella stessa intersezione C∩ , è ragionevole pensare che siano molto vicini e che quindi 88 CAPITOLO 3. ESPERIMENTI Figura 3.4: Partizioni uniformi (a) e guidate dai dati (b) facciano riferimento allo stesso modo; potremo quindi evitare di ricalcolare le traiettorie di convergenza per il secondo punto, se già conosciamo l’appartenenza del primo ad un certo modo. Data questa struttura, quindi, potremo sfruttarla per effettuare la ricerca di modi tramite Mean Shift. Come detto, il metodo implementato può funzionare sia a banda fissa che a banda variabile. In realtà le due modalità non sono molto diverse tra loro, la principale differenza è, nel caso di banda variabile, la necessità di effettuare una stima preventiva della funzione di densità per poter assegnare i valori di banda ai vari punti, realizzata tramite la valutazione della distanza L1 con il k-esimo vicino, come già illustrato. La necessità di integrazione con i risultati offerti dal KDE è realizzata da un lato pesando opportunamente i vari punti in fase di calcolo del vettore di mean shift in base ai coefficienti ω di appartenenza allo specifico stato, dall’altro dando la possibilità di riutilizzare i valori di covarianza appresi dall’algoritmo EM per il modello KDE come valori di banda per il mean shift: questa possibilità però nasconde più di una insidia, in quanto i valori di covarianza non sono appresi con lo specifico fine di essere utilizzati per un mean shift e quindi potrebbero non rappresentare la scelta ottimale in questo ambito, in secondo luogo c’è la necessità di convertire i valori di covarianza (matrici d-dimensionali) in valori di banda (scalari) in modo da ottimizzare l’output complessivo, compito non banale. Nell’ambito di questa tesi, la libreria è stata implementata in MATLAB per fattori di integrazione con il software già esistente, essendo la velocità di esecuzione un parametro di valutazione secondario. 89 3.2. RISULTATI SPERIMENTALI 3.2 Risultati sperimentali Mostreremo ora un confronto tra i tre modelli presentati rispetto ad una applicazione di riconoscimento di attività umane in una sequenza video. Le sequenze in esame sono tratte dal dataset video CAVIAR [19] ed in particolare useremo i due video chiamati Fight_RunAway1.mpg e Fight_OneManDown.mpg, in cui si vedono vari soggetti, sia fermi che in movimento a diverse velocità. Separeremo le diverse parti dei video per generare 13 sotto-sequenze da usare come training set e test set. Le sequenze sono caratterizzate da diversi tipi di attività, nel nostro caso, però, considereremo solo tre di queste: inattività (indicato d’ora in poi con “in”), camminata (“wk”) e corsa (“r”). Tutte le sequenze prese in esame hanno un valore di ground-truth associato, assegnato dagli autori in modo manuale. Focalizzeremo le nostre attenzioni su una applicazione di state decoding, per poter essere in grado di confrontare i risultati della nuova implementazione rispetto ai risultati già presentati in [14]. Bisogna comunque tener presente che l’utilità di questo modello non si ferma allo state decoding per la stima delle micro-attività, ma potrà e sarà usato in un’applicazione di evaluation per la rilevazione di macro-attività. Le caratteristiche che abbiamo usato per caratterizzare i movimenti dei soggetti sono due velocità calcolate rispetto ad intervalli diversi: in particolare misureremo la velocità f a 5 e 25 frame di distanza secondo questa formula: 1 speedf = f q (xn − xn−f )2 + (yn − yn−f )2 Il dataset è quindi bidimensionale, rispettivamente di 1975 e 1605 elementi per training set e test set. Per farci un’idea di quello che comporta l’uso di questi descrittori, vediamo in figura 3.5 un esempio di istogrammi per le due caratteristiche separati per i tre possibili stati. Gli esperimenti consistono nell’apprendimento del modello HMM nei tre casi e del conseguente uso per classificazione di micro-attività tramite l’algoritmo di Viterbi, in cui le probabilità iniziali degli stati sono fissate come: {stato1 = 1, stato2 = 0, stato3 = 0}, in modo da sfruttare l’assunzione che il primo stato sia sempre “inattivo” ed essere quindi certi che l’algoritmo di Baum-Welch mapperà i tre stati delle variabili latenti sugli stati “in”, ”wk”, ”r” da noi teorizzati, certezza che verrebbe a mancare in caso contrario. 90 CAPITOLO 3. ESPERIMENTI Figura 3.5: Istogramma delle velocità a 5 frame (colonna sinistra) e a 25 frame (colonna destra) per i vari stati “in” inattivo, “wk” camminata, “r” corsa. 3.2.1 Accuratezza a confronto Passando ad illustrare i risultati degli esperimenti, dobbiamo prima fare una breve panoramica sui parametri usati per le varie prove sperimentali. Per coerenza con quanto detto finora, seguiremo le orme del paper [14] usando gli stessi parametri per le parti comuni. Il software di modellazione tramite KDE usato è una versione successiva rispetto a quella risalente alla pubblicazione, quindi i risultati, anche a parità di parametri di ingresso, saranno leggermente diversi. Quello che interessa ai fini di questa tesi non è comunque un confronto rispetto ai risultati presentati in passato ma un confronto esplicito tra le versioni del modello con e senza il post-processing tramite mean shift. I parametri di inizializzazione per l’algoritmo di Baum-Welch sono i seguenti: • Medie (solo per il caso di misto di Gaussiane): definiamo due possibili valori iniziali, ognuno composto da tre componenti, uno per ogni stato µ1 = [0.2 0.8 1.5] e µ2 = [0.1 2 4] • Covarianze: siccome non sappiamo a priori cosa aspettarci dalla stima delle covarianze, utilizzeremo tre possibili matrici iniziali molto diverse tra loro, due delle 91 3.2. RISULTATI SPERIMENTALI quali simmetriche non diagonali ed una diagonale: " Σ1 = 5 4 4 5 # " Σ1 = 0.01 0 0 0.01 # " Σ3 = 9 8 8 9 # • Numero di Gaussiane (solo per il caso di misto di Gaussiane): 2 • Coefficienti di mix: casuali per il misto di Gaussiane, uniformi per il KDE • Matrice di transizione degli stati: matrice 3 × 3 definita da A=[0.6, 0.2, 0.2; 0.2, 0.6, 0.2; 0.2, 0.6, 0.2]. La considerazione che ha portato alla costruzione di questa matrice è che le attività di corsa sono poche e di durata breve: per questo motivo il valore di A32 è così alto rispetto ad A33 : rappresenta la possibilità di trovarsi in uno stato di corsa e di rallentare, iniziando a camminare. La matrice verrà comunque adattata dall’algoritmo EM. • Numero massimo di iterazioni dell’algoritmo EM: 50 Per quanto riguarda il post-processing tramite mean shift, introduciamo qualche specifica utilizzata nei nostri esperimenti: • Kernel utilizzato: kernel uniforme con ampiezza determinata in modo automatico (kernel adattivo) in base al numero di vicini k • Percentuale di punti utilizzati per la costruzione del modello: 50%, 100% • Numero massimo di iterazioni per ogni traiettoria: 50 • Numero di vicini usato per stimare il valore di banda per ogni punto: 50, 100, 150 Illustreremo di seguito la tabella 3.1 che mostra i risultati di accuratezza di classificazione per ognuno dei tre modelli previsti, ognuno con le rispettive scelte di parametri iniziali: La tabella mostra con chiarezza gli ottimi risultati del mean shift in quanto accuratezza della classificazione, anche se non c’è la quasi completa indipendenza dai parametri, come invece avveniva con il KDE. Questo è comprensibile, perchè il KDE sfrutta l’algoritmo EM per ottimizzare l’unico parametro di cui ha bisogno. Il mean shift, invece, è utilizzato 92 CAPITOLO 3. ESPERIMENTI (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) Modello Gaussian Mixture (µ1 , Σ1 ) Gaussian Mixture (µ1 , Σ2 ) Gaussian Mixture (µ1 , Σ3 ) Gaussian Mixture (µ2 , Σ1 ) Gaussian Mixture (µ2 , Σ2 ) Gaussian Mixture (µ2 , Σ3 ) KDE(Σ1 ) KDE(Σ2 ) KDE(Σ3 ) MeanShift(Σ1 , k = 100, 50%) MeanShift(Σ2 , k = 100, 50%) MeanShift(Σ3 , k = 100, 50%) MeanShift(Σ3 , k = 50, 50%) MeanShift(Σ3 , k = 150, 50%) MeanShift(Σ3 , k = 100, 100%) Errore sul training set 23,69% 18.84% 22,37% 16,86% 17,36% 23,36% 13,72% 14,18% 13,72% 12,86% 18,38% 11,54% 18,73% 17,06% 12,86% Errore sul test set 17,63% 15,07% 17,71% 15,07% 15,32% 16,95% 19,56% 19,50% 19,56% 8,78% 12,52% 7,79% 12,96% 12,65% 8,78% Tabella 3.1: Errori di classificazione per i vari modelli. in post-processing e non può quindi trarre vantaggio dal processo di massimizzazione della likelihood dato dall’algoritmo di Baum-Welch. Per cercare di spiegare questo inatteso miglioramento delle performance di classificazione, vediamo un po’ più in dettaglio i risultati mostrando le matrici di confusione per qualcuno dei casi enunciati in precedenza (tabella 3.2). Sulle colonne leggiamo il valore predetto dal classificatore, mentre in riga il valore ”vero” di quel campione; ovviamente sulla diagonale principale leggeremo il numero di elementi classificati in modo corretto. La lettura delle matrici di confusione ci porta ad un’interpretazione più accurata dei risultati mostrati in precedenza: il miglioramento ottenuto dal mean shift è verosimilmente dovuto alla più precisa stima dei campioni in fase ”walking”, che rappresentano chiaramente la maggioranza a discapito di una diminuzione delle classificazioni corrette per quanto riguarda i campioni che corrono. Questo effetto è da un lato poco desiderabile perchè stiamo sbilanciando la classificazione verso un particolare stato a discapito degli altri, mentre dall’altro lato appare come uno sbilanciamento ragionevole, in quanto permette di diminuire l’errore di classificazione complessivo e aumentare il numero di campioni classificati correttamente. Investigando il motivo di questo genere di comportamento, abbiamo notato che i valori di ω restituiti dall’algoritmo di Baum-Welch applicato al modello KDE per 93 3.2. RISULTATI SPERIMENTALI GM(1) in wk r in 560 108 0 wk 16 719 30 r 0 124 48 KDE(3) in wk r in 566 178 0 wk 9 690 42 r 1 83 36 MS(12) in wk r in 524 29 0 wk 33 922 62 r 1 1 16 Tabella 3.2: Matrici di confusione calcolate sul test set per tre diversi modelli: misto di Gaussiane, KDE, mean shift lo stato ”running” sono in generale piuttosto bassi. Questo provoca una diminuzione dei campioni classificati come ”running” già nel modello KDE privo di post-processing. L’introduzione del mean-shift amplifica questo effetto riducendo ulteriormente l’importanza relativa dello stato ”running” a favore dello stato ”walking”. Il risultato finale è un miglioramento della qualità di classificazione, grazie alla grande maggioranza degli elementi che camminano. Siamo comunque piuttosto fiduciosi che l’algoritmo saprà adattarsi in altri contesti con risultati più che soddisfacenti, anche se forse non sorprendenti come in questo caso. Per concludere, vediamo in figura 3.6 un confronto esplicito tra i grafici delle funzioni di emissione generate dai tre modelli per ognuno dei tre stati. E’ immediato notare una eccessiva semplicità dei grafici relativi al modello di misto di Gaussiane, nei quali la limitazione data dal numero di componenti scelto a priori gioca un ruolo decisivo. Dall’altra parte la funzione fornita dal KDE è fin troppo complessa, ricalcando forse eccessivamente i dati del training set e di difficile fruizione in fase di utilizzo. Le funzioni in uscita dal mean shift invece risultano come un buon compromesso tra i due precedenti modelli, unendo la semplicità e la compattezza rappresentativa del misto di Gaussiane alla libertà rispetto ai parametri iniziali (primo di tutti il numero di componenti del modello) propria del KDE. 94 Stato ”inactive” Stato ”walking” CAPITOLO 3. ESPERIMENTI 3.2. RISULTATI SPERIMENTALI 95 Stato ”running” Figura 3.6: Stima delle funzioni di densità di probabilità per i tre stati ”inactive”, ”walking” e ”running” per ognuno dei tre modelli confrontati (rispettivamente, da sinistra verso destra, Gaussian Mixture, KDE e, nella riga sotto, Mean Shift) Per terminare, il modello fornito dal mean shift consiste in un misto di 3-5 Gaussiane (dipendentemente dallo stato considerato), contro un misto di svariate migliaia di kernel proprio del KDE. 96 CAPITOLO 3. ESPERIMENTI Capitolo 4 Conclusioni In questa tesi abbiamo affrontato il problema della classificazione di sequenze video in attività umane in un contesto di videosorveglianza automatizzata. Abbiamo studiato un sistema basato su modelli nascosti di Markov (Hidden Markov Models) e, partendo dai risultati e dal lavoro presentato nella pubblicazione [14], sviluppato una libreria per migliorare le performance del sistema esistente, il quale presentava buone caratteristiche di accuratezza e robustezza rispetto ai parametri iniziali, cercando di migliorare la compattezza del modello appreso senza deteriorare eccessivamente l’accuratezza e l’insensibilità ai parametri del metodo, con l’obiettivo di renderlo applicabile ad applicazioni real-time. Possiamo affermare con certezza che gli obiettivi raggiunti sono del tutto confortanti, in quanto le analisi di accuratezza hanno dato risultati oltre le più ottimistiche previsioni, nonostante la robustezza ne abbia lievemente risentito, in quanto abbiamo introdotto un parametro, il numero di vicini da prendere in considerazione per il calcolo automatico della banda adattiva, che influisce sul modello in modo non irrilevante. Possiamo comunque essere soddisfatti dei risultati ottenuti, in quanto la leggera dipendenza dall’unico parametro introdotto rispetto alla versione degli hidden Markov models con KDE è senza dubbio facilmente aggirabile se confrontata con l’enorme numero di parametri e la pesante dipendenza da essi che caratterizza il modello a misto di Gaussiane. I risultati presentati in questa tesi sono senza dubbio migliorabili: in primo piano è da prendere in considerazione un raffinamento della tecnica di stima delle matrici di covarianza, possibilmente con l’introduzione di un metodo che tenga conto delle varie traiettorie, come suggerito in [3]. Inoltre è da studiare una tecnica per sfruttare al meglio le infor- 97 98 CAPITOLO 4. CONCLUSIONI mazioni apprese dal modello KDE per quanto riguarda i valori di banda, appresi come covarianze attraverso l’algoritmo EM e da utilizzare all’interno del mean shift al posto della procedura di calcolo automatico della banda. Semplici test sono stati applicati, ma con scarsi risultati: lasciamo però questa opportunità aperta a successivi studi e modellazioni più strutturate. Da non dimenticare è la generalità del modello: esso sarà infatti utilizzato molto presto all’interno di un’applicazione di videosorveglianza più complessa, in cui lo spazio delle features non sarà più un semplice spazio bi-dimensionale rappresentante le velocità degli oggetti, ma le posizioni relative di braccia, gambe e testa di ogni soggetto. Questo permetterà una modellazione più fine della sequenza video, con indubbi vantaggi all’accuratezza del classificatore. Intuibilmente il nuovo dataset avrà una dimensionalità più alta di quello usato per gli esperimenti in questa tesi: questo non rappresenta un problema per il software sviluppato, che scala in modo molto efficiente con la dimensionalità dei dati, grazie alla struttura di indicizzamento implementata. In un’ottica di raffinamento, va anche presa in considerazione l’opportunità di testare il modello con strumenti di evaluation anzichè di state decoding: è intuitivo che il rilevamento di macro-attività non passa necessariamente per il calcolo dell’esatta sequenza di stati che il modello attraversa, ma dalla probabilità generale che una certa sequenza sia stata generata da un certo modello. In quest’ottica sarà possibile diminuire sensibilmente le percentuali di errore di classificazione, ottenendo uno strumento che più si adatta alla nostra idea di classificatore. Concludendo, i risultati ottenuti in questa tesi aprono buone opportunità per lo sviluppo futuro di software di classificazione di attività umane tramite un uso combinato di modelli nascosti di Markov, KDE e tecniche di mean shift, migliorando allo stesso tempo accuratezza e robustezza rispetto ai metodi classici che fanno uso di misti di Gaussiane. Ringraziamenti Giunto al termine del mio percorso di studi, è doveroso porgere i miei più sentiti ringraziamenti a tutte le persone che mi sono state vicine e mi hanno aiutato, supportato e soprattutto sopportato durante questi anni. Senza dover fare necessariamente una classifica, al primo posto si piazzerebbero sicuramente i miei genitori e più in generale la mia famiglia, per il supporto e l’appoggio che ho ricevuto, palese ed evidente sopratutto in questi ultimi mesi. Sono fiero della mia famiglia. Un grazie assoluto va a tutti i miei amici, di cui fare un elenco sarebbe ingeneroso, per non parlare del fatto che il rischio di dimenticarne anche uno solo mi terrorizza. Tra vacanze, cene, birre, partite a calcetto, giornate in laboratorio, volley e discussioni di ogni genere, direi che non ce la siamo poi passata così male. Non dimenticherò mai questi anni e queste persone. Sono fiero dei miei amici. Focalizzando l’attenzione sugli ultimi sei mesi, il primo grazie va al mio relatore, Prof. Luigi Di Stefano, che ha incoraggiato e sospinto la mia volontà di vivere un’esperienza all’estero. Un dovuto ringraziamento va anche al dipartimento di elettronica, informatica e sistemistica (D.E.I.S.) che ha contribuito al finanziamento dei miei studi con un grande supporto per l’attribuzione di una borsa di studio per tesi all’estero. Per quanto riguarda la mia permanenza in terra australe, l’unico motivo per cui sono sopravvissuto ha un nome ed un cognome. Massimo è stato la mia guida tecnica, pratica, spirituale e culinaria nella terra dei canguri, non ce l’avrei mai fatta senza di lui. Un grandissimo ringraziamento va anche alla University of Technology, Sydney (UTS per gli addetti ai lavori), per la splendida accoglienza e gli enormi aiuti ricevuti durante la mia visita. Tra tutte le persone che ho avuto il piacere e l’onore di conoscere, impossibile non menzionare i Socceroos United International, gloriosa squadra di finto calcio ma di verissimo divertimento. I’m proud to be one of you. Per le tre righe più difficili di tutta la tesi e per i quattro milioni di motivi per cui è così 99 100 CAPITOLO 4. CONCLUSIONI facile volerti bene: grazie Lynette. Un grazie sparso va a tutte le persone che non ho citato, dal ragazzo che ha creato il template latex con cui ho scritto la tesi a quei tizi che abbassano la rete da beach volley per giocarci a racchettoni, all’indimenticato ed indimenticabile Brambilla Fumagalli. In ultimo, un omaggio a chi non leggerà mai queste righe ed a cui è dedicata questa tesi: per avermi insegnato cos’è l’impegno, per quella maglietta col colletto, per avermi davvero fatto sentire qualcuno: grazie Alberto. Sono fiero di averti avuto come allenatore. In fede, Roberto Amici Bibliografia [1] D.P. Bertsekas. Nonlinear programming. Athena Scientific Belmont, Mass, 1999. [2] C.M. Bishop and N.M. Nasrabadi. Pattern Recognition and Machine Learning. Journal of Electronic Imaging, 16:049901, 2007. [3] D. Comaniciu. An Algorithm for Data-Driven Bandwidth Selection. Pattern Analysis and Machine Intelligence, IEEE Transactions on, pages 281–288, 2003. [4] D. Comaniciu and P. Meer. Mean Shift: A Robust Approach Toward Feature Space Analysis. Pattern Analysis and Machine Intelligence, IEEE Transactions on, pages 603–619, 2002. [5] D.I. Comaniciu. Nonparametric Robust Methods for Computer Vision. PhD thesis, Rutgers, The State University of New Jersey, 2000. [6] E. Courses and T. Surveys. On the Choice of Smoothing Parameters for Parzen Estimators of Probability Density Functions. Transactions on Computers, 100(25):1175–1179, 1976. [7] D-Separation and Conditional Independence. www.andrew.cmu.edu/user/scheines/tutor/dsep.html. [8] R.O. Duda, P.E. Hart, and D.G. Stork. Pattern Classification. 2001. NY John Wiley, 2001. [9] K. Fukunaga and L. Hostetler. The estimation of the gradient of a density function, with applications in pattern recognition. Information Theory, IEEE Transactions on, 21(1):32–40, 1975. 101 102 BIBLIOGRAFIA [10] B. Georgescu, I. Shimshoni, and P. Meer. Mean shift based clustering in high dimensions: a texture classification example. Computer Vision, 2003. Proceedings. Ninth IEEE International Conference on, pages 456–463, 2003. [11] T. Hastie, R. Tibshirani, and J. Friedman. The Elements of Statistical Learning, 2001. [12] S.E. Kruger, M. Schaffoner, M. Katz, E. Andelic, and A. Wendemuth. Mixture of Support Vector Machines for HMM based Speech Recognition. Proceedings of the 18th International Conference on Pattern Recognition (ICPR’06)-Volume 04, pages 326–329, 2006. [13] G. McLachlan and D. Peel. Finite Mixture Models. Wiley-Interscience, 2004. [14] M. Piccardi and O. Perez. Hidden Markov Models with Kernel Density Estimation of Emission Probabilities and their Use in Activity Recognition. Computer Vision and Pattern Recognition, 2007. CVPR’07. IEEE Conference on, pages 1–8, 2007. [15] G. Shakhnarovich, P. Viola, and T. Darrell. Fast pose estimation with parametersensitive hashing. Computer Vision, 2003. Proceedings. Ninth IEEE International Conference on, pages 750–757, 2003. [16] BW Silverman. Density Estimation for Statistics and Data Analysis. Chapman & Hall/CRC, 1986. [17] E. Trentin. Nonparametric Hidden Markov Models: Principles and Applications to Speech Recognition. Neural Nets: 14th Italian Workshop on Neural Nets, Wirn Vietri 2003, Vietri Sul Mare, Italy, June 4-7, 2003: Revised Papers, 2003. [18] B.A. Turlach. Bandwidth selection in kernel density estimation: A review. Institut für Statistik und Okonometrie, Humboldt-Universität zu Berlin, 1993. [19] CAVIAR: Context Aware Vision using Image-based Active Recognition. http://homepages.inf.ed.ac.uk/rbf/caviar/. [20] M.P. Wand and M.C. Jones. Kernel Smoothing. Chapman & Hall/CRC, 1995. [21] H. Wang and D. Suter. False-Peaks-Avoiding Mean Shift Method for Unsupervised Peak-Valley Sliding Image Segmentation. Digital Image Computing Techniques and Applications, pages 581–590, 2003.