Il potere dell’Analisi delle Componenti Indipendenti (ICA) sulle Applicazioni del mondo reale – Esempio su EEG.

La potenza dell'Analisi delle Componenti Indipendenti (ICA) nelle Applicazioni del mondo reale - Un Esempio sull'EEG

L’analisi dei componenti indipendenti (ICA) è uno strumento potente basato sui dati, in grado di separare contributi lineari nei dati

Foto di National Cancer Institute su Unsplash

Introduzione

L’analisi dei componenti indipendenti (ICA) è generalmente associata a compiti di riduzione della dimensionalità. Tuttavia, l’applicazione più importante di questa tecnica è la separazione dei contributi lineari dai dati, trovando componenti statisticamente indipendenti. Ad esempio, l’ICA è ampiamente utilizzata come strumento per separare le tracce strumentali dall’audio. L’obiettivo di questo articolo è presentare e motivare l’ICA con il famoso esempio del “Cocktail Party”, quindi fare una breve introduzione su come l’ICA estrae componenti indipendenti, utilizzando le basi della probabilità e della teoria dell’informazione. Infine, esploreremo un esempio pratico di identificazione e rimozione del movimento del battito delle palpebre dai dati di elettroencefalogramma (EEG).

Separare i contributi del segnale e l’ICA

Per comprendere meglio la separazione dei contributi lineari dai dati, l’esempio classico è il “Cocktail Party”. Questo scenario si svolge in un cocktail affollato in cui due persone si impegnano in una conversazione, rappresentate dagli altoparlanti rossi (Y1) e blu (Y2) nella stanza. Pertanto, due microfoni sono posizionati strategicamente nelle vicinanze per catturare le voci di entrambe le persone, rappresentate dai microfoni verdi (X1) e gialli (X2). L’udibilità di queste voci varia in base alla vicinanza dei conversatori a ciascun microfono.

Illustrazione del 'Cocktail Party'. I segnali vengono catturati dai microfoni X1 e X2, vogliamo decomporli nelle fonti originali Y1 e Y2. Immagine dell'autore.

La sfida consiste nel separare efficacemente le due voci distinte da ciascun file audio misto per acquisire registrazioni audio isolate di ciascun altoparlante. Questo enigma può essere risolto attraverso l’abile applicazione dell’Analisi dei Componenti Indipendenti (ICA), dove, con le giuste ipotesi sui dati (che vedremo nella sezione successiva), ogni componente indipendente sarà il suono dell’altoparlante blu e rosso.

Illustrazione della decomposizione dell'ICA. Immagine dell'autore.

Meccanismo base dell’ICA

L’Analisi dei Componenti Indipendenti (ICA) cerca una rappresentazione dei dati X utilizzando un sistema di coordinate S in cui i componenti Si sono indipendenti. Questi sistemi di coordinate indipendenti formano probabilmente una rappresentazione naturale dei dati.

La parte più importante qui è che l’ICA assume componenti statisticamente indipendenti anziché non correlati (come nel caso dell’PCA) [1].

Definizione di indipendenza statistica.

L’Analisi dei Componenti Principali (PCA) assume che i dati e i componenti siano distribuiti in modo normale, quando questa condizione è soddisfatta, i componenti dell’PCA sono statisticamente indipendenti. Tuttavia, in un caso generale in cui la distribuzione dei dati è non gaussiane, l’ICA è un metodo efficace per trovare componenti indipendenti Y (sorgenti) che rappresentano i dati X (segnale).

La trasformazione ICA è data da Y = AX, dove gli elementi di A sono i coefficienti che definiscono le componenti. Pertanto, è ancora un metodo lineare, perché assume una combinazione lineare tra la fonte e i segnali.

Possiamo anche prendere l’inverso, il che significa scrivere i dati in base alle componenti ICA

Dal momento che stiamo cercando componenti statisticamente indipendenti, vogliamo minimizzare l’informazione condivisa tra le componenti.

Pertanto, la teoria dell’informazione è un candidato naturale per aiutarci a risolvere questo problema. Esiste una misura di informazione condivisa da due variabili casuali X e Y, chiamata Informazione Mutua

Quindi, vogliamo minimizzare l’informazione condivisa dalle componenti,

Ciò significa trovare A che minimizza I[Y] = I[ AˆT X ]. Quindi, i vettori ortogonali risultanti portano alle componenti più indipendenti.

Dopo aver compreso la motivazione e il meccanismo di base di ICA, applichiamolo in una situazione del mondo reale.

I dati di elettroencefalografia (EEG) sono contaminati da vari artefatti di movimento, che si verificano durante l’acquisizione delle immagini a causa del movimento volontario o involontario del paziente. Uno comune è il movimento del lampeggio dell’occhio. Pertanto, strumenti come l’ICA sono ampiamente utilizzati per rimuovere questo tipo di rumore [2]. Come già discusso, l’ICA è un modo per separare le contribuzioni indipendenti del segnale. Pertanto, intuitivamente dovremmo aspettarci un contributo importante del movimento del lampeggio dell’occhio nei canali più vicini agli occhi.

EEG misura le differenze di potenziale tra i punti corticali nel tempo. Pertanto, in un esperimento EEG, avremo più serie temporali da diverse parti della corteccia con informazioni diverse sui circuiti neurali.

