title: FastICA
text: # 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.
  