Innanzitutto, la riduzione della dimensionalità viene utilizzata quando si hanno molte dimensioni covariate e si desidera ridurre la dimensione del problema ruotando i punti dati in una nuova base ortogonale e prendendo solo gli assi con la varianza maggiore. Con 8 variabili (colonne) il tuo spazio è già a bassa dimensione, è improbabile che ridurre il numero di variabili risolva ulteriormente i problemi tecnici con le dimensioni della memoria, ma può influire molto sulla qualità del set di dati. Nel tuo caso concreto è più promettente dare un'occhiata all'apprendimento onlinemetodi. In parole povere, invece di lavorare con l'intero set di dati, questi metodi ne prendono una piccola parte (spesso denominati "mini-batch") alla volta e creano un modello in modo incrementale. (Personalmente mi piace interpretare la parola "online" come riferimento a una fonte infinitamente lunga di dati da Internet come un feed di Twitter, dove non è possibile caricare l'intero set di dati in una sola volta).
E se volessi davvero applicare la tecnica di riduzione della dimensionalità come la PCA a un set di dati che non si adatta alla memoria? Normalmente un set di dati è rappresentato come una matrice di dati X di dimensione n x m , dove n è il numero di osservazioni (righe) e m è un numero di variabili (colonne). In genere i problemi con la memoria provengono solo da uno di questi due numeri.
Troppe osservazioni (n >> m)
Quando hai troppe osservazioni , ma il numero di variabili va da piccolo a moderato, puoi costruire la matrice di covarianza in modo incrementale . In effetti, il tipico PCA consiste nel costruire una matrice di covarianza di dimensioni m x m e applicarvi una decomposizione di valore singolare. Con m = 1000 variabili di tipo float64, una matrice di covarianza ha dimensioni 1000 * 1000 * 8 ~ 8 Mb, che si adatta facilmente alla memoria e può essere utilizzata con SVD. Quindi devi solo costruire la matrice di covarianza senza caricare l'intero set di dati in memoria: un'attività piuttosto tracciabile .
In alternativa, è possibile selezionare un piccolo campione rappresentativo dal set di dati e approssimare la matrice di covarianza . Questa matrice avrà le stesse proprietà del normale, solo un po 'meno accurata.
Troppe variabili (n << m)
D'altra parte, a volte, quando si hanno troppe variabili , la matrice di covarianza non si adatta alla memoria. Ad esempio, se lavori con immagini 640x480, ogni osservazione ha 640 * 480 = 307200 variabili, il che si traduce in una matrice di covarianza da 703Gb! Non è sicuramente quello che vorresti conservare nella memoria del tuo computer, o anche nella memoria del tuo cluster. Quindi dobbiamo ridurre le dimensioni senza costruire una matrice di covarianza.
Il mio metodo preferito per farlo è la proiezione casuale . In breve, se si dispone di un set di dati X di dimensione n x m , è possibile moltiplicarlo per una matrice casuale sparsa R di dimensione m x k (con k << m ) e ottenere una nuova matrice X ' di dimensione molto più piccola n x k con approssimativamente le stesse proprietà di quello originale. Perché funziona Bene, dovresti sapere che PCA mira a trovare una serie di assi ortogonali (componenti principali) e proiettare i tuoi dati sul primo kdi loro. Si scopre che i vettori casuali sparsi sono quasi ortogonali e quindi possono anche essere usati come nuova base.
E, naturalmente, non è necessario moltiplicare l'intero set di dati X per R : è possibile tradurre ogni osservazione x nella nuova base separatamente o in mini-batch.
C'è anche un algoritmo in qualche modo simile chiamato SVD casuale . Non ho alcuna esperienza reale con esso, ma puoi trovare un codice di esempio con spiegazioni qui .
Come linea di fondo, ecco un breve elenco di controllo per la riduzione della dimensionalità di grandi set di dati:
- Se non hai molte dimensioni (variabili), utilizza semplicemente gli algoritmi di apprendimento online.
- Se ci sono molte osservazioni, ma un numero moderato di variabili (la matrice di covarianza si adatta alla memoria), costruisci la matrice in modo incrementale e usa il normale SVD.
- Se il numero di variabili è troppo elevato, utilizzare algoritmi incrementali.