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
đẹp giải pháp, tôi thích nó. – Donnie
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
@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