Из ошибки памяти при использовании clusterdata в MATLAB

Я пытаюсь кластеризировать Матрицу (размер: 20057x2).:

T = clusterdata(X,cutoff);

но я получаю эту ошибку:

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

может кто-то помогать мне. Я имею 4 ГБ поршня, но думаю, что проблема от где-то в другом месте..

6
задан Hossein 31 May 2010 в 21:42
поделиться

3 ответа

Как упоминалось другими, иерархическая кластеризация требует вычисления матрицы парных расстояний, которая в вашем случае слишком велика, чтобы поместиться в памяти.

Попробуйте вместо этого использовать алгоритм 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

13
ответ дан 8 December 2019 в 14:41
поделиться

PDIST вычисляет расстояния между всеми возможными парами строк. Если ваши данные содержат N = 20057 строк, то количество пар будет N * (N-1) / 2, что в вашем случае составляет 201131596. Может быть слишком много для вашей машины.

1
ответ дан 8 December 2019 в 14:41
поделиться

X слишком велик для 32-битной машины. pdist пытается создать вектор-строку из 201 131 596 ( clusterdata использует pdist ) удвоений, что потребовало бы около 1609 МБ ( double равно 8 байт) ... если вы запустите его под Windows с переключателем / 3GB, вы ограничены максимальным размером матрицы 1536 МБ (см. здесь ).

Вам нужно будет каким-то образом разделить данные вместо того, чтобы напрямую кластеризовать их все за один раз.

2
ответ дан 8 December 2019 в 14:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: