2013-05-05 2 views
1

Je travaille avec k-means dans MATLAB. Voici mon code:Ajustement du numéro de cluster basé sur le centroïde

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" est le dossier du mien. La voici:

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" est la variable de centroïde (le centre de la grappe) pour chaque grappe. "g" est la variable pour montrer le numéro du cluster. Le problème est, je veux trier/adapter le numéro de cluster (petit à grand) en fonction du centroïde (c). Donc, j'essaie de trier (c), mais cela n'affecte pas le numéro de grappe (g).

Lorsque j'essaie de trier (g), le tri est juste différent de ce que je veux. Je veux que le numéro de cluster soit trié en fonction du centroïde. Exemple; quand je lance le code avec k = 3, voici le barycentre finale

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

Quand je le tri, le cluster de numéro est également « sorted »,

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

Je veux le cluster numérique est ajustement, comme ça.

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

Il est bon, pas trié, alors quand cette ligne 'y = [COBAT, g]' est exécuté, il change aussi.

Cela semble facile, mais difficile. Je ne pouvais pas comprendre. Quelqu'un a-t-il une idée pour le résoudre?

Merci.

Répondre

0

Utilisez les indices classés sont revenus de sort ou sortrow

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

Merci pour la réponse. Où puis-je mettre ce script? Je l'ai mis après cette ligne: 'sort (c)', c'est une erreur. J'essaye un autre endroit (avant la ligne 'y = [cobat, g]'), ça devient une erreur pour la même chose: '??? L'index dépasse les dimensions de la matrice. Erreur dans ==> clustere à 49 c = c (index); ' Votre réponse sera très utile et appréciée. :) –

+0

ces lignes devraient remplacer le tri que vous faites actuellement. si vous utilisez 'sort' plutôt que' sortrows' que d'utiliser '[g index] = sort (g); c = c (index); ' – Shai

+0

merci encore pour la réponse. :) J'ai essayé, l'erreur est toujours la même: '??? L'index dépasse les dimensions de la matrice. Erreur dans ==> clustere à 47 c = c (index); Il est dit "dépasse la dimension de la matrice". Mon fichier a 3 dimensions, alors comment faire pour que ce code s'insère dans 3 dimensions? :) –

Questions connexes