Conceitos de IA em Python

Similaridade de cosseno e agrupamento k-means em Python

O aprendizado não supervisionado encontra estrutura em dados sem rótulos. A similaridade de cosseno mede o quanto dois vetores se parecem, e o k-means agrupa pontos em clusters em torno de centros que ele aprende.

O conceito em palavras simples

O aprendizado não supervisionado encontra estrutura em dados sem rótulos. A similaridade de cosseno mede o quanto dois vetores se parecem, e o k-means agrupa pontos em clusters em torno de centros que ele aprende.

Meça o quanto dois vetores se parecem com a similaridade de cosseno e agrupe dados sem rótulo com k-means.

Ideias principais

  • A similaridade de cosseno ignora o comprimento e compara só a direção, o que combina com textos e embeddings.
  • O k-means precisa saber de antemão o número de clusters k.
  • Os centros iniciais podem mudar o resultado, por isso o k-means costuma ser executado várias vezes.
  • Os clusters vêm só dos dados; não são necessários rótulos.

Quando usar?

  • Entender o que acontece dentro das redes neurais e das bibliotecas de IA.
  • Aprender a ideia antes de implementá-la nos desafios correspondentes.
  • Se preparar para cursos de aprendizado de máquina, entrevistas e projetos.

Veja na prática

Clique em Passo para alternar as duas etapas do k-means, ou em Executar para repeti-las até nada mudar. Gire os vetores à direita para mudar a similaridade de cosseno.

Código de exemplo

Executar código →
main.py
import math

# Cosine similarity compares directions: 1 = same direction, 0 = unrelated.
def cosine(a, b):
    dot = sum(x * y for x, y in zip(a, b))
    return dot / (math.sqrt(sum(x * x for x in a)) * math.sqrt(sum(y * y for y in b)))

print("cos(doc1, doc2):", round(cosine([1, 2, 0], [2, 4, 0]), 3))
print("cos(doc1, doc3):", round(cosine([1, 2, 0], [0, 0, 3]), 3))

# k-means: assign points to the nearest centre, then move each centre to its points' mean.
points = [1, 2, 3, 10, 11, 12]
centres = [1.0, 2.0]
for step in range(1, 4):
    groups = [[], []]
    for p in points:
        nearest = min(range(len(centres)), key=lambda i: abs(p - centres[i]))
        groups[nearest].append(p)
    centres = [sum(g) / len(g) for g in groups]
    print(f"step {step}: centres={[round(c, 2) for c in centres]} groups={groups}")

Saída esperada

cos(doc1, doc2): 1.0
cos(doc1, doc3): 0.0
step 1: centres=[1.0, 7.6] groups=[[1], [2, 3, 10, 11, 12]]
step 2: centres=[2.0, 11.0] groups=[[1, 2, 3], [10, 11, 12]]
step 3: centres=[2.0, 11.0] groups=[[1, 2, 3], [10, 11, 12]]

Como funciona

cosine() divide o produto escalar pelos comprimentos dos dois vetores, por isso doc2 (mesma direção de doc1) tira 1 e doc3 (sem palavras em comum) tira 0. O k-means repete dois passos, atribuir cada ponto ao centro mais próximo e mover cada centro para a média de seus pontos. Nada muda depois do passo 2, então ele convergiu.

Altere os valores e execute o programa no compilador Python online CodeUtility sem instalar Python.

Exercícios práticos

Altere as entradas e teste casos de borda antes de usar conjuntos de dados maiores.

  1. Mude as entradas ou os pesos e preveja a saída antes de executar.
  2. Imprima os valores intermediários para acompanhar cada passo do cálculo.
  3. Resolva os desafios indicados abaixo para implementar a ideia você mesmo.
Executar no IDE Python →

Pratique com um desafio

Use o conteúdo desta lição para resolver um problema real. Cada desafio roda no navegador, com testes instantâneos e uma revisão por IA.

Todos os desafios