K-means est un algorithme de clustering non supervisé standard qui, étant donné un ensemble de "points" et un certain nombre de clusters K, attribuera chaque "point" à l'un des K clusters.
Pseudo-code de K-means
Notez qu'il existe de nombreuses variantes de K-means. Vous devez implémenter l'algorithme que je décris ci-dessous. Vous pouvez avoir une certaine variation sur l'algorithme ou utiliser des intégrés tant que vous obtiendrez le même résultat que cet algorithme étant donné les mêmes points initiaux.
Dans ce défi, toutes les entrées seront des points sur le plan 2D (chaque point est représenté par ses coordonnées en x et 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
Entrées et sorties
- Vous pouvez faire passer K et P
STDIN
, ou comme argument de fonction, etc. - P et les points de P peuvent être représentés en utilisant n'importe quelle structure naturelle pour les ensembles / listes dans la langue de votre choix.
- K est un entier strictement positif.
- Vous pouvez supposer que les entrées sont valides.
- Il y aura toujours au moins K points en P.
- Vous pouvez sortir les clusters vers
STDOUT
, les renvoyer d'une fonction, etc. - L'ordre des clusters et l'ordre à l'intérieur des clusters sont sans importance. -Vous pouvez soit renvoyer des groupes de points pour représenter des grappes, soit chaque point étiqueté avec un identifiant pour la grappe (par exemple un entier).
Cas de test
Étant donné que les clusters résultants dépendent des points initialement choisis, vous n'obtiendrez peut-être pas tous les mêmes résultats (ou le même résultat à chaque fois que vous exécutez votre code).
Par conséquent, prenez uniquement la sortie comme exemple de sortie.
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]]]
Notation
Il s'agit de code-golf , donc la réponse la plus courte en octets l'emporte.
1
, tous les points du second ont une étiquette, 2
etc.)
K=2, P = [[1,1], [1,1], [1,1]]
.