2014-12-03 8 views
5

Ich möchte ein Dataset (600000 Beobachtungen) zu clustern, und für jeden Cluster möchte ich die Hauptkomponenten erhalten. Meine Vektoren bestehen aus einer Email und 30 qualitativen Variablen. Jede quantitative Variable hat vier Klassen: 0,1,2 und 3.R, Problem mit einem hierarchischen Clustering nach einer Multiple Korrespondenzanalyse

Also erste, was ich zu tun habe, ist die Bibliothek FactoMineR zu laden und meine Daten zu laden:

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

Dann bin ich meine Variablen als qualitative Einstellung (ich ohne die Variable 'E-Mail' though):

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

ich die E-Mails von meinen Vektoren zu entfernen:

mydata2 = mydata[2:31] 

und ich bin ein MCA in diesem neuen Datensatz ausgeführt wird:

mca.res <- MCA(mydata2) 

Ich möchte jetzt meine Daten-Set mit der HCPC Funktion clustern:

res.hcpc <- HCPC(mca.res) 

Aber ich bekam die folgende Fehlermeldung:

Error: cannot allocate vector of size 1296.0 Gb 

Was denkst du sollte ich tun? Ist mein Datensatz zu groß? Benutze ich die hcpc-Funktion gut?

+0

Ich konnte das Problem mit einem Dummy-Dataset replizieren. Ich denke, dass Sie HCPC den richtigen Weg, sowie MCA verwenden. Ich denke, dass Sie vielleicht in Sparse-Clustering-Algorithmen suchen, da HCPC Agnes-basiert ist. CLARA kann nützlich sein, aber andere sind verfügbar. –

Antwort

0

Diese Fehlermeldung weist normalerweise darauf hin, dass R nicht genügend RAM zur Verfügung hat, um den Befehl auszuführen. Ich nehme an, dass Sie dies innerhalb von 32bit R ausführen, möglicherweise unter Windows? Wenn dies der Fall ist, dann werden andere Prozesse zu töten und nicht verwendeten R-Variablen zu löschen möglicherweise helfen: zum Beispiel, können Sie versuchen, mydata, mydata2 mit

rm(mydata, mydata2) 

(sowie alle anderen nicht erforderlich R-Variablen) löschen bevor der Befehl ausgeführt wird, der den Fehler erzeugt. Jedoch ist die ultimative Lösung in der Regel zu 64-Bit-R zu wechseln, vorzugsweise unter 64-Bit-Linux und mit einer anständigen RAM Menge, auch hier sehen:

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

Ich replizierte dieses Problem auf einem 64-Bit-R für Linux-Rechner mit 32 GB RAM und 12 Kernen, es ist nur ein großes Datenproblem und kein 32-Bit-Problem. –

+0

1296,0 GB scheint wirklich groß. –

+0

@FMKerckhof Ich benutze Ubuntu auf einem 64bit R. Also ist dein Punkt, gibt es nichts, was ich tun kann? – woshitom

5

Da es verwendet hierarchisches Clustering, HCPC muss das untere Dreieck einer 600000 x 600000 Abstandsmatrix (~ 180 Milliarden Elemente) berechnen. Sie haben einfach nicht den Arbeitsspeicher, um dieses Objekt zu speichern, und selbst wenn Sie das täten, würde die Berechnung wahrscheinlich Stunden, wenn nicht sogar Tage dauern.

Es gab verschiedene Diskussionen zu Stack Overflow/Cross Validated beim Clustering großer Datensätze; einige mit Lösungen in R sind:

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

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

Wenn Sie eine dieser alternativen Clustering-Ansätze verwenden möchten, können Sie es zu mca.res$ind$coord in Ihrem Beispiel gelten würde. Eine andere Idee, die als Antwort auf das Problem clustering very large dataset in R vorgeschlagen wurde, besteht darin, zuerst k zu verwenden, um eine bestimmte Anzahl von Cluster-Zentren zu finden und dann hierarchisches Clustering zu verwenden, um den Baum von dort aus aufzubauen. Diese Methode wird tatsächlich über das kk Argument von HCPC implementiert.

Zum Beispiel mit dem tea Datensatz von FactoMineR:

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) 

Das consol Argument bietet die Möglichkeit, die Cluster aus der hierarchischen Clustering k-Mitteln zu konsolidieren; Diese Option ist nicht verfügbar, wenn kk auf eine reelle Zahl eingestellt ist. Daher ist consol hier auf FALSE eingestellt. Das Objekt res.consul ist auf NULL eingestellt, um einen kleineren Fehler in FactoMineR 1.27 umzugehen.

Die folgende Handlung zeigt die Basis-Cluster auf den 300 Personen (kk = Inf) und auf der Grundlage des 30 k Zentren (kk = 30) für die Daten auf den ersten beiden MCA bedeuten Achsen aufgetragen:

Es

enter image description here

kann gesehen werden, dass die Ergebnisse sehr ähnlich sind. Sie sollten dies leicht auf Ihre Daten mit 600 oder 1000 k Mittelpunkten anwenden können, vielleicht bis zu 6000 mit 8 GB RAM. Wenn Sie eine größere Zahl verwenden möchten, möchten Sie wahrscheinlich eine effizientere Version mit bigkmeans, SpatialTools::dist1 und fastcluster::hclust codieren.