Menu
CoddyTech

Inércia

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

Este capítulo trata de escolher k. Ao final, você vai escolhê-lo para as entregas de uma padaria e mapear as zonas:

Um mapa dos pontos de entrega de uma cidade, com o leste em km na horizontal e o norte em metros na vertical, dividido em três zonas com 45, 40 e 25 pontos, cada uma com uma estrela preta no centro

Primeiro, uma pontuação. Inércia soma a distância ao quadrado de cada ponto até seu próprio centro: é pequena quando os pontos ficam próximos de seus centros.

36 das maçãs em três grupos, cada uma ligada ao centro de estrela preta do seu grupo por um raio cinza fino. A inércia eleva ao quadrado o comprimento de cada raio e soma todos eles

O KMeans mantém isso em inertia_. Para as 180 maçãs:

for k in [1, 2, 3, 4]:
    km = KMeans(n_clusters=k, n_init=10, random_state=0)
    km.fit(X)
    print(k, round(km.inertia_))

Isso imprime:

1 1718
2 752
3 230
4 196

Mais centros, raios mais curtos: a inércia sempre diminui à medida que k aumenta. Com um centro por ponto, ela é 0; portanto, o menor valor não é o melhor.

challenge icon

Desafio

Fácil

Uma olaria embala vasos em caixas de alguns tamanhos. Cada vaso fica com o tamanho mais próximo; a inércia mede o quanto eles se encaixam mal. O programa lê budget, o maior desajuste que a olaria aceita.

  1. Teste k = 1, 2, 3 e assim por diante: ajuste o KMeans a vases e imprima a inércia de cada k, arredondada.
  2. Pare no primeiro k cuja inércia esteja dentro do orçamento e imprima-o.

Para outra olaria:

k = 1, inertia 15120
k = 2, inertia 4811
k = 3, inertia 1290
Box sizes needed: 3

Experimente você mesmo

import numpy as np
from sklearn.cluster import KMeans

# Não altere as linhas abaixo
rng = np.random.default_rng(8)
# Quatro tipos de vaso: altura e largura típicas em cm e quantidade de cada tipo
kinds = [(15, 8, 25), (38, 13, 25), (22, 22, 20), (58, 26, 10)]
parts = []
for h, w, n in kinds:
    parts.append(np.column_stack([rng.normal(h, 2.5, n), rng.normal(w, 2, n)]))
# 80 vasos, um por linha: altura e largura em cm
vases = np.round(np.concatenate(parts), 1)

# O desajuste máximo, medido pela inércia, que a olaria aceita
budget = int(input())

# 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