Что такое cosine similarity? Где она применяется?

Cosine similarity (косинусное сходство) — это метрика, измеряющая косинус угла между двумя векторами в n-мерном пространстве. Она широко используется в анализе текстов, поисковых системах, системах рекомендаций, кластеризации и других задачах, где важно определить не абсолютную величину векторов, а их направление — то есть насколько два объекта "похожи" по своей ориентации в пространстве признаков.

Математическое определение

Пусть у нас есть два вектора:

A⃗=[a1,a2,...,an],B⃗=[b1,b2,...,bn]\vec{A} = [a_1, a_2, ..., a_n], \quad \vec{B} = [b_1, b_2, ..., b_n]

Косинусное сходство определяется как:

cos⁡(θ)=A⃗⋅B⃗∥A⃗∥⋅∥B⃗∥=∑i=1naibi∑i=1nai2⋅∑i=1nbi2\cos(\theta) = \frac{\vec{A} \cdot \vec{B}}{\|\vec{A}\| \cdot \|\vec{B}\|} = \frac{\sum_{i=1}^{n} a_i b_i}{\sqrt{\sum_{i=1}^{n} a_i^2} \cdot \sqrt{\sum_{i=1}^{n} b_i^2}}

  • A⃗⋅B⃗\vec{A} \cdot \vec{B} — скалярное произведение векторов.

  • ∥A⃗∥\|\vec{A}\|, ∥B⃗∥\|\vec{B}\| — евклидовы нормы векторов.

  • Результат лежит в диапазоне от -1 до 1:

    • 1 — вектора совпадают по направлению (максимальное сходство).

    • 0 — вектора ортогональны (нет сходства).

    • -1 — вектора направлены в противоположные стороны (максимальное различие).

    • Однако в практике (например, NLP) значения почти всегда в диапазоне от 0 до 1, так как признаки (частоты слов, tf-idf, embeddings) неотрицательны.

Почему cosine similarity, а не евклидово расстояние?

  • Евклидово расстояние зависит от длины вектора (влияние масштабов).

  • Косинусное сходство инвариантно к масштабу: вектора [1,2][1, 2] и [2,4][2, 4] будут иметь сходство 1, хотя евклидово расстояние между ними будет > 0.

  • Это особенно важно в задачах, где важен направление вектора, а не абсолютные значения — например, при сравнении текстов разной длины.

Применения

1. Natural Language Processing (NLP)

Поиск похожих документов
Каждый документ представляется как вектор (например, tf-idf или word embeddings), и затем можно сравнить документы между собой по cosine similarity.

from sklearn.metrics.pairwise import cosine_similarity
cosine_similarity(\[doc1_vec\], \[doc2_vec\])

Семантический поиск
Сравнение запроса и документа в пространстве word2vec / BERT. Например, в поисковиках, чат-ботах и Q&A системах.

Сравнение предложений и фраз
Для определения перефразирований, синонимичных фраз, анализа тональности, сходства пользовательских отзывов.

2. Системы рекомендаций

  • Каждый пользователь и каждый товар представляется как вектор признаков (например, предпочтения по категориям).

  • Вычисляется сходство между пользователями или товарами:

    • "похожие пользователи" — рекомендации по collaborative filtering.

    • "похожие товары" — item-based рекомендации.

3. Кластеризация и классификация

  • Применяется в k-NN, иерархической кластеризации и других алгоритмах.

  • В задачах текстовой классификации часто используются tf-idf + cosine similarity.

4. Детектирование плагиата

  • Документы, представленные векторно (n-граммы, tf-idf, embeddings), сравниваются между собой. Чем ближе косинусное сходство к 1, тем выше вероятность заимствования.

5. Аннотирование данных и активное обучение

  • Можно находить примеры, наиболее/наименее похожие на уже размеченные, чтобы эффективно использовать аннотатор.

Пример на Python

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
texts = \["кот спит на ковре", "кошка лежит на полу"\]
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(texts)
cos_sim = cosine_similarity(tfidf_matrix\[0:1\], tfidf_matrix\[1:2\])
print(f"Cosine similarity: {cos_sim\[0\]\[0\]:.4f}")

Визуализация: интуиция

В двумерном пространстве представим два вектора:

  • Один направлен вдоль оси X (например, «машина»)

  • Второй под углом 60° (например, «автомобиль»)

Косинус угла между ними — это мера "похожести" по направлению. Чем меньше угол — тем больше сходство.

Альтернативы

Хотя cosine similarity широко используется, в некоторых случаях могут применяться другие меры:

  • Euclidean distance — учитывает абсолютную разницу между векторами.

  • Jaccard similarity — для бинарных/множественных признаков (например, множества тегов).

  • Manhattan distance, Dot product, Mahalanobis distance и др.

Но для задач, связанных с текстом или семантическими пространствами, cosine similarity остаётся одним из наиболее устойчивых и интерпретируемых подходов.

Важные замечания

  • Нормализация данных: для использования cosine similarity важно, чтобы вектора были нормализованы (особенно в обучении).

  • Скорость вычислений: при работе с большими корпусами и словарями можно использовать Approximate Nearest Neighbors (например, FAISS или Annoy), чтобы ускорить поиск похожих объектов.

  • Контекст: в современных моделях (например, BERT) векторы фраз и предложений зависят от контекста, но метрика сходства часто остаётся той же — косинусная.

Таким образом, cosine similarity — это фундаментальный инструмент для измерения "углового" сходства между векторами признаков, широко применяемый в текстовой аналитике, рекомендациях, семантическом поиске и других областях, где важны не масштабы, а направления.