2012-09-15 15 views
5

Ho un set di allenamento molto grande (~ 2 Gb) in un file CSV. Il file è troppo grande per leggere direttamente nella memoria (read.csv() interrompe il computer) e vorrei ridurre la dimensione del file di dati utilizzando PCA. Il problema è che (per quanto posso dire) ho bisogno di leggere il file in memoria per eseguire un algoritmo PCA (ad es., princomp()).facendo PCA su un set di dati molto grande in R

Ho provato il pacchetto bigmemory di leggere il file come un big.matrix, ma princomp non funziona su big.matrix oggetti e non sembrare big.matrix può essere convertito in qualcosa di simile a un data.frame.

C'è un modo per eseguire princomp su un file di dati di grandi dimensioni che mi manca?

Sono un novizio relativo in R, quindi alcuni di questi possono essere ovvi per gli utenti più esperti (scuse in avance).

Grazie per qualsiasi informazione.

+0

Fondamentalmente è necessario fare PCA, senza la stima della matrice di covarianza del campione. Esiste un'ampia letteratura sulla PCA ad alta risoluzione, in particolare con le applicazioni all'elaborazione delle immagini e ai mercati finanziari. Tuttavia, è più che probabile che non sia qualcosa di banale da fare. – John

+2

Quante osservazioni e quante variabili contiene il file? – rolando2

+0

@ rolando2 Contiene circa 50K righe e ~ 10000 colonne – user141146

risposta

8

Il modo in cui l'ho risolto è stato il calcolo della matrice di covarianza campione in modo iterativo. In questo modo hai solo bisogno di un sottoinsieme dei dati per qualsiasi momento. La lettura di un solo sottoinsieme di dati può essere eseguita utilizzando readLines in cui si apre una connessione al file e viene letto in modo iterativo. L'algoritmo simile a (si tratta di un algoritmo in due fasi):

Calcolare i valori medi per colonna (supponendo che sono le variabili)

  1. connessione file Open (con = open(...))
  2. Leggi 1000 linee (readLines(con, n = 1000))
  3. Calcolare la somma dei quadrati per colonna
  4. aggiungere tali somme dei quadrati ad una variabile (sos_column = sos_column + new_sos)
  5. R epeat 2-4 fino alla fine del file.
  6. Dividere per il numero di righe meno 1 per ottenere la media.

calcolare la matrice di covarianza:

  1. connessione file aperto (con = open(...))
  2. Leggi 1000 linee (readLines(con, n = 1000))
  3. Calcolare tutti crossproducts utilizzando crossprod
  4. salvare tali crossproducts in un variabile
  5. Ripetere 2-4 fino alla fine del file.
  6. dividere per il numero di righe meno 1 per ottenere la covarianza.

Quando si ha la matrice di covarianza, basta chiamare princomp con covmat = your_covmat e princomp salterà calulating la matrice di covarianza se stesso.

In questo modo i set di dati che è possibile elaborare sono molto, molto più grandi della RAM disponibile. Durante le iterazioni, l'utilizzo della memoria è approssimativamente la memoria che il chunk impiega (ad es.1000 righe), dopo che l'utilizzo della memoria è limitato alla matrice di covarianza (nvar * nvar raddoppia).

+0

forse c'è un modo per non memorizzare tutte le matrici di covarianza in memoria? – mrgloom

+0

Se hai una nuova domanda, creane una nuova, magari riferendoti a questa domanda. –

0

Cose da tenere a mente quando si importa un set di dati di grandi dimensioni.

  1. Requisito di memoria.

  2. Comprendere la struttura del set di dati siano importati utilizzare il seguente codice di esempio:

    iniziale < - read.table ("datatable.csv", nrows = 100);

    classi < - sapply (iniziale, classe);

    tabAll < - read.table ("datatable.csv", colClasses = classi)

  3. Se dataset è l'uso di grandi dimensioni fread() funzione dai dati, di classe tavolo.

  4. Eseguire la tecnica di riduzione della dimensionalità prima di applicare PCA. Esempio, rimuovi variabili altamente correlate o variabili nearZeroVariance poiché non contribuiscono all'output.

  5. Quindi applicare PCA.

Spero che aiuta

Problemi correlati