在使用MATLAB中的clusterdata时出现内存不足错误。

6

我正在尝试对一个矩阵进行聚类 (大小: 20057x2)。

T = clusterdata(X,cutoff);

但是我遇到了这个错误:

??? 使用 ==> pdistmex 时出错
内存不足。输入 HELP MEMORY 以获取选项。
在 ==> pdist 中出错,第 211 行 Y = pdistmex(X',dist,additionalArg);
在 ==> linkage 中出错,第 139 行 Z = linkagemex(Y,method,pdistArg);
在 ==> clusterdata 中出错,第 88 行 Z = linkage(X,linkageargs{1},pdistargs);
在 ==> kmeansTest 中出错,第 2 行 T = clusterdata(X,1);

有没有人能帮帮我。我有4GB的内存,但我认为问题不是来自于内存。

3个回答

13

正如其他人所提到的,层次聚类需要计算成对距离矩阵,在您的情况下太大而无法放入内存中。

尝试使用K-Means算法代替:

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

或者,您可以选择数据的随机子集并将其用作聚类算法的输入。接下来,计算每个群集组的平均值/中位数作为群集中心。最后,对于未在子集中选择的每个实例,只需计算它与每个质心的距离并将其分配给最近的一个。

以下是一个示例代码,以说明上述思想:

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


感谢您的全面回答。我使用分层聚类的原因是我事先不知道需要多少个聚类。在kmeans中,我必须从一开始就定义聚类数,但由于我的项目性质,我无法使用Kmeans。无论如何,还是非常感谢您的帮助。 - Hossein
@Hossein:我修改了代码,使用“截断”值来找到最佳聚类数量,而不需要事先指定... - Amro
2
请注意,上面的示例中我正在生成随机数据作为输入,并且我随机选择了该数据的子集。因此,如果您使用特定的数据集并始终选择相同的实例子集,则结果将是确定性的...请记住,您可以始终尝试不同的截止值和子集大小变量,直到您对结果满意为止。 - Amro
@Amro,你怎么才能让这两个子图(树状图和图形)具有相同的聚类颜色?另外,在树状图中,坐标轴上的值代表什么?谢谢。 - Tak
@user1460166:树状图中y轴上的数值表示从一级到下一级合并的两个聚类之间的链接距离。这是linkage函数返回矩阵中的第三列。至于匹配颜色,您需要查找dendrogram函数返回的线条图形句柄,并手动设置它们的颜色属性以匹配散点图中的颜色分配。您可以从该函数的其他输出参数(请阅读文档页面)中获得节点排列顺序。 - Amro
显示剩余3条评论

2
X 太大了,32位机器无法处理。pdist 正在尝试创建一个由双精度浮点数组成的 201,131,596 行向量(clusterdata 使用 pdist),需要约 1609MB 的空间(double 占用 8 字节)……如果您在 Windows 上使用 /3GB 开关,则最大矩阵大小为 1536MB(请参见此处)。
您需要将数据分割成若干部分,而不是直接一次性聚类所有数据。

1

PDIST计算所有可能行对之间的距离。如果您的数据包含N=20057行,则在您的情况下,成对数将为N*(N-1)/2,即201131596。这对于您的计算机来说可能太多了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接