Frage

habe ich ein matrice von A (369x10), die ich in 19 Cluster gruppieren möchten. Ich benutze diese Methode

[idx ctrs]=kmeans(A,19)

, welche Ausbeuten idx (369x1) und ctrs (19x10)

ich den Punkt zu here.All meiner Zeilen in A aufstehen werden in 19 Clustern gebündelt.

Jetzt habe ich ein Array B (49x10) .Ich möchte wissen, wo die Zeilen dieses B entspricht in der unter gegebenen 19-Clustern.

Wie ist es möglich, in MATLAB

Vielen Dank im Voraus

War es hilfreich?

Lösung

Ich kann nicht denken Sie an einen besseren Weg, es zu tun, als was Sie beschrieben. Eine integrierte Funktion würde eine Zeile speichern, aber ich konnte nicht finden. Hier ist der Code, den ich benutzen würde:

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

Andere Tipps

Im Folgenden ist ein komplettes Beispiel für Clustering:

%% 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)

Ich weiß nicht, ob ich Ihre Bedeutung richtig zu machen, aber wenn Sie wissen wollen, welche Cluster Ihre Punkte, gehören Sie KnnSearch Funktion leicht nutzen können. Es hat zwei Argumente und wird zum ersten von ihnen in der ersten Argument suchen, die zwei am nächsten Argument.

Angenommen, Sie sind mit quadratischen euklidischen Distanzmetrik, versuchen Sie dies:

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)

vorhergesagt sollte dann den Index des nächsten Schwerpunkt enthalten, und Abstände sollten die Abstände zu den nächsten Schwerpunkt enthalten.

Werfen Sie einen Blick in der KMeans Funktion, bei der U-Funktion ‚distfun‘. Dies zeigt Ihnen, wie die oben genannten tun, und enthält auch die Mittel für andere Abstandsmetriken.

für kleine Datenmenge, könnten Sie tun,

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

, aber das ist etwas dunkel; die bsxfun mit dem permutierten CTRs erzeugt eine 49 x 10 x 19 Matrix von booleans, die dann ‚all-ED‘ in der zweiten Dimension, permutierte zurück und dann werden die Zeilenkennungen gefunden. wieder, wahrscheinlich nicht praktikabel für große Datenmengen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top