Menu
CoddyTech

Pontuações de silhueta

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

A inércia sempre melhora com k, então precisa de um cotovelo. A silueta faz a cada ponto uma pergunta mais justa: estou mais perto do meu próprio grupo do que do próximo?

Um ponto preto com linhas contínuas até os 8 pontos do seu próprio grupo, comprimento médio a = 1.3, e linhas tracejadas até os 8 pontos do outro grupo mais próximo, comprimento médio b = 3.4. Sua silhueta é 0.62

Um ponto recebe a pontuação (b - a) / max(a, b): perto de 1, bem ajustado ao seu grupo; perto de 0, na fronteira; abaixo de 0, no grupo errado. A média das pontuações avalia um agrupamento:

from sklearn.metrics import silhouette_score
for k in [2, 3, 4]:
    km = KMeans(n_clusters=k, n_init=10, random_state=0)
    km.fit(X)
    print(k, f"{silhouette_score(X, km.labels_):.3f}")

Para as maçãs, isso imprime:

2 0.534
3 0.657
4 0.545

Ele atinge o pico no melhor k, aqui 3, onde os pontos parecem estar mais à vontade.

challenge icon

Desafio

Fácil

Dois meteorologistas discordam sobre quantos tipos de tempestade atingem sua costa. O código inicial contém 150 tempestades, vento máximo e chuva, e lê o k de Ana e, depois, o de Ben.

  1. Avalie cada k pelo coeficiente de silhueta, com 3 casas decimais.
  2. Imprima qual k se ajusta melhor.
  3. Imprima o melhor k de 2 a 8, com sua pontuação.

Para outra costa:

Ana, k = 2: 0.512
Ben, k = 3: 0.574
Ben's k fits better
Best from 2 to 8: k = 3 (0.574)

Experimente você mesmo

import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# Não altere as linhas abaixo
rng = np.random.default_rng(6)
# Quatro tipos de tempestade: vento e chuva típicos e quantas há de cada tipo
kinds = [(30, 8, 40), (12, 34, 35), (21, 21, 30), (11, 9, 45)]
parts = []
for w, r, n in kinds:
    parts.append(np.column_stack([rng.normal(w, 2.5, n), rng.normal(r, 3, n)]))
# 150 tempestades em uma região costeira, uma por linha: velocidade máxima do vento (m/s) e chuva (mm por hora)
storms = np.round(np.concatenate(parts), 1)

# Os números de tipos de tempestade previstos pelos dois meteorologistas
k_ana = int(input())
k_ben = 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