объединить результаты кластера k-средних, который находится в цикле - PullRequest
0 голосов
/ 09 июня 2018

У меня есть кластер kmeans, в котором он должен делить данные на 2 кластера.этот процесс продолжается в цикле, пока не достигнет состояния.Итак, в конце я могу получить 20 кластеров.Я делаю это, потому что я не хочу назначать определенное количество кластеров.Так что это должно продолжать делиться на 2.

Я хотел знать, как это сделать в Matlab?Я использую цикл, но проблема в том, что после объединения данных мне нужно изменить номер кластера.Есть ли какая-либо функция, которая делает это сама, вместо того, чтобы назначать новый номер кластера?

следующий пример может быть одним из подходов.Там могут быть другие подходы.все в порядке, пока он дает результат комбинации кластеров. например: * первый цикл: 1 2 2 1 2 1 1

второй цикл: (потребуется первый кластер и кластерэто в 2 набора, а затем он объединит его с предыдущими результатами)

[1 1 1 1] после кластера в 2 набора => [1 1 2 1] => объединить с предыдущим циклом [1 1 31] (выберите 3, потому что у нас уже есть кластер 2)

снова потребуется первый кластер (из подкластера):

[1 1 1] после кластера => [1 1 2] => объединить с предыдущим циклом [1 1 3 4] Вот пример: enter image description here

Мой код:

[IDX,C,SUMD] = SpectralClustering(G, k); % k is two
.
.
.
if Wav > w % Wav is average weight of cluster

            Gi = subgraph(G, IDX==1); % IDX is cluster number 
            Ctemp = union(Ctemp, SpectralClustering(Gi, k)); % k is 2
 else
            Ctemp = union(Ctemp, IDX);
 end

C = Ctemp;

1 Ответ

0 голосов
/ 12 июня 2018

Как упоминалось в моем комментарии, метки кластера будут уникальными, если они получены из родительского кластера:

function [clusters] =  clusterExample(data, parentCluster)

% On each level, cluster data into two clusters based on value relative to
% quantiles (AKA the median, when k = 2)

% Stop clustering if the ratio of the standard deviation of the cluster
% to the mean of the cluster is  <= .1 
% This is an arbitary stopping rule for this example
k = 2;

cutOffPoint = quantile(data, (1 / k));

clusters = nan(1, length(data));
clusters(data <= cutOffPoint) = (parentCluster * 10) + 1;
clusters(data > cutOffPoint) =  (parentCluster * 10) + 2;
clusterLabels = unique(clusters);
for g = clusterLabels
   clusterIdx = clusters == g;
   clusterMean = mean(data(clusterIdx));
   clusterSD = std(data(clusterIdx));
   if (clusterSD / clusterMean) > .1
       clusters(clusterIdx) = clusterExample(data(clusterIdx), g);
   end
end

Используется:

data = rand(1,100);
startCluster = 0;
clusters = clusterExample(data, startCluster);

Каждый из полученных кластеров имеетSD в пределах 10% от среднего значения кластера (для этого примера используется произвольное правило остановки).

...