Menu
CoddyTech

K-Means à Mão

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

K-means repete uma rodada de duas etapas para encontrar k agrupamentos. Atribuição: cada ponto se junta ao centro mais próximo. Movimento: cada centro vai para a média de seus pontos. Três carrinhos de sorvete:

150 toalhas em uma praia, formando três grupos: à esquerda, no meio e à direita. Três carrinhos começam próximos uns dos outros, perto do meio; linhas pretas traçam o caminho de cada carrinho, rodada a rodada, até uma estrela no meio de seu próprio grupo

Uma rodada no NumPy, em que dists é uma tabela de distâncias com uma coluna por centro:

labels = dists.argmin(axis=1)  # atribuir
for c in range(k):
    centers[c] = X[labels == c].mean(axis=0)  # mover

argmin(axis=1) indica a coluna de menor valor de cada linha: seu centro mais próximo. Rodada após rodada, os centros se estabilizam; quando nenhum deles se move, o k-means está concluído.

challenge icon

Desafio

Fácil

Uma fabricante de camisetas ajusta os tamanhos S, M e L às medidas dos clientes de hoje. A tabela de tamanhos antiga define os centros iniciais, distances(people, centers) fornece a tabela de distâncias, e o programa lê quantas rodadas executar.

  1. A cada rodada: atribua cada pessoa e, em seguida, mova cada centro.
  2. Imprima o centro de cada tamanho e quantas pessoas ele recebeu na última rodada, como abaixo.

Para outra fabricante:

Rounds run: 2
S: chest 87.3 cm, length 65.1 cm, 14 people
M: chest 95.0 cm, length 68.9 cm, 31 people
L: chest 104.8 cm, length 72.6 cm, 45 people

Experimente você mesmo

import numpy as np

# Não altere as linhas abaixo
rng = np.random.default_rng(12)
chest = np.concatenate([rng.normal(88, 3, 30), rng.normal(98, 3.5, 35), rng.normal(110, 4, 25)])
length = np.concatenate([rng.normal(66, 1.8, 30), rng.normal(70, 2, 35), rng.normal(75, 2.2, 25)])
# 90 clientes, uma linha para cada um: medida do tórax e comprimento em cm
people = np.round(np.column_stack([chest, length]), 1)

# A tabela de tamanhos antiga define os centros iniciais: S, M, L
sizes = ["S", "M", "L"]
centers = np.array([[85.0, 64.0], [90.0, 67.0], [96.0, 69.0]])
rounds = int(input())


# Tabela de distâncias: uma linha por pessoa, uma coluna por centro
def distances(X, centers):
    table = np.zeros((len(X), len(centers)))
    for c in range(len(centers)):
        table[:, c] = np.sqrt(((X - centers[c]) ** 2).sum(axis=1))
    return table


# 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