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.
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. :) –
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
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? :) –