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:
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) # moverargmin(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.
Desafio
FácilUma 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.
- A cada rodada: atribua cada pessoa e, em seguida, mova cada centro.
- 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 peopleExperimente 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
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
1Encontrando Grupos
Aprendendo sem RótulosMedindo a SimilaridadeK-Means à MãoK-Means no scikit-learnRevisão: Frequentadores da Academia4Clustering Hierárquico
Mesclando passo a passoModelos aglomerativosDendrogramasRevisão: raças de cães7PCA na prática
Visualizando 64 dimensõesComponentes como padrõesComprimir e reconstruirPCA antes de um modeloRecapitulação: scanner facial10Projeto: Explorando os Dígitos
Observe os DígitosReduza com PCAAgrupe os DígitosDê Nome aos GruposEncontre os Diferentes2Escolhendo k
InérciaO método do cotoveloPontuações de silhuetaEscale antes de agruparRecapitulando: zonas de entregaPratique por conta própria: Compilador de Python online