K-means es un algoritmo de agrupamiento estándar no supervisado que, dado un conjunto de "puntos" y una cantidad de grupos K, asignará cada "punto" a uno de los K grupos.
Pseudocódigo de K-medias
Tenga en cuenta que hay muchas variantes de K-means. Tienes que implementar el algoritmo que describo a continuación. Es posible que tenga alguna variación en el algoritmo o use elementos integrados siempre que obtenga el mismo resultado que este algoritmo con los mismos puntos iniciales.
En este desafío, todas las entradas serán puntos en el plano 2D (cada punto está representado por sus coordenadas en x e y).
Inputs: K, the number of clusters
P, the set of points
Choose K points of P uniformly at random
Each chosen point is the initial centroid of its cluster
Loop:
For each point in P:
Assign to the cluster whose centroid is the nearest (Euclidean distance)
In case of a tie, any of the tied cluster can be chosen
Recompute the centroid of each cluster:
Its x coordinate is the average of all x's of the points in the cluster
Its y coordinate is the average of all y's of the points in the cluster
Until the clusters don't change from one iteration to the next
Output: the set of clusters
Entradas y salidas
- Puede tomar K y P
STDIN
, o como un argumento de función, etc. - P y los puntos en P pueden representarse utilizando cualquier estructura que sea natural para los conjuntos / listas en el idioma que elija.
- K es un entero estrictamente positivo.
- Puede suponer que las entradas son válidas.
- Siempre habrá al menos K puntos en P.
- Puede enviar los clústeres a
STDOUT
, devolverlos desde una función, etc. - El orden de los grupos y el orden dentro de los grupos no es importante. -Puede devolver grupos de puntos para representar grupos, o cada punto etiquetado con un identificador para el grupo (por ejemplo, un número entero).
Casos de prueba
Dado que los grupos resultantes dependen de los puntos elegidos inicialmente, es posible que no todos obtengan los mismos resultados (o el mismo resultado cada vez que ejecute su código).
Por lo tanto, solo tome la salida como salida de ejemplo.
Input:
K = 1
P = [[1,2.5]]
Output:
[[[1,2.5]]]
Input:
K = 3
P = [[4,8], [15,16], [23,42], [-13.37,-12.1], [666,-666]]
Output:
[[[666,-666]],[[-13.37,-12.1],[4,8]],[[15,16],[23,42]]]
Input:
K = 2
P = [[1,1], [1,1], [1,1]]
Output:
[[[1,1]],[[1,1],[1,1]]]
Puntuación
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
1
, todos los puntos del segundo tienen etiqueta, 2
etc.)
K=2, P = [[1,1], [1,1], [1,1]]
.