np_kmeans.py en Python
Agrupar puntos 2-D con el k-means de Lloyd en NumPy.
"""Agrupa puntos 2-D con unas rondas del algoritmo de Lloyd."""
import numpy as np
def kmedias(puntos, k, iteraciones=10, semilla=0):
rng = np.random.default_rng(semilla)
centros = puntos[rng.choice(len(puntos), size=k, replace=False)]
etiquetas = np.zeros(len(puntos), dtype=int)
for _ in range(iteraciones):
distancias = np.linalg.norm(
puntos[:, np.newaxis] - centros[np.newaxis, :], axis=2)
etiquetas = distancias.argmin(axis=1)
for c in range(k):
miembros = puntos[etiquetas == c]
if len(miembros):
centros[c] = miembros.mean(axis=0)
return centros, etiquetas
def principal():
rng = np.random.default_rng(1)
nube_a = rng.normal(loc=[0, 0], scale=0.5, size=(50, 2))
nube_b = rng.normal(loc=[5, 5], scale=0.5, size=(50, 2))
puntos = np.vstack([nube_a, nube_b])
centros, etiquetas = kmedias(puntos, k=2)
for c, centro in enumerate(centros):
size = int((etiquetas == c).sum())
print(f"grupo {c}: {size} puntos cerca de {centro.round(2)}")
if __name__ == "__main__":
principal()
Cómo funciona
- El broadcasting calcula cada distancia punto-centro.
argminasigna cada punto a su centro más cercano.- Los centros se mueven a la media de sus miembros en cada ronda.
Palabras clave y builtins usados aquí
asdefenumerateforifintlenprintrangereturn
El intento, en números
- Líneas
- 32
- Caracteres a escribir
- 984
- Tokens
- 303
- Ritmo de tres estrellas
- 115 tpm
Al ritmo de tres estrellas de 115 tokens por minuto, este intento toma unos 158 segundos.
Paso 1 de 1 en Bis; paso 22 de 22 en NumPy.