2016-07-06 3 views
3

J'ai un ensemble de données composé de 54 000 lignes et de quelques colonnes (7). Mes valeurs sont à la fois numériques et alphanumériques (variables qualitatives et quantitatives). Je veux R.Cluster un grand ensemble de données (valeurs quantitatives/qualitatives)

Groupement utilisant hclust fonction Prenons un exemple:

X <- data.frame(rnorm(54000, sd = 0.3), 
       rnorm(54000, mean = 1, sd = 0.3), 
       sample(LETTERS[1:24], 54000, replace=TRUE), 
       sample(letters[1:10], 54000, replace=TRUE), 
       round(rnorm(54000,mean=25, sd=3)), 
       round(runif(n = 54000,min = 1000,max = 25000)), 
       round(runif(54000,0,200000))) 
colnames(X) <- c("A","B","C","D","E","F","G") 

Si j'utilise la fonction hclust comme ceci:

hclust(dist(X), method = "ward.D") 

Je reçois ce message d'erreur:

Error: cannot allocate vector of size 10.9 Gb 

Quel est le problème? J'essaye de créer une matrice de 54k * 54k qui est trop grande pour être calculée par mon PC (4Go de RAM). J'ai lu que depuis R3.0.0, le logiciel est maintenant en 64 bits (capable de fonctionner avec une matrice 2.916e + 09 comme dans mon exemple) donc les limitations viennent de mon ordinateur. Je l'ai essayé avec hclust dans stats/fastcluster/flashClust et j'ai le même problème.

Dans ces paquets, hclust sont décrits comme:

hclust(d, method="complete", members=NULL) 
flashClust(d, method = "complete", members=NULL) 

d a dissimilarity structure as produced by dist. 

Nous avons toujours besoin d'une matrice dist pour faire ce travail de fonction. J'ai aussi essayé de mettre plus les limites de mon ordinateur pour la session R en utilisant ceci:

memory.limit(size = 4014) 
memory.size(max = TRUE) 

Question:

Est-il possible d'utiliser une classification hiérarchique (ou de façon similaire aux données cluster) sans utiliser cette matrice dist() pour un ensemble de données quantitatives/qualitatives avec R?

Edit:

A propos de k-means:

La méthode des k-means fonctionne très bien pour un grand ensemble de données composé de valeurs numériques. Dans mon exemple, j'ai des valeurs numériques et alphanumériques. J'ai essayé de Tranform mes variables qualitatives en variables numériques binaires à faire le processus de k-means:

First dataframe (exemple):

Col1  Col2 Col3 
1 12 43.93145 Alpha 
2 45 44.76081 Beta 
3 48 45.09708 Gamma 
4 31 45.42278 Alpha 
5 12 46.53709 Delta 
6 7 39.07841 Beta 
7 78 49.60947 Alpha 

Si je transforme cela en variables binaires, je reçois ce :

Col1  Col2 Alpha Beta Gamma Delta 
1 12 44.29369  1 0  0  0 
2 45 43.90610  0 1  0  0 
3 48 44.82659  0 0  1  0 
4 31 43.09096  1 0  0  0 
5 12 42.71190  0 0  0  1 
6 7 43.71710  0 1  0  0 
7 78 42.24293  1 0  0  0 

Il est OK si je suis arrivé quelques modalités, mais dans un ensemble de données réelles, nous pourrions obtenir environ 10.000 modalités pour une base 50k de lignes. Je ne pense pas que k-means soit la solution de ce type de problème.

+0

je crois dans ce cas, votre seule option, autant que je sache, est d'utiliser 'kmeans' directement ou utilisé à l'intérieur de la fonction' FactorMineR :: HCPC' comme une réponse [ici ] (http://stackoverflow.com/questions/27269555/r-issue-with-a-hierarchical-clustering-after-a-multiple-correspondence-analysis) – cdeterman

+0

@cedeterman: Merci, merci de votre aide. J'ai essayé 2 nouveaux modèles avec k-means mais ça ne va pas bien pour répondre à mon problème. –

Répondre

1

À la lecture de votre question, il semble qu'il ya 2 problèmes:

1. You have a fairly large amount of observations for clustering 
2. The categorical variables have high cardinality 

Mon conseil:

1) Vous pouvez simplement prendre un échantillon et utiliser fastcluster::hclust, ou utilisez clara. Probablement après avoir trié 2) vous pouvez utiliser plus d'observations, dans tous les cas, il est possible d'utiliser un échantillon. Essayez de prendre un échantillon stratifié des catégories.

2) Vous devez essentiellement représenter ces catégories dans un format numérique, sans avoir plus de 10000 colonnes. Vous pouvez utiliser PCA ou une version discrète de celui-ci. Quelques questions portent sur ce problème: q1, q2

+1

Merci pour votre temps, j'apprécie. Je vais essayer quelque chose en utilisant vos conseils et je posterai mon code plus tard en guise de réponse. –