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
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.
- Mude as entradas ou os pesos e preveja a saída antes de executar.
- Imprima os valores intermediários para acompanhar cada passo do cálculo.
- Resolva os desafios indicados abaixo para implementar a ideia você mesmo.
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.
- Similaridade de cosseno Meça o quanto dois vetores são parecidos pelo ângulo entre eles, como os buscadores fazem com embeddings. Fácil
- Agrupamento k-means Agrupe pontos em k clusters atribuindo-os repetidamente ao centroide mais próximo e movendo os centroides. Médio