正如其他人所提到的,层次聚类需要计算成对距离矩阵,在您的情况下太大而无法放入内存中。
尝试使用K-Means算法代替:
numClusters = 4;
T = kmeans(X, numClusters);
或者,您可以选择数据的随机子集并将其用作聚类算法的输入。接下来,计算每个群集组的平均值/中位数作为群集中心。最后,对于未在子集中选择的每个实例,只需计算它与每个质心的距离并将其分配给最近的一个。
以下是一个示例代码,以说明上述思想:
X = rand(25000, 2);
SUBSET_SIZE = 1000;
ind = randperm(size(X,1));
data = X(ind(1:SUBSET_SIZE), :);
D = pdist(data, 'euclid');
T = linkage(D, 'ward');
CUTOFF = 0.6*max(T(:,3));
C = cluster(T, 'criterion','distance', 'cutoff',CUTOFF);
K = length( unique(C) );
figure(1)
h = dendrogram(T, 0, 'colorthreshold',CUTOFF);
set(h, 'LineWidth',2)
set(gca, 'XTickLabel',[], 'XTick',[])
figure(2)
subplot(121), gscatter(data(:,1), data(:,2), C), axis tight
centers = zeros(K, size(data,2));
for i=1:size(data,2)
centers(:,i) = accumarray(C, data(:,i), [], @mean);
end
D = zeros(size(X,1), K);
for k=1:K
D(:,k) = sum( bsxfun(@minus, X, centers(k,:)).^2, 2);
end
[~,clustIDX] = min(D, [], 2);
subplot(122), gscatter(X(:,1), X(:,2), clustIDX), axis tight
![clusters](https://istack.dev59.com/P6OWd.webp)
linkage
函数返回矩阵中的第三列。至于匹配颜色,您需要查找dendrogram
函数返回的线条图形句柄,并手动设置它们的颜色属性以匹配散点图中的颜色分配。您可以从该函数的其他输出参数(请阅读文档页面)中获得节点排列顺序。 - Amro