K-Means Clustered Golf

8

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-1Zentroide zu generieren und das anfängliche Clustering der Daten um die von Ihnen generierten Zentroide durchzuführen. kist definiert als min(grid#Width, grid#Height)-1. Die Kennzeichnung jedes Schwerpunkts sollte von 2bis 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 0Leerzeichen 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-1Zentroide müssen zufällig generiert werden und sollten irgendwo von (0,0)bis sein (grid#Width, grid#Height).
    • Der Wert von kist min(grid#Width, grid#Height)-1.
    • Die erzeugten Zentroide MÜSSEN von 2bis nummeriert sein k.
  • 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.
  • Die endgültige Ausgabe kann entweder Arrays oder eine begrenzte Zeichenfolge verwenden.
  • Der kürzeste Code gewinnt, das ist .
Magische Krakenurne
quelle
1
Verwandte .
Meilen

Antworten:

1

Mathematica 109 Bytes

Wenn ich die Frage richtig verstehe, sollte so etwas funktionieren. "KMeans" ist eine der integrierten Methoden für FindClusters und ClusteringComponents.

SparseArray[Thread[(p=Position[#,1])->1+ClusteringComponents[p,Min[d=Dimensions@#]-1,1,Method->"KMeans"]],d]&

Verwendung: %@in//MatrixFormUm eine Visualisierung zu erhalten, inhandelt es sich um ein ganzzahliges Array.

Kelly Lowder
quelle