# FastICA

FastICA è un popolare algoritmo per l'analisi delle componenti indipendenti, sviluppato da Aapo Hyvärinen presso la Helsinki University of Technology. L'algoritmo è basato su un punto fisso, schema iterativo per massimizzare la non-gaussianità di una misura statistica di indipendenza. L'algoritmo può anche essere derivato dall'iterazione approssimata di Newton.

## Algoritmo
### FastICA per una componente

L'algoritmo iterativo trova la direzione per il vettore di pesi $\mathbf {w}$ massimizzando la non-gaussianità della proiezione $\mathbf {w} ^{T}\mathbf {x}$ per $\mathbf {x}$. La funzione $g(\cdot )$ è la derivata di una funzione nonquadrata.
* Scegliere un vettori pesi iniziale $\mathbf {w}$
* Sia $\mathbf {w} ^{+}\leftarrow E\left\{\mathbf {x} g(\mathbf {w} ^{T}\mathbf {x} )\right\}-E\left\{g'(\mathbf {w} ^{T}\mathbf {x} )\right\}\mathbf {w}$
* Sia $\mathbf {w} \leftarrow \mathbf {w} ^{+}/\|\mathbf {w} ^{+}\|$
* se non converge, torna al punto 2
In questo caso, come convergenza si intende il verificarsi della situazione per cui i valori di $\mathbf {w}$ riferiti a 2 iterazioni successive puntano nella stessa direzione.
Alcuni esempi di funzioni $g(\cdot )$ sono:
* $g(u)=\tanh(au)$
* $g(u)=u\ exp\left({-u^{2} \over 2}\right)$
I massimi relativi all'approssimazione della negentropia di $\mathbf {w} ^{T}\mathbf {x}$ sono ottenuti in corrispondenza di alcuni risultati dell'ottimizzazione della funzione $E\left\{G(\mathbf {w} ^{T}\mathbf {x} )\right\}$; in accordo con le condizioni di Karush-Kuhn-Tucker, gli ottimi della funzione $E\left\{G(\mathbf {w} ^{T}\mathbf {x} )\right\}$ con il vincolo $E\left\{(\mathbf {w} ^{T}\mathbf {x} )^{2}\right\}=||\mathbf {w} ^{2}||=1$ sono ottenuti nei punti in cui si verifica: $E\left\{\mathbf {x} g(\mathbf {w} ^{T}\mathbf {x} )\right\}-\beta \mathbf {w} =0$
Risolvendo l'equazione con il metodo di Newton e definendo la parte sinistra dell'equazione con F, si ottiene la matrice Jacobiana JF(w) come: $JF(\mathbf {w} )=E\left\{\mathbf {x} \mathbf {x} ^{T}g'(\mathbf {w} ^{T}\mathbf {x} )\right\}-\beta \mathbf {I}$ Per semplificare l'inversione di questa matrice, risulta utile approssimare il primo termine; se i dati sono centrati (valore medio nullo) e sbiancati (whitening), si può approssimare così: $E\left\{\mathbf {x} \mathbf {x} ^{T}g'(\mathbf {w} ^{T}\mathbf {x} )\right\}=E\left\{\mathbf {x} \mathbf {x} ^{T})\right\}E\left\{g'(\mathbf {w} ^{T}\mathbf {x} )\right\}=E\left\{g'(\mathbf {w} ^{T}\mathbf {x} )\right\}\mathbf {I}$
Applicandola, la matrice jacobiana diventa una matrice diagonale, e può quindi essere facilmente invertibile. Si ottiene quindi un'iterazione di Newton approssimata:
$\mathbf {w} ^{+}=\mathbf {w} -{\frac {\left[E\left\{\mathbf {x} g(\mathbf {w} ^{T}\mathbf {x} )\right\}-\beta \mathbf {w} \right]}{\left[E\left\{g'(\mathbf {w} ^{T}\mathbf {x} )\right\}-\beta \right]}}$
L'algoritmo può essere ulteriormente semplificato moltiplicando entrambe le parti per $\beta -E\left\{g'(\mathbf {w} ^{T}\mathbf {x} )\right\}$, dando origine al vero e proprio algoritmo FastICA.
(L'algoritmo usa un'approssimazione della negentropia, che fa uso della curtosi).

## FastICA per più componenti

L'algoritmo descritto per una componente permette di ricavare una sola delle componenti indipendenti. Per poterne stimare di più è necessario applicare l'algoritmo ad un insieme di n unità, caratterizzati da vettori di pesi $\mathbf {w} _{1},...,\mathbf {w} _{n}$.
L'applicazione dell'algoritmo è la stessa, ma bisogna impedire che più neuroni presentino una convergenza nei confronti dello stesso massimo, ovvero bisogna scorrelare le uscite della rete $\mathbf {w} _{1}^{T}\mathbf {x} ,...,\mathbf {w} _{n}^{T}\mathbf {x}$ alla fine di ciascuna iterazione. Per fare questo esistono almeno tre metodi in letteratura.

## Caratteristiche dell'algoritmo

* la convergenza è cubica assumendo un modello ICA, rendendo quindi l'algoritmo più veloce rispetto ai classici metodi basati sulla discesa del gradiente, che sono caratterizzati da convergenza lineare.
* l'algoritmo gode di una grande facilità d'uso, anche perché non vi sono troppi parametri da impostare.
* FastICA riesce a trovare le componenti indipendenti di quasi tutte le distribuzioni gaussiane mediante qualsiasi funzione non lineare g, a differenza di altre tecniche che necessitano di informazioni a priori sulle distribuzioni.
* Le componenti indipendenti possono essere stimate una per una, facendo di questo strumento uno strumento importante per l'analisi esplorativa dei dati e riducendo l'onere computazionale.
* L'algoritmo condivide con gli approcci neurali le caratteristiche desiderabili: è parallelo, distribuito, computazionalmente flessibile e poco esigente in termini di memoria utilizzata.