Menu
CoddyTech

O método do cotovelo

Parte da seção Aprendizado não supervisionado do Journey de Machine Learning da Coddy. Lição 7 de 51.

Represente graficamente a inércia em função de k. Enquanto cada novo centro divide um grupo real, a inércia despenca; depois, ela se estabiliza. A curva, o cotovelo, indica um bom valor de k:

Duas curvas de inércia para k from 1 to 8. À esquerda, as maçãs: uma queda acentuada até k = 3, depois quase plana, com uma linha tracejada em 3. À direita, pontos sem grupos: uma curva suave sem cotovelo

Uma regra prática: pare quando mais um centro reduzir a inércia em menos de um quarto. As reduções das maçãs: 56%, depois 69% e, então, apenas 15%. Portanto, k = 3:

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

Uma curva suave sem nenhuma dobra significa que não há grupos claros. A próxima lição traz um segundo avaliador.

challenge icon

Desafio

Fácil

Um aplicativo de plantas organiza plantas domésticas em planos de cuidado de acordo com a necessidade de luz e água. O código inicial contém as inércias para k from 1 to 8, um gráfico e cutoff.

  1. Começando em k = 1 e avançando, pare quando o próximo k reduzir a inércia em menos de cutoff. Imprima esse k.
  2. Faça um gráfico da inércia em função de k com pontos, uma linha vertical tracejada no seu k e exiba o gráfico.

Para outro aplicativo, cutoff 0.25:

Care plans: 3

Uma curva de inércia intitulada Elbow: Care Plans para k from 1 to 8, com um ponto em cada k: uma queda acentuada até k = 3, depois quase plana, e uma linha vertical tracejada em 3

Em seguida, Coddy descreve seu gráfico.

Experimente você mesmo

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

# Não altere as linhas abaixo
rng = np.random.default_rng(17)
# Quatro tipos de planta: necessidade típica de luz e água e quantidade 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, uma por linha: necessidade de luz e água, com notas de 1 a 10
plants = np.clip(np.round(np.concatenate(parts), 1), 1, 10)

# Inércia 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")

# Escreva seu código abaixo
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Aprendizado não supervisionado

Pratique por conta própria: Compilador de Python online