K-Means Clustering ( Wikipedia )
Die Aufgabe hier ist ziemlich einfach: Führen Sie eine einzelne Iteration eines k-Mittelwert-Clustering-Algorithmus auf einer binären Matrix durch. Dies ist im Wesentlichen die Setup-Aufgabe für den Haupt-k-means-Algorithmus. Ich war der Meinung, dass das Setup einfacher sein und Golfsprachen dazu verleiten könnte, es auch zu versuchen. Die an Sie übergebene Matrix hat das folgende Format:
0 0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0 0
0 0 0 0 0 1 0 0 1
0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
0 1 0 0 0 1 0 0 0
0 1 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0
1 steht für einen Punkt, während 0 für einen Mangel an Punkten steht. Ihre Aufgabe wird es sein, zufällig k-1
Zentroide zu generieren und das anfängliche Clustering der Daten um die von Ihnen generierten Zentroide durchzuführen. k
ist definiert als min(grid#Width, grid#Height)-1
. Die Kennzeichnung jedes Schwerpunkts sollte von 2
bis gehen k
. In diesen Szenarien können Sie beispielsweise die folgenden Schwerpunkte generieren:
Centroid 2 was generated at: (1.0, 4.0)
Centroid 3 was generated at: (1.0, 5.0)
Centroid 4 was generated at: (5.0, 1.0)
Centroid 5 was generated at: (3.0, 3.0)
Centroid 6 was generated at: (0.0, 2.0)
Centroid 7 was generated at: (6.0, 6.0)
Centroid 8 was generated at: (2.0, 6.0)
Nachdem Sie die Zentroide generiert haben, müssen Sie jeden Punkt, der mit a markiert ist, durchlaufen 1
, da wir die mit einem 0
Leerzeichen markierten Punkte behandeln können. Für jeden Schwerpunkt müssen Sie entscheiden, welcher Schwerpunkt dem betreffenden Punkt am nächsten kommt. Hier sind die Entfernungen für das Beispiel:
(0,8) distance from centroid 2 is 4.123105625617661
(0,8) distance from centroid 3 is 3.1622776601683795
(0,8) distance from centroid 4 is 8.602325267042627
(0,8) distance from centroid 5 is 5.830951894845301
(0,8) distance from centroid 6 is 6.0
(0,8) distance from centroid 7 is 6.324555320336759
(0,8) distance from centroid 8 is 2.8284271247461903
(1,1) distance from centroid 2 is 3.0
(1,1) distance from centroid 3 is 4.0
(1,1) distance from centroid 4 is 4.0
(1,1) distance from centroid 5 is 2.8284271247461903
(1,1) distance from centroid 6 is 1.4142135623730951
(1,1) distance from centroid 7 is 7.0710678118654755
(1,1) distance from centroid 8 is 5.0990195135927845
(2,8) distance from centroid 2 is 4.123105625617661
(2,8) distance from centroid 3 is 3.1622776601683795
(2,8) distance from centroid 4 is 7.615773105863909
(2,8) distance from centroid 5 is 5.0990195135927845
(2,8) distance from centroid 6 is 6.324555320336759
(2,8) distance from centroid 7 is 4.47213595499958
(2,8) distance from centroid 8 is 2.0
(3,2) distance from centroid 2 is 2.8284271247461903
(3,2) distance from centroid 3 is 3.605551275463989
(3,2) distance from centroid 4 is 2.23606797749979
(3,2) distance from centroid 5 is 1.0
(3,2) distance from centroid 6 is 3.0
(3,2) distance from centroid 7 is 5.0
(3,2) distance from centroid 8 is 4.123105625617661
(4,5) distance from centroid 2 is 3.1622776601683795
(4,5) distance from centroid 3 is 3.0
(4,5) distance from centroid 4 is 4.123105625617661
(4,5) distance from centroid 5 is 2.23606797749979
(4,5) distance from centroid 6 is 5.0
(4,5) distance from centroid 7 is 2.23606797749979
(4,5) distance from centroid 8 is 2.23606797749979
(4,8) distance from centroid 2 is 5.0
(4,8) distance from centroid 3 is 4.242640687119285
(4,8) distance from centroid 4 is 7.0710678118654755
(4,8) distance from centroid 5 is 5.0990195135927845
(4,8) distance from centroid 6 is 7.211102550927978
(4,8) distance from centroid 7 is 2.8284271247461903
(4,8) distance from centroid 8 is 2.8284271247461903
(6,1) distance from centroid 2 is 5.830951894845301
(6,1) distance from centroid 3 is 6.4031242374328485
(6,1) distance from centroid 4 is 1.0
(6,1) distance from centroid 5 is 3.605551275463989
(6,1) distance from centroid 6 is 6.082762530298219
(6,1) distance from centroid 7 is 5.0
(6,1) distance from centroid 8 is 6.4031242374328485
(7,1) distance from centroid 2 is 6.708203932499369
(7,1) distance from centroid 3 is 7.211102550927978
(7,1) distance from centroid 4 is 2.0
(7,1) distance from centroid 5 is 4.47213595499958
(7,1) distance from centroid 6 is 7.0710678118654755
(7,1) distance from centroid 7 is 5.0990195135927845
(7,1) distance from centroid 8 is 7.0710678118654755
(7,5) distance from centroid 2 is 6.082762530298219
(7,5) distance from centroid 3 is 6.0
(7,5) distance from centroid 4 is 4.47213595499958
(7,5) distance from centroid 5 is 4.47213595499958
(7,5) distance from centroid 6 is 7.615773105863909
(7,5) distance from centroid 7 is 1.4142135623730951
(7,5) distance from centroid 8 is 5.0990195135927845
(8,1) distance from centroid 2 is 7.615773105863909
(8,1) distance from centroid 3 is 8.06225774829855
(8,1) distance from centroid 4 is 3.0
(8,1) distance from centroid 5 is 5.385164807134504
(8,1) distance from centroid 6 is 8.06225774829855
(8,1) distance from centroid 7 is 5.385164807134504
(8,1) distance from centroid 8 is 7.810249675906654
(8,8) distance from centroid 2 is 8.06225774829855
(8,8) distance from centroid 3 is 7.615773105863909
(8,8) distance from centroid 4 is 7.615773105863909
(8,8) distance from centroid 5 is 7.0710678118654755
(8,8) distance from centroid 6 is 10.0
(8,8) distance from centroid 7 is 2.8284271247461903
(8,8) distance from centroid 8 is 6.324555320336759
Das Endergebnis des Clustering-Algorithmus ist, dass in der Matrix keine Einsen mehr vorhanden sein sollten, sondern nur Schwerpunktzahlen. Aus diesem Grund war es wichtig, die Zentroide zu kennzeichnen 2-k+1
, damit wir sie wie folgt ersetzen können:
0 0 0 0 0 0 0 0 8
0 6 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 8
0 0 5 0 0 0 0 0 0
0 0 0 0 0 5 0 0 7
0 0 0 0 0 0 0 0 0
0 4 0 0 0 0 0 0 0
0 4 0 0 0 7 0 0 0
0 4 0 0 0 0 0 0 7
0 0 0 0 0 0 0 0 0
Dies ist das anfängliche Clustering-Layout für 7 Schwerpunkte auf dem bereitgestellten Raster bei zufällig generierten Schwerpunkten. Ihre Aufgabe ist es, die Cluster-Version des Binäreingabegitters auszugeben.
Regeln
- Die
k-1
Zentroide müssen zufällig generiert werden und sollten irgendwo von(0,0)
bis sein(grid#Width, grid#Height)
.- Der Wert von
k
istmin(grid#Width, grid#Height)-1
. - Die erzeugten Zentroide MÜSSEN von
2
bis nummeriert seink
.
- Der Wert von
- Das Eingabeformat MUSS ein Raster aus Nullen und Einsen sein, wobei Nullen Leerzeichen und Einsen Punkte darstellen.
- Ein Gitter ist entweder eine Zeichenfolge mit 1 Zeichen pro Zelle und
\n
als Zeilenbegrenzer oder ein 2D-Array. - Es ist nicht garantiert, dass das übergebene Gitter quadratisch ist, aber es ist garantiert nicht leer.
- Ein Gitter ist entweder eine Zeichenfolge mit 1 Zeichen pro Zelle und
- Die endgültige Ausgabe kann entweder Arrays oder eine begrenzte Zeichenfolge verwenden.
- Der kürzeste Code gewinnt, das ist Code-Golf .
quelle
Antworten:
Mathematica 109 Bytes
Wenn ich die Frage richtig verstehe, sollte so etwas funktionieren. "KMeans" ist eine der integrierten Methoden für FindClusters und ClusteringComponents.
Verwendung:
%@in//MatrixForm
Um eine Visualisierung zu erhalten,in
handelt es sich um ein ganzzahliges Array.quelle