• Non ci sono risultati.

1.2 Un esempio di Big Data: Gene Expression Microarray

2.1.5 Implementazione numerica del classicatore

Per quanto riguarda l'implementazione numerica di questa tipologia di classicatore, qualora si scelga di utilizzare linguaggi di programmazione come Matlab o Python, vengono già forniti funzioni altamente performanti a livello di tempistiche di calcolo e precisione numerica3. Tuttavia è utile fare un po' di chiarezza sul loro funzionamento

ed il loro legame con la teoria precedentemente esposta.

Per l'implementazione in C++, invece, il classicatore deve essere implementato neces- sariamente manualmente, utilizzando al meglio le librerie a disposizione per ottimizzare i tempi di calcolo e la parallellizzazione. Di seguito analizzeremo il codice sviluppato in questo lavoro di tesi nel quale vengono utilizzate le librerie Eigen per l'ottimizzazione del calcolo matriciale.

Python - Classier with Sklearn

L'utilizzo della funzione di classicazione Bayesiana risulta a prima vista non banale, in quanto la libreria Sklearn non mette a disposizione una sola funzione a più possibili pa- rametri, ma bensì ogni tipologia di classicatore necessita un apposito import. Da una rapida ricerca all'interno del Reference [25] si nota subito l'assenza delle funzioni diagli- near, diagquadratic e mahalanobis4, mentre persistono le nomenclature linear e quadra-

tic, anche se con pratiche abbreviazioni (cfr. sklearn.lda.LDA e sklearn.qda.QDA). Questa apparente mancanza può essere facilmente colmata mediante l'aggiunta di poche righe di codice.

Prima di procedere è utile precisare meglio l'implementazione dei classicatori lineari e di Mahalanobis. Partendo dai casi lineari, avendo dati che dicilmente presenteranno una uguale matrice di covarianza tra classi, l'imposizione di questa condizione viene eseguita a livello numerico attraverso la stima della matrice media di covarianza di tut- te le classi. Una volta calcolata, essa potrà essere utilizzata interamente (classicatore linear) oppure considerandone solo i valori diagonali (classicatore diaglinear). A pro- posito del classicatore mahalanobis, invece, il problema della scelta della matrice di

3Nota: mentre per Matlab le funzioni di classicazione statistica, classify, è presente senza l'aggiunta di particolari Toolbox, per Python faremo riferimento alle funzioni presenti nella libreria Sklearn [25], attualmente una delle migliori e più complete nell'ambito del Machine Learning.

4La funzione Mahalanobis in realtà è presente nella libreria ma non viene previsto un classicatore che la utilizzi. La funzione infatti, restituisce solamente il calcolo della distanza di Mahalanobis stimata rispetto alla matrice di covarianza.

covarianza non viene posto, andando a considerare l'eettiva matrice di covarianza di ogni classe. Questa scelta dierisce dal Caso 3 proposto, costituendone una generaliz- zazione. Come già anticipato, infatti, la distanza Mahalanobis non rappresenta a livello teorico di per sè un classicatore, ma solamente una metrica di distanza.

In Appendice A è riportato il codice relativo all'implementazione del classicatore, come funzione che riceve in input il vettore di training dei dati, il vettore di test, il vettore di label del training ed un numero n ∈ [0, 4] per la scelta della tipologia di classicatore. Si noti che i classicatori LDA e QDA presenti in Sklearn permettono la creazione di funzioni discriminanti solamente di tipo lineare e quadratico, con matrici di covarianza complete: nel primo caso, avendo classi con inevitabile matrice di covarianza dierente, viene considerata la matrice media delle varie classi, mentre nel secondo questa viene calcolata come previsto dalla teoria. Per i casi diagonali e Mahalanobis, invece, il metodo viene implementato seguendo esattamente la teoria esposta, ricavando i vettori di media e matrice/i di covarianza/e attraverso le funzioni della libreria Numpy5.

Prima di concludere è doveroso ricordare che all'interno di Sklearn vi è un gruppo di metodi, denominati Naive Bayes Classier che eettuano una classicazione Bayesiana particolare. Come già anticipato in precedenza, all'atto pratico non si è quasi mai nelle possibilità di fare assunzioni certe sulla forma della distribuzione e ancor più è dicile la conoscenza assoluta della distribuzione dei dati. Per questi motivi spesso l'utilizzo del classicatore di Bayes rigoroso risulta dicile se non impossibile ed è preferibile eettuare ulteriori approssimazioni. I metodi Naive Bayes sono un insieme di algorit- mi di classicazione supervisionata basati sull'applicazione del teorema di Bayes con però l'assunzione di un'indipendenza tra ogni coppia di features. Questa assunzione porta, quindi, ad una forma diagonale della matrice di covarianza. Questo metodo dia- gonale viene implementato attraverso le funzioni NB di Sklearn, lasciando all'utente la libertà di scelta tra tre dierenti densità di probabilità condizionata: GaussianNB, MultinomialNB e BernoulliNB. Per il nostro caso (GaussianNB) il metodo prevede un classicatore diagquadratic, tralasciando la possibilità del caso lineare. Per tale ragione è stato preferibile implementare il metodo manualmente.

C++ - Classier with Eigen Library

L'utilizzo della Libreria Eigen per la manipolazione delle matrici aumenta l'ecienza di calcolo dell'algoritmo e ne facilita l'implementazione. Numerosi metodi implementati nella libreria, con l'attivazione della libreria OpenMP in fase di compilazione, sono già predisposti per applicazioni di calcolo parallelo multi-core. Inoltre, la gestione di memoria è ottimizzata per la manipolazione di ampie matrici, sia per allocazioni statiche che dinamiche. Riguardo l'algoritmo di classicazione, in particolare, la libreria trova applicazione nel calcolo della matrice inversa di covarianza ed anche per la stima di media e varianza.

Ricalcando l'implementazione proposta in Python, l'algoritmo in C++ applicherà la tipologia di classicatore in relazione ad un valore numerico fornito in input. Per la generalizzazione del metodo, le label dei dati saranno considerate delle variabili stringa. Poiché numerose sezioni dell'algoritmo sono le medesime per tutte o alcune tipologie di classicatori, il codice presenta una struttura ramicata a partire dai calcoli comuni. La principale diramazione sarà tra le tipologie quadratiche (QDA, diagQDA e Mahalanobis) e quelle lineari (LDA e diagLDA), in relazione alla diversa matrice di covarianza che è necessario valutare.

In Appendice B è riportato il codice sviluppato in questo lavoro di tesi e successiva- mente utilizzato nell'algoritmo QDANet PRO (cfr. Cap. 3 per la spiegazione completa dell'algoritmo).