K-means é um algoritmo de clustering não supervisionado padrão que, dado um conjunto de "pontos" e um número de clusters K, atribuirá cada "ponto" a um dos K clusters.
Pseudo-código de K-significa
Observe que existem muitas variantes de médias K. Você precisa implementar o algoritmo que estou descrevendo abaixo. Você pode ter alguma variação no algoritmo ou usar built-ins desde que obtenha o mesmo resultado que esse algoritmo, considerando os mesmos pontos iniciais.
Neste desafio, todas as entradas serão pontos no plano 2D (cada ponto é representado por suas coordenadas em 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 e saídas
- Você pode passar K e P através
STDIN
ou como argumento de função, etc. - P e os pontos em P podem ser representados usando qualquer estrutura natural para conjuntos / listas no seu idioma de escolha.
- K é um número inteiro estritamente positivo.
- Você pode assumir que as entradas são válidas.
- Sempre haverá pelo menos K pontos em P.
- Você pode enviar os clusters
STDOUT
, retorná-los de uma função etc. - A ordem dos clusters e a ordem dentro dos clusters não é importante. -Você pode retornar grupos de pontos para representar clusters ou cada ponto rotulado com um identificador para o cluster (por exemplo, um número inteiro).
Casos de teste
Como os clusters resultantes dependem de quais pontos foram escolhidos inicialmente, nem todos poderão obter os mesmos resultados (ou o mesmo resultado sempre que executar seu código).
Portanto, tome apenas a saída como exemplo de saída.
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]]]
Pontuação
Isso é código-golfe , então a resposta mais curta em bytes vence.
1
, todos os pontos do segundo uma etiqueta tem 2
etc)
K=2, P = [[1,1], [1,1], [1,1]]
.