Similarità del coseno e clustering k-means in Python
L'apprendimento non supervisionato trova una struttura nei dati senza etichette. La similarità del coseno misura quanto due vettori si somigliano, e k-means raggruppa i punti in cluster attorno a centri che impara da solo.
Il concetto in parole semplici
L'apprendimento non supervisionato trova una struttura nei dati senza etichette. La similarità del coseno misura quanto due vettori si somigliano, e k-means raggruppa i punti in cluster attorno a centri che impara da solo.
Misura quanto sono simili due vettori con la similarità del coseno e raggruppa dati senza etichette con k-means.
Idee chiave
- La similarità del coseno ignora la lunghezza e confronta solo la direzione, perfetta per testi ed embedding.
- k-means ha bisogno di sapere in anticipo il numero di cluster k.
- I centri iniziali possono cambiare il risultato, per questo k-means si esegue spesso più volte.
- I cluster emergono dai soli dati; non servono etichette.
Quando si usa?
- Capire cosa succede dentro le reti neurali e le librerie di IA.
- Imparare l'idea prima di implementarla nelle sfide corrispondenti.
- Prepararti a corsi di machine learning, colloqui e progetti.
Guardalo in azione
Premi Passo per alternare i due passi di k-means, oppure Avvia per ripeterli finché non cambia più nulla. Ruota i vettori a destra per cambiare la loro similarità del coseno.
Codice di esempio
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}")
Output previsto
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]]
Come funziona
cosine() divide il prodotto scalare per le lunghezze dei due vettori, quindi doc2 (stessa direzione di doc1) ottiene 1 e doc3 (nessuna parola in comune) ottiene 0. k-means ripete due passi, assegnare ogni punto al centro più vicino e spostare ogni centro sulla media dei suoi punti. Dopo il passo 2 non cambia più nulla, quindi è arrivato a convergenza.
Modifica i valori ed esegui il programma nel compilatore Python online CodeUtility senza installare Python.
Esercizi pratici
Modifica gli input e verifica i casi limite prima di usare dataset più grandi.
- Cambia gli input o i pesi e prevedi l'output prima di eseguire.
- Stampa i valori intermedi per seguire ogni passo del calcolo.
- Risolvi le sfide collegate qui sotto per implementare l'idea da solo.
Esercitati con una sfida
Usa ciò che questa lezione spiega per risolvere un problema reale. Ogni sfida gira nel browser, con test immediati e una revisione dell'IA.
- Similarità del coseno Misura quanto sono simili due vettori in base all'angolo tra loro, come fanno i motori di ricerca con gli embedding. Facile
- Clustering k-means Raggruppa i punti in k cluster assegnandoli ripetutamente al centroide più vicino e spostando i centroidi. Media