Что такое 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 — это фундаментальный инструмент для измерения "углового" сходства между векторами признаков, широко применяемый в текстовой аналитике, рекомендациях, семантическом поиске и других областях, где важны не масштабы, а направления.