2010-05-31 32 views
6

Tôi cố gắng để cụm một Matrix (kích thước: 20057x2) .:Out of lỗi bộ nhớ khi sử dụng clusterdata trong MATLAB

T = clusterdata(X,cutoff); 

nhưng tôi nhận được lỗi này:

 
??? 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); 

ai đó có thể giúp tôi . Tôi có 4GB ram, nhưng nghĩ rằng vấn đề là từ một nơi khác ..

Trả lời

10

Như đã đề cập bởi những người khác, phân cụm theo cấp bậc cần tính ma trận khoảng cách hai chiều quá lớn để vừa với bộ nhớ trong trường hợp của bạn.

Hãy thử sử dụng các thuật toán K-Phương tiện thay vì:

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

Hoặc bạn có thể chọn một tập hợp con ngẫu nhiên dữ liệu của bạn và sử dụng làm đầu vào cho thuật toán clustering. Tiếp theo bạn tính toán các trung tâm cụm là trung bình/trung bình của mỗi nhóm cụm. Cuối cùng đối với mỗi trường hợp không được chọn trong tập hợp con, bạn chỉ cần tính toán khoảng cách của nó cho từng trọng tâm và gán nó cho một phần gần nhất.

Dưới đây là một số mẫu mã để minh họa cho ý tưởng trên:

%# 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

đẹp giải pháp, tôi thích nó. – Donnie

+0

Cảm ơn bạn đã trả lời toàn diện, Lý do tôi đang sử dụng phân cụm theo cấp bậc là tôi không biết trước bao nhiêu cụm tôi cần. Trong km km tôi phải xác định từ đầu, và vì bản chất của dự án của tôi nó không thể cho tôi để sử dụng Kmeans. Cảm ơn anyways ... – Hossein

+0

@Hossein: Tôi đã thay đổi mã để sử dụng giá trị 'ngắt kết nối 'để tìm số cụm tốt nhất mà không chỉ định trước ... – Amro

2

X quá lớn để thực hiện trên máy 32 bit. pdist đang cố gắng tạo một hàng vectơ 201.131.596 (clusterdata sử dụng pdist) số tăng gấp đôi, sử dụng khoảng 1609MB (double là 8 byte) ... nếu bạn chạy nó dưới cửa sổ với công tắc 3 GB bạn bị giới hạn ở mức tối đa kích thước ma trận 1536MB (xem here).

Bạn sẽ cần phân chia dữ liệu một cách khác biệt thay vì trực tiếp phân cụm tất cả trong một lần.

1

PDIST tính toán khoảng cách giữa tất cả các cặp hàng có thể. Nếu dữ liệu của bạn chứa N = 20057 hàng, thì số cặp sẽ là N * (N-1)/2, là 201131596 trong trường hợp của bạn. Có thể là quá nhiều cho máy của bạn.

Các vấn đề liên quan