2013-05-05 2 views
1

Я работаю с k-средствами в MATLAB. Вот мой код:Установка номера кластера на основе Centroid

load cobat.txt; % read the file 

k=input('Enter a number: ');  % determine the number of cluster 
isRand=0; % 0 -> sequeantial initialization 
      % 1 -> random initialization 

[maxRow, maxCol]=size(cobat); 
if maxRow<=k, 
    y=[m, 1:maxRow]; 
else 
    % initial value of centroid 
    if isRand, 
     p = randperm(size(cobat,1));  % random initialization 
     for i=1:k 
      c(i,:)=cobat(p(i),:) ; 
     end 
    else 
     for i=1:k 
      c(i,:)=cobat(i,:);  % sequential initialization 
     end 
    end 

    temp=zeros(maxRow,1); % initialize as zero vector 
    u=0; 
    while 1, 
     d=DistMatrix3(cobat,c); % calculate the distance 
     [z,g]=min(d,[],2);  % set the matrix g group 

     if g==temp,    % if the iteration doesn't change anymore 
      break;    % stop the iteration 
     else 
      temp=g;    % copy the matrix to the temporary variable 
     end 
     for i=1:k 
      f=find(g==i); 
      if f    % calculate the new centroid 
       c(i,:)=mean(cobat(find(g==i),:),1) 
      end 
     end 
     c 
     sort(c) 
    end 

    y=[cobat,g] 

«cobat» - это мой файл. Здесь это выглядит следующим образом:

65 80 55 
45 75 78 
36 67 66 
65 78 88 
79 80 72 
77 85 65 
76 77 79 
65 67 88 
85 76 88 
56 76 65 

«c» - это переменная центроида (центра кластера) для каждого кластера. «g» - это переменная, отображающая номер кластера. Проблема в том, что я хочу сортировать/сопоставлять номер кластера (от малого до большого) на основе центра тяжести (c). Итак, я пытаюсь сортировать (c), но это не влияет на номер кластера (g).

Когда я пытаюсь сортировать (g), он сортируется просто не так, как я хочу. Я хочу, чтобы номер кластера сортировался на основе центра тяжести. Пример; когда я запускаю код с к = 3, вот окончательный Centroid

73.0000 79.0000 70.6667 %C 1 
58.3333 73.3333 84.6667 %C 2 
36.0000 67.0000 66.0000 %C 3 

Когда сортировать его, номер кластера также «отсортированных»,

36.0000 67.0000 66.0000 %C 3 
58.3333 73.3333 70.6667 %C 2 
73.0000 79.0000 84.6667 %C 1 

Я хочу, номер кластера пригодится, вот так.

36.0000 67.0000 66.0000 %C 1 
58.3333 73.3333 70.6667 %C 2 
73.0000 79.0000 84.6667 %C 3 

Это подходит, не отсортирован, поэтому, когда эта линия 'у = [cobat, г] выполняется, он тоже меняется.

Это кажется простым, но сложным. Я не мог понять. У кого-нибудь есть идея решить эту проблему?

спасибо.

ответ

0

Используйте упорядоченные индексы вернулись из sort или sortrow

[B,index] = sortrows(c); % sort the centroids 
g = g(index(end:-1:1)); % arrange the labels based on centroids' order 
+0

Спасибо за ответ. Где я могу поместить этот скрипт? Я положил его после этой строки: 'sort (c)', это ошибка. Я пробую другое место (до 'y = [cobat, g]' line), он получает ошибку для одного и того же: '??? Индекс превышает размерность матрицы. Ошибка в ==> clustere at 49 c = c (index); ' Ваш ответ будет настолько полезен и высоко оценен. :) –

+0

эти строки должны заменить сортировку, которую вы сейчас делаете. если вы используете 'sort', а не' sortrows', чем использовать '[g index] = sort (g); c = c (index); ' – Shai

+0

еще раз благодарю вас за ответ. :) Я пробовал, ошибка все та же: '??? Индекс превышает размерность матрицы. Ошибка в ==> clustere at 47 c = c (index); 'It said 'превышает размер матрицы. Мой файл имеет 3 измерения, и как сделать этот код подходящим для трех измерений? :) –