Menu
CoddyTech

El método del codo

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

Representa gráficamente la inercia frente a k. Mientras cada nuevo centro divide un grupo real, la inercia se desploma; después se aplana. El quiebre, el codo, es un buen valor de k:

Dos curvas de inercia para k from 1 to 8. A la izquierda, las manzanas: una caída pronunciada hasta k = 3, después casi plana, con una línea discontinua en 3. A la derecha, puntos sin grupos: una curva suave sin quiebre

Una regla práctica: detente cuando un centro más reduzca la inercia en menos de una cuarta parte. Las reducciones de las manzanas: 56%, después 69% y luego solo 15%. Así que k = 3:

ax.plot(ks, inertias, marker="o")
ax.axvline(3, linestyle="--")

Una curva suave sin curvatura no muestra grupos claros. La siguiente lección introduce a un segundo juez.

challenge icon

Desafío

Fácil

Una aplicación para plantas organiza las plantas de interior en planes de cuidado según sus necesidades de luz y agua. El código inicial contiene las inercias de k from 1 to 8, un gráfico y cutoff.

  1. Empezando desde k = 1, detente cuando el siguiente valor de k reduzca la inercia en menos de cutoff. Imprime ese valor de k.
  2. Representa la inercia en función de k con puntos, una línea vertical discontinua en tu valor de k y muestra el gráfico.

Para otra aplicación, cutoff 0.25:

Care plans: 3

Una curva de inercia titulada Elbow: Care Plans para k from 1 to 8, con un punto en cada valor de k: una caída pronunciada hasta k = 3, luego casi plana, y una línea vertical discontinua en 3

Después, Coddy describe tu gráfico.

Pruébalo tú mismo

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# No cambies las líneas de abajo
rng = np.random.default_rng(17)
# Cuatro tipos de plantas: necesidades habituales de luz y agua, y cuántas hay de cada tipo
kinds = [(8.5, 2, 35), (2.5, 7.5, 30), (5, 5, 30), (8, 8, 25)]
parts = []
for l, w, n in kinds:
    parts.append(np.column_stack([rng.normal(l, 0.8, n), rng.normal(w, 0.8, n)]))
# 120 plantas de interior, una por fila: necesidades de luz y agua, puntuadas del 1 al 10
plants = np.clip(np.round(np.concatenate(parts), 1), 1, 10)

# Inercia para k = 1 a 8, de Inertia
ks = list(range(1, 9))
inertias = []
for k in ks:
    km = KMeans(n_clusters=k, n_init=10, random_state=0)
    km.fit(plants)
    inertias.append(km.inertia_)

cutoff = float(input())
fig, ax = plt.subplots()
ax.set_title("Elbow: Care Plans")
ax.set_xlabel("k")
ax.set_ylabel("Inertia")

# 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