2016-01-15 3 views
5

übereinstimmen Ich habe eine Funktion geschrieben, um Trainingsbeispiele zu ihren nächsten Zentroiden als Teil eines K-Means-Clustering-Algorithmus zuweisen. Es scheint mir, dass die Dimensionen erfüllt sind und der Code manchmal richtig läuft. Aber häufig, erhalte ich die Fehlerwie die Anzahl der Elemente der Matrix in find Funktion Matlab

In einer Zuweisung A (:) = B, muss die Anzahl der Elemente in A und B gleich sein.

für die Linie

idx(i) = find(dist == value); 

Hier ist der Code

function idx = findClosestCentroids(X, centroids) 

K = size(centroids, 1); 
idx = zeros(size(X,1), 1); 
dist = zeros(K, 1); 

for i = 1:size(X,1) 
    for j = 1:K 
     dist(j) = sum((X(i,:) - centroids(j,:)).^2); 
    end 
    value = min(dist); 
    idx(i) = find(dist == value); 
end 

Was ist das Problem hier?

+2

rayryeng richtig beantwortet hat, aber Sie könnten daran interessiert sein, einen vektorisierten Ansatz zu versuchen '[~, idx] = min (Summe (bsxfun (@minus, X, Permut (Zentroide, [3,2,1])).^2,2), [] , 3) ', mit dem Sie alle Schleifen, die Vorbelegung und temporäre Matrizen überspringen und sogar in einer einzigen Zeile verdichten können. – Dan

+0

@Dan Gute Idee:) ... es war spät in der Nacht und ich hatte keine Zeit, die vektorisierte Lösung aufzuschreiben. Das ist ein guter Kommentar. – rayryeng

Antwort

4

Dies liegt daran, dass Sie potenziell mehr als einen Cluster finden, die die gleiche Entfernung zu einem Abfragepunkt teilen. find bestimmt alle Werte, die die boolesche Bedingung als Argument erfüllen. idx(i) bedeutet, dass Sie einen einzigen Wert der Position des idx Array zuweisen, aber find kann mehr als einen Wert ergeben und das gibt den Zuordnungsfehler, den Sie sehen.

Anstatt das zweite Ausgabeargument des min verwenden, die den Index von ersten Mal bestimmt der kleinste Wert auftritt, das ist genau das, was Sie erreichen wollen: Ihre Frage

function idx = findClosestCentroids(X, centroids) 

K = size(centroids, 1); 
idx = zeros(size(X,1), 1); 
dist = zeros(K, 1); 

for i = 1:size(X,1) 
    for j = 1:K 
     dist(j) = sum((X(i,:) - centroids(j,:)).^2); 
    end 
    [~,idx(i)] = min(dist); %// Change 
end 
Verwandte Themen