Menu
CoddyTech

Quando o K-Means falha

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

O k-means representa cada cluster como uma mancha redonda ao redor de seu centro. Os dardos formam um alvo com um anel ao redor, e o k-means os divide ao meio:

Dois gráficos de 140 dardos. À esquerda, a verdade: um grupo compacto em forma de alvo dentro de um anel amplo. À direita, k-means com k = 2: uma linha reta tracejada divide o alvo, o anel e o centro do alvo em uma metade esquerda e uma metade direita, cada uma com uma cruz central

Cada ponto se junta ao centro mais próximo, então a fronteira entre dois agrupamentos é uma linha reta no meio do caminho entre os centros. Nenhuma linha reta separa um anel de seu centro.

Grupos longos, curvos ou muito irregulares comprometem o k-means da mesma forma. Ele ainda retorna clusters, então sempre observe a imagem.

challenge icon

Desafio

Médio

Um drone avistou 200 focas em dois bancos de areia curvos. O código inicial mostra a verdade no painel left.

  1. Agrupe as focas com k-means, k = 2.
  2. No painel right, faça um gráfico de dispersão para cada agrupamento, identificado como cluster 0 ou cluster 1.
  3. Marque os centros com marcadores pretos "X", identificados como centers. Adicione uma legenda e, em seguida, mostre o gráfico.

O Coddy descreve seu gráfico e conta quantas focas ficaram com seu próprio banco de areia. Assim, para dois grupos:

Dois gráficos. À esquerda, a verdade: um grupo grande e disperso e um grupo pequeno e compacto à sua direita. À direita, k-means com k = 2: o agrupamento do grupo pequeno também inclui a borda direita do grupo grande, e cruzes pretas marcam os dois centros

Experimente você mesmo

import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import KMeans

# 200 focas descansando em dois bancos de areia curvos, vistas por um drone (posições em 100 m)
X, sandbar = make_moons(n_samples=200, noise=0.07, random_state=4)


# Desenha os bancos de areia reais em ax
def draw_truth(ax):
    ax.scatter(X[sandbar == 0, 0], X[sandbar == 0, 1], s=12, label="north bar")
    ax.scatter(X[sandbar == 1, 0], X[sandbar == 1, 1], s=12, label="south bar")
    ax.set_title("The truth")
    ax.legend()


fig, (left, right) = plt.subplots(1, 2, figsize=(9, 4))
draw_truth(left)
right.set_title("K-means, k = 2")

# 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