Question

J'ai un de A matrice (369x10) que je veux regrouper en 19 groupes. J'utilise cette méthode

[idx ctrs]=kmeans(A,19)

ce qui donne idx (369x1) et un CTR (19x10)

Je reçois le point jusqu'à here.All mes lignes A est en 19 grappes regroupées.

Maintenant, j'ai un tableau B (49x10) .Je souhaite savoir où les lignes de ce B correspond au 19 parmi les clusters données.

Comment est-il possible dans Matlab?

Merci d'avance

Était-ce utile?

La solution

Je ne peux pas penser à une meilleure façon de le faire que ce que vous avez décrit. Une fonction intégrée sauverait une ligne, mais je ne pouvais pas trouver un. Voici le code j'utiliser:

[ids ctrs]=kmeans(A,19);
D = dist([testpoint;ctrs]); %testpoint is 1x10 and D will be 20x20
[distance testpointID] = min(D(1,2:end));

Autres conseils

Ce qui suit est un exemple complet de cluster:

%% generate sample data
K = 3;
numObservarations = 100;
dimensions = 3;
data = rand([numObservarations dimensions]);

%% cluster
opts = statset('MaxIter', 500, 'Display', 'iter');
[clustIDX, clusters, interClustSum, Dist] = kmeans(data, K, 'options',opts, ...
    'distance','sqEuclidean', 'EmptyAction','singleton', 'replicates',3);

%% plot data+clusters
figure, hold on
scatter3(data(:,1),data(:,2),data(:,3), 50, clustIDX, 'filled')
scatter3(clusters(:,1),clusters(:,2),clusters(:,3), 200, (1:K)', 'filled')
hold off, xlabel('x'), ylabel('y'), zlabel('z')

%% plot clusters quality
figure
[silh,h] = silhouette(data, clustIDX);
avrgScore = mean(silh);


%% Assign data to clusters
% calculate distance (squared) of all instances to each cluster centroid
D = zeros(numObservarations, K);     % init distances
for k=1:K
    %d = sum((x-y).^2).^0.5
    D(:,k) = sum( ((data - repmat(clusters(k,:),numObservarations,1)).^2), 2);
end

% find  for all instances the cluster closet to it
[minDists, clusterIndices] = min(D, [], 2);

% compare it with what you expect it to be
sum(clusterIndices == clustIDX)

Je ne sais pas si je reçois votre sens droit, mais si vous voulez savoir quels grappe vos points appartenais vous pouvez utiliser facilement la fonction KnnSearch. Il a deux arguments et la recherche dans le premier argument pour le premier d'entre eux qui est le plus proche de deux arguments.

En supposant que vous utilisez distance au carré de métrique euclidienne, essayez ceci:

for i = 1:size(ctrs,2)
d(:,i) = sum((B-ctrs(repmat(i,size(B,1),1),:)).^2,2);
end
[distances,predicted] = min(d,[],2)

prédit devrait alors contenir l'indice des plus proches barycentre, et les distances doivent contenir les distances le plus proche barycentre.

Jetez un oeil à l'intérieur de la fonction kmeans, à la sous-fonction « distfun ». Cela vous montre comment faire ci-dessus, et contient également les équivalents pour d'autres mesures de distance.

pour petite quantité de données, vous pouvez faire

[testpointID,dum] = find(permute(all(bsxfun(@eq,B,permute(ctrs,[3,2,1])),2),[3,1,2]))

mais cela est un peu obscur; la bsxfun avec les CTR permutés crée un 49 x 10 x 19 matrice de booléens, qui est alors « tout-ed » autre côté de la seconde dimension, permutées avant et les ID de ligne se trouvent. encore une fois, probablement pas pratique pour de grandes quantités de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top