So berechnen Sie Entfernungen zwischen Zentroiden und Datenmatrix (für Kmeans-Algorithmus)

8

Ich bin ein Student der Clusterbildung und R. Um einen besseren Halt beider zu erreichen möchte ich um den Abstand zwischen den Zentroiden und meiner xy-Matrix für jede Iteration zu berechnen, bis sie "konvergiert". Wie löse ich für Schritt 2 und 3 mit R?

%Vor%

Hier ist was ich tun möchte:

  1. I0 & lt; - t (rdist (df, df1)) # nach Nulliteration
  2. Clusterobjekte basierend auf Mindestabstand
  3. Bestimmen der Zentroide basierend auf dem Clusterdurchschnitt
  4. Wiederholung mit I1

Ich habe die kmeans-Funktion ausprobiert. Aber aus irgendwelchen Gründen erzeugt es solche Zentroide, die am Ende kommen müssen. Das ist der Anfang von:

%Vor%

Kmeans erlaubt mir nicht, die Bewegung der Zentroide zu verfolgen. Daher würde ich es gerne "manuell" machen, indem ich Schritt 2 & amp; 3 mit R.

    
Mamba 22.11.2014, 20:49
quelle

1 Antwort

14

Ihre Hauptfrage scheint zu sein, wie man Entfernungen zwischen einer Datenmatrix und einer Reihe von Punkten ("Zentren") berechnet.

Dazu können Sie eine Funktion schreiben, die eine Datenmatrix und Ihre Punktmenge als Eingabe verwendet und für jede Zeile (Punkt) in der Datenmatrix Abstände zu allen "Zentren" zurückgibt.

Hier ist eine solche Funktion:

%Vor%

points1 ist die Datenmatrix mit Punkten als Zeilen und Dimensionen als Spalten. points2 ist die Matrix der Zentren (zeigt wieder als Zeilen). Die erste Codezeile definiert nur die Antwortmatrix (die so viele Zeilen enthält, wie Zeilen in der Datenmatrix vorhanden sind und so viele Spalten wie es Zentren gibt). Also ist der Punkt i,j in der Ergebnismatrix der Abstand vom ith Punkt zum jth Zentrum.

Dann iteriert die for-Schleife über alle Zentren. Für jedes Zentrum berechnet es den euklidischen Abstand von jedem Punkt zum aktuellen Zentrum und gibt das Ergebnis zurück. Diese Zeile hier: sqrt(rowSums(t(t(points1)-points2[i,])^2)) ist euklidische Distanz. Überprüfen Sie es näher und schauen Sie die Formel nach, wenn Sie irgendwelche Probleme damit haben. (Die Transponierungen werden hauptsächlich ausgeführt, um sicherzustellen, dass die Subtraktion in Reihen erfolgt).

Jetzt können Sie auch den k-means-Algorithmus implementieren:

%Vor%

Wie Sie sehen können, ist es auch eine sehr einfache Funktion - es braucht Datenmatrix, Zentren, Ihre Abstandsfunktion (die oben definierte) und die Anzahl der gewünschten Iterationen.

Die Cluster werden definiert, indem jedem Punkt der nächstgelegene Mittelpunkt zugewiesen wird. Und Zentren werden aktualisiert als ein Mittel der Punkte, die diesem Zentrum zugewiesen sind. Welches ist ein grundlegender K-Means-Algorithmus).

Lass es uns ausprobieren. Definieren Sie einige zufällige Punkte (in 2d, also Anzahl der Spalten = 2)

%Vor%

Weisen Sie 5 zufälligen Punkten aus dieser Matrix als Anfangszentren zu:

%Vor%

Führen Sie nun den Algorithmus aus:

%Vor%

Hier sind die Zentren in der 10. Iteration:

%Vor%

Vergleichen Sie das mit der implementierten Funktion kmeans :

%Vor%

Funktioniert gut. Unsere Funktion verfolgt jedoch die Iterationen. Wir können den Fortschritt über die ersten 4 Iterationen folgendermaßen darstellen:

%Vor%

Nett.

Allerdings erlaubt dieses einfache Design viel mehr. Wenn wir beispielsweise eine andere Art von Entfernung (nicht euklidisch) verwenden möchten, können wir einfach jede Funktion verwenden, die Daten und Zentren als Eingaben verwendet. Hier ist eine für Korrelationsabstände:

%Vor%

Und wir können dann Kmeans basierend auf diesen machen:

%Vor%

Das resultierende Bild für 4 Iterationen sieht dann so aus:

Sogar du hast 5 Cluster angegeben - am Ende waren noch 2 übrig. Dies liegt daran, dass die Korrelation für zwei Dimensionen Werte annehmen kann - entweder +1 oder -1. Dann, wenn nach den Clustern gesucht wird, wird jeder Punkt einem Zentrum zugewiesen, auch wenn er den gleichen Abstand zu mehreren Zentren hat - der erste wird ausgewählt.

Wie auch immer, das geht jetzt aus dem Rahmen. Die Quintessenz ist, dass es viele mögliche Entfernungsmetriken gibt und eine einfache Funktion erlaubt Ihnen, jede beliebige Entfernung zu verwenden und die Ergebnisse über Iterationen zu verfolgen.

    
Karolis Koncevičius 23.11.2014, 11:38
quelle

Tags und Links