EEG time series from multiple channels example. Image by the author.
Location of the channels from the example above. Image by the author.

Per gestire i dati EEG e applicare correttamente l’ICA, useremo MNE (una libreria per la gestione e l’analisi dei dati EEG). Inoltre, utilizzeremo dati raccolti dal Prof. João Sato presso l’Università federale di ABC, disponibili su GitHub.

import pandas as pdimport seaborn as snsimport matplotlib.pyplot as pltimport numpy as npimport mne as mnesns.set_palette('pastel')eeg = np.loadtxt('/Users/rodrigo/Post-Grad/Disciplines/Neural Signaling Processing/Aula_3/restEEG/OlhosAbertos.txt')canais = pd.read_csv('/Users/rodrigo/Post-Grad/Disciplines/Neural Signaling Processing/Aula_3/restEEG/NOMEScanais.txt', dtype='str', header=None)# Frequenza di campionamento 250Hz: Hz = 250eeg = pd.DataFrame(eeg, columns=canais.iloc[:,0].values)eeg['Time(s)'] = np.arange(0, (1/Hz)*len(eeg), 1/Hz)

Creazione oggetto MNE EEG.

# Creazione oggetto MNE
mne_info = mne.create_info(
                    list(eeg.columns[:-1]),
                    Hz,
                    ch_types=['eeg']*len(eeg.columns[:-1]))
mne_raw = mne.io.RawArray(eeg.iloc[:,:-1].values.T, mne_info)

# Definizione dell'architettura degli elettrodi
standard_1020 = mne.channels.make_standard_montage('standard_1020')
mne_raw.set_montage(standard_1020)

Per estrarre solo le caratteristiche importanti, è necessario filtrare le serie temporali per escludere alte frequenze ( > 120 Hz) e basse frequenze ( < 4 Hz) correlate ad artefatti e rumore, nonché la contribuzione di 60 Hz dalla linea di alimentazione dell’ambiente.

# Set dei parametri del filtro
lowCut = 4 # Hz
highCut = 120 # Hz
freqNotch = 60 # Hz (interferenza elettrica proveniente dall'ambiente)

# Applica il filtro passabasso e notch
mne_raw.filter(lowCut, highCut, fir_design='firwin')
mne_raw.notch_filter(freqNotch, fir_design='firwin')

Ora, i dati sono pronti per passare attraverso la ICA.

ica_obj = mne.preprocessing.ICA(
                    n_components=0.95,
                    method='infomax',
                    max_iter="auto",
                    random_state=1,
                    fit_params=dict(extended=True)).fit(mne_raw)
ica = ica_obj.get_sources(mne_raw).get_data()
ica_obj.plot_components(picks=None,show=True, inst=mne_raw)

I coefficienti della ICA vengono utilizzati come indice per identificare la contribuzione spaziale alla componente del segnale.

Illustrazione della procedura per associare valori alle regioni spaziali per ogni componente. Immagine dell'autore.

Pertanto, è possibile creare mappe di calore per ogni componente.

Componenti della ICA. Immagine dell'autore.

La prima componente è la contribuzione del movimento degli occhi al segnale. Come ci aspettavamo, la contribuzione è maggiore nei elettrodi più vicini agli occhi. È anche possibile osservare più in dettaglio le informazioni tempo/frequenza della componente.

Informazioni tempo/frequenza della prima componente della ICA. Immagine dell'autore.

Ora, per rimuovere l’artefatto del movimento degli occhi dai dati, basta ricostruire il segnale senza questa specifica componente. Ciò significa recuperare la serie temporale senza i pattern associati all’artefatto.

Conclusioni

In conclusione, l’Analisi delle Componenti Indipendenti (ICA) è un potente strumento basato sui dati, che assume dati non gaussiani e relazioni lineari tra sorgente e segnali per cercare componenti statisticamente indipendenti. La ICA ci consente di separare diverse contribuzioni ai dati, rendendola particolarmente utile in scenari in cui è necessario isolare il rumore o i segnali indesiderati. Nel caso dei dati EEG, la ICA può identificare e rimuovere artefatti legati al movimento come il lampeggio degli occhi, che possono contaminare il segnale neurale.

Osservazioni

È importante sottolineare che la ICA è uno strumento potente che va utilizzato con cautela. I metodi basati sui dati non assumono alcuna conoscenza precedente sul sistema. Pertanto, confusione e conclusioni spurie sono comuni, rendendo essenziale verificare i requisiti e valutare attentamente i risultati.

Ringraziamenti

Questo progetto è stato ispirato dal Prof. João Ricardo Sato.

Il notebook per questo articolo è disponibile qui.

Riferimenti

[1] Hastie T, Tibshirani R, Friedman J, Hastie T, Tibshirani R, et al.. (2009) Basis expansions and regularization. In: The Elements of Statistical Learning, New York, NY: Springer New York, Springer Series in Statistics.

[2] Mennes M, Wouters H, Vanrumste B, Lagae L, Stiers P. (2010).Validazione dell’ICA come strumento per rimuovere artefatti dei movimenti oculari dagli EEG/ERP. Psychophysiology. 2010;47(6):1142–1150. doi:10.1111/j.1469–8986.2010.01015.x