Concetti di IA in Python

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

Esegui codice →
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}")

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.

  1. Cambia gli input o i pesi e prevedi l'output prima di eseguire.
  2. Stampa i valori intermedi per seguire ogni passo del calcolo.
  3. Risolvi le sfide collegate qui sotto per implementare l'idea da solo.
Esegui nell’IDE Python →

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.

Tutte le sfide