6

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

T = clusterdata(X,cutoff);

但我收到此错误:

???使用 ==> pdistmex 时出错
记不清。键入 HELP MEMORY 作为您的选项。

==> pdist 中的错误在 211
    Y = pdistmex(X',dist,additionalArg);

==> 链接中的错误 139
       Z = linksmex(Y,method,pdistArg);

==> clusterdata 中的错误为 88
Z = 链接(X,linkageargs{1},pdisargs);

==> kmeansTest 在 2 处出错
T = 集群数据(X,1);

有人能帮我吗。我有 4GB 的内存,但认为问题出在其他地方..

4

3 回答 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

树状图 集群

于 2010-05-31T22:40:26.620 回答
2

X在 32 位机器上太大了。 pdist正在尝试制作一个 201,131,596 行向量(clusterdatauses pdist)的双精度数,这将使用大约 1609MB (double是 8 个字节)...如果您在带有 /3GB 开关的 Windows 下运行它,您将被限制为最大矩阵大小为 1536MB (见这里)。

您将需要以某种方式划分数据,而不是一次直接将所有数据聚类。

于 2010-05-31T21:56:41.467 回答
1

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

于 2010-05-31T22:04:42.273 回答