2014-12-03 20 views
5

Voglio raggruppare un set di dati (600000 osservazioni) e per ciascun cluster voglio ottenere i componenti principali. I miei vettori sono composti da una email e da 30 variabili qualitative. Ogni variabile quantitativa ha 4 classi: 0,1,2 e 3.R, problema con un clustering gerarchico dopo un'analisi di corrispondenza multipla

Quindi, prima cosa che sto facendo è quello di caricare il FactoMineR biblioteca e per caricare miei dati:

library(FactoMineR) 
mydata = read.csv("/home/tom/Desktop/ACM/acm.csv") 

Allora sono impostare i miei come variabili qualitative (sto escludendo la variabile 'e-mail' però):

for(n in 1:length(mydata)){mydata[[n]] <- factor(mydata[[n]])} 

sto togliendo le e-mail dai miei vettori:

mydata2 = mydata[2:31] 

e sto correndo un MCA in questo nuovo insieme di dati:

mca.res <- MCA(mydata2) 

Ora voglio raggruppare il mio set di dati utilizzando la funzione di hcpc:

res.hcpc <- HCPC(mca.res) 

Ma ho ottenuto il seguente messaggio di errore:

Error: cannot allocate vector of size 1296.0 Gb 

Cosa pensi che dovrei fare? Il mio set di dati è troppo grande? Sto utilizzando bene la funzione hcpc?

+0

Sono stato in grado di replicare il problema con un set di dati fittizio. Penso che tu stia usando HCPC nel modo corretto, così come nell'MCA. Penso che potresti voler esaminare gli algoritmi di clustering sparsi dal momento che HCPC è basato su agnes. CLARA può essere utile ma altri sono disponibili. –

risposta

0

Questo messaggio di errore indica in genere che R non dispone di RAM sufficiente per completare il comando. Immagino che tu stia usando questo all'interno di 32bit R, possibilmente sotto Windows? Se questo è il caso, poi uccidere altri processi ed eliminando le variabili R inutilizzati potrebbe forse aiutare: per esempio, si potrebbe tenta di eliminare mydata, mydata2 con

rm(mydata, mydata2) 

(così come tutte le altre variabili R non necessari) prima di eseguire il comando che genera l'errore. Tuttavia l'ultima soluzione in generale sia di passare a 64 bit R, preferibilmente sotto 64bit Linux e con una quantità di RAM discreta, anche vedere qui:

R memory management/cannot allocate vector of size n Mb

R Memory Allocation "Error: cannot allocate vector of size 75.1 Mb"

http://r.789695.n4.nabble.com/Error-cannot-allocate-vector-of-size-td3629384.html

+0

Ho replicato questo problema su una macchina a 64 bit per Linux con 32 GB di RAM e 12 core, è solo un grosso problema di dati piuttosto che un problema a 32 bit. –

+0

1296.0 GB sembra davvero grande. –

+0

@FMKerckhof Sto usando Ubuntu su un 64 bit R. Quindi il tuo punto è che non c'è nulla che io possa fare? – woshitom

5

Poiché utilizza clustering gerarchico, HCPC ha bisogno di calcolare il triangolo inferiore di una matrice di distanze 600000 x 600000 (~ 180 miliardi di elementi). Semplicemente non hai la RAM per archiviare questo oggetto e anche se lo facessi, il calcolo richiederà probabilmente ore se non giorni per il completamento.

Ci sono state varie discussioni su Stack Overflow/Cross Validated sul clustering di grandi dataset; alcuni con soluzioni in R includono:

k-means clustering in R on very large, sparse matrix? (bigkmeans)

Cluster Big Data in R and Is Sampling Relevant? (clara)

Se si desidera utilizzare uno di questi approcci di clustering alternativi, si dovrebbe applicarlo alla mca.res$ind$coord nel tuo esempio.

Un'altra idea, suggerita in risposta al problema clustering very large dataset in R, è di usare k per trovare un certo numero di centri di cluster e quindi utilizzare il clustering gerarchico per costruire l'albero da lì. Questo metodo viene effettivamente implementato tramite l'argomento kk di HCPC.

Ad esempio, utilizzando i dati impostati da teaFactoMineR:

library(FactoMineR) 
data(tea) 
## run MCA as in ?MCA 
res.mca <- MCA(tea, quanti.sup = 19, quali.sup = c(20:36), graph = FALSE) 
## run HCPC for all 300 individuals 
hc <- HCPC(res.mca, kk = Inf, consol = FALSE) 
## run HCPC from 30 k means centres 
res.consol <- NULL ## bug work-around 
hc2 <- HCPC(res.mca, kk = 30, consol = FALSE) 

L'argomento consol offre la possibilità di consolidare i cluster dal cluster gerarchico utilizzando k-means; questa opzione non è disponibile quando kk è impostato su un numero reale, quindi consol è impostato su FALSE qui. L'oggetto res.consul è impostato su NULL per aggirare un bug minore in FactoMineR 1.27.

La trama seguente mostra i cluster basati sulle 300 individui (kk = Inf) e basati sul 30 k significa centri (kk = 30) per i dati tracciati sul primo due MCA assi:

enter image description here

Si si può vedere che i risultati sono molto simili. Dovresti facilmente poterlo applicare ai tuoi dati con 600 o 1000 k significa centri, forse fino a 6000 con 8 GB di RAM. Se si desidera utilizzare un numero maggiore, si consiglia di codificare una versione più efficiente utilizzando bigkmeans, SpatialTools::dist1 e fastcluster::hclust.

Problemi correlati