cos(θ) = (A · B) / (||A|| · ||B||). Iloczyn skalarny wektorów A i B dzielony przez iloczyn ich norm euklidesowych. Wynik w zakresie [-1, 1] (dla wektorów nieujemnych, np. TF-IDF, w zakresie [0, 1]): 1 = identyczny kierunek, 0 = ortogonalność (brak wspólnych cech).
Odległość euklidesowa między wektorami dokumentów jest zdominowana przez ich długość — dłuższy dokument jest "dalej" mimo tej samej tematyki. Cosine similarity normalizuje ten efekt, patrząc tylko na kąt.
Wektor zerowy (np. dokument bez żadnego znanego terminu) daje dzielenie przez zero w normie.
Powtórne liczenie norm dla tych samych wektorów marnuje czas.
Złożoność czasowa: O(d) na parę, O(n·d) batch. Złożoność przestrzenna: O(d) na wektor.
Czy wektory są wcześniej znormalizowane do długości jednostkowej — wtedy cosine = iloczyn skalarny.
Batchowe cosine similarity to mnożenie macierzy — idealne dla GPU przy gęstych embeddingach.
Dla wektorów rzadkich (TF-IDF) CPU z SIMD jest efektywne.