2010-05-31 9 views
6

Sto cercando di raggruppare una matrice (dimensioni: 20057x2) .:Fuori errore di memoria durante l'utilizzo clusterdata in MATLAB

T = clusterdata(X,cutoff); 

ma ottengo questo errore:

 
??? Error using ==> pdistmex 
Out of memory. Type HELP MEMORY for your options. 

Error in ==> pdist at 211 
    Y = pdistmex(X',dist,additionalArg); 

Error in ==> linkage at 139 
     Z = linkagemex(Y,method,pdistArg); 

Error in ==> clusterdata at 88 
Z = linkage(X,linkageargs{1},pdistargs); 

Error in ==> kmeansTest at 2 
T = clusterdata(X,1); 

Qualcuno mi può aiutare . Ho 4 GB di RAM, ma penso che il problema sia da qualche altra parte ..

risposta

10

Come menzionato da altri, il clustering gerarchico deve calcolare la matrice della distanza a coppie che è troppo grande per adattarsi alla memoria nel tuo caso.

Prova utilizzando l'algoritmo K-Means invece:

numClusters = 4; 
T = kmeans(X, numClusters); 

In alternativa è possibile selezionare un sottoinsieme casuale di dati e di utilizzare come input per l'algoritmo di clustering. Successivamente si calcola il centro del cluster come media/mediana di ciascun gruppo di cluster. Infine, per ogni istanza che non è stata selezionata nel sottoinsieme, devi semplicemente calcolare la sua distanza da ciascuno dei centroidi e assegnarla a quella più vicina.

Ecco un codice di esempio per illustrare l'idea di cui sopra:

%# random data 
X = rand(25000, 2); 

%# pick a subset 
SUBSET_SIZE = 1000;   %# subset size 
ind = randperm(size(X,1)); 
data = X(ind(1:SUBSET_SIZE), :); 

%# cluster the subset data 
D = pdist(data, 'euclid'); 
T = linkage(D, 'ward'); 
CUTOFF = 0.6*max(T(:,3));  %# CUTOFF = 5; 
C = cluster(T, 'criterion','distance', 'cutoff',CUTOFF); 
K = length(unique(C));  %# number of clusters found 

%# visualize the hierarchy of clusters 
figure(1) 
h = dendrogram(T, 0, 'colorthreshold',CUTOFF); 
set(h, 'LineWidth',2) 
set(gca, 'XTickLabel',[], 'XTick',[]) 

%# plot the subset data colored by clusters 
figure(2) 
subplot(121), gscatter(data(:,1), data(:,2), C), axis tight 

%# compute cluster centers 
centers = zeros(K, size(data,2)); 
for i=1:size(data,2) 
    centers(:,i) = accumarray(C, data(:,i), [], @mean); 
end 

%# calculate distance of each instance to all cluster centers 
D = zeros(size(X,1), K); 
for k=1:K 
    D(:,k) = sum(bsxfun(@minus, X, centers(k,:)).^2, 2); 
end 
%# assign each instance to the closest cluster 
[~,clustIDX] = min(D, [], 2); 

%#clustIDX(ind(1:SUBSET_SIZE)) = C; 

%# plot the entire data colored by clusters 
subplot(122), gscatter(X(:,1), X(:,2), clustIDX), axis tight 

dendrogram clusters

+1

bella soluzione, mi piace. – Donnie

+0

Grazie per la risposta esauriente, La ragione per cui sto usando il clustering gerarchico è che non so quanti cluster ho bisogno in anticipo. In kmea devo definire il principio dall'inizio e, data la natura del mio progetto, non mi è possibile usare Kmean. Grazie comunque ... – Hossein

+0

@Hossein: Ho cambiato il codice per utilizzare il valore 'cutoff' per trovare il miglior numero di cluster senza specificarlo in anticipo ... – Amro

2

X è troppo grande per fare su una macchina a 32 bit. pdist sta tentando di creare un vettore di riga 201,131,596 (clusterdata utilizza pdist) di doppio, che utilizzerebbero circa 1609MB (double è 8 byte) ... se lo si esegue in Windows con l'opzione/3GB, il limite è massimo dimensione matrice di 1536 MB (vedere here).

Hai bisogno di dividere i dati in qualche modo invece di raggrupparli tutti in una volta.

1

PDIST calcola le distanze tra tutte le possibili coppie di righe. Se i tuoi dati contengono N = 20057 righe, il numero di coppie sarà N * (N-1)/2, che è 201131596 nel tuo caso. Potrebbe essere troppo per la tua macchina.

Problemi correlati