Menu
CoddyTech

Cuándo falla K-Means

Parte de la sección Aprendizaje no supervisado del Journey de Machine Learning de Coddy. Lección 14 de 51.

K-means representa cada clúster como una bola redonda alrededor de su centro. Los dardos forman una diana con un anillo alrededor, y k-means los divide por la mitad:

Dos gráficos de 140 dardos. A la izquierda, la realidad: un grupo compacto en el centro de la diana dentro de un anillo amplio. A la derecha, k-means con k = 2: un límite recto discontinuo divide la diana, el anillo y el centro en una mitad izquierda y una mitad derecha, cada una con una cruz central

Cada punto se une al centro más cercano, por lo que el límite entre dos grupos es una línea recta a mitad de camino entre los centros. Ninguna línea recta separa un anillo de su parte central.

Los grupos alargados, curvos o muy irregulares hacen que k-means falle de la misma manera. Aun así, devuelve clústeres, así que fíjate siempre en la imagen.

challenge icon

Desafío

Intermedio

Un dron detectó 200 focas en dos bancos de arena curvos. El código inicial muestra la realidad en el panel left.

  1. Agrupa las focas con k-means, k = 2.
  2. En el panel right, crea un gráfico de dispersión para cada grupo, etiquetado como cluster 0 o cluster 1.
  3. Marca los centros con marcadores negros "X" etiquetados como centers. Añade una leyenda y después muestra el gráfico.

Coddy describe tu gráfico y cuenta las focas que quedaron en su propio banco de arena. Como en este caso, con dos grupos:

Dos gráficos. Izquierda, la realidad: un grupo grande y disperso y un grupo pequeño y compacto a su derecha. Derecha, k-means con k = 2: el grupo del clúster pequeño también abarca el borde derecho del grupo grande, y unas cruces negras marcan los dos centros

Pruébalo tú mismo

import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import KMeans

# 200 focas descansando en dos bancos de arena curvos, vistas desde un dron (posiciones en 100 m)
X, sandbar = make_moons(n_samples=200, noise=0.07, random_state=4)


# Dibuja los bancos de arena reales en ax
def draw_truth(ax):
    ax.scatter(X[sandbar == 0, 0], X[sandbar == 0, 1], s=12, label="north bar")
    ax.scatter(X[sandbar == 1, 0], X[sandbar == 1, 1], s=12, label="south bar")
    ax.set_title("The truth")
    ax.legend()


fig, (left, right) = plt.subplots(1, 2, figsize=(9, 4))
draw_truth(left)
right.set_title("K-means, k = 2")

# Escribe tu código a continuación
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Aprendizaje no supervisado

Practica por tu cuenta: Compilador de Python online