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.