Открыть сервис

Косинусное расстояние

Косинусное расстояние — это метрика, используемая для измерения различия между двумя ненулевыми векторами в многомерном пространстве. Она определяется как единица минус косинус угла между векторами, то есть косинусное расстояние = 1 − cos(θ). В отличие от евклидова расстояния, косинусное расстояние не зависит от длины (нормы) векторов, а учитывает только их направление. Значение косинусного расстояния лежит в диапазоне от 0 (векторы сонаправлены, угол 0°) до 2 (векторы противоположно направлены, угол 180°). При ортогональных векторах (угол 90°) значение равно 1. Косинусное расстояние широко применяется в анализе текстов, машинном обучении, информационном поиске и рекомендательных системах, где важна не абсолютная величина признаков, а их относительное распределение.

Определение и математическая основа

Косинусное расстояние базируется на понятии косинусного сходства (cosine similarity). Косинусное сходство между двумя векторами A и B вычисляется как скалярное произведение векторов, делённое на произведение их длин:

\[ \cos(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \sqrt{\sum_{i=1}^{n} B_i^2}} \]

Косинусное расстояние \(d_c\) тогда определяется как:

\[ d_c(\mathbf{A}, \mathbf{B}) = 1 - \cos(\theta) \]

Если векторы нормированы (имеют единичную длину), косинусное сходство равно скалярному произведению, а косинусное расстояние — разности единицы и этого произведения.

Свойства

  • Неотрицательность: \(d_c(\mathbf{A}, \mathbf{B}) \ge 0\).
  • Симметричность: \(d_c(\mathbf{A}, \mathbf{B}) = d_c(\mathbf{B}, \mathbf{A})\).
  • Нулевое расстояние для одинаковых направлений: \(d_c(\mathbf{A}, \mathbf{A}) = 0\).
  • Не является метрикой в строгом смысле, так как не удовлетворяет неравенству треугольника для всех случаев, особенно при работе с ненормированными векторами. Однако на практике часто используется как метрика.
  • Инвариантность к масштабу: если умножить все компоненты вектора на положительную константу, косинусное расстояние не изменится.

Применение

Анализ текстов и информационный поиск

В задачах обработки естественного языка (NLP) документы часто представляют в виде векторов в модели «мешок слов» (Bag of Words) или с помощью TF-IDF. Косинусное расстояние позволяет сравнивать документы по тематике, игнорируя различия в длине текстов. Например, два документа, один из которых в два раза длиннее другого, но содержит те же пропорции ключевых слов, будут иметь близкое к нулю косинусное расстояние. Это свойство делает косинусное расстояние стандартной мерой в поисковых системах (например, Elasticsearch) и системах кластеризации текстов.

Рекомендательные системы

В коллаборативной фильтрации пользователи и товары представляются векторами предпочтений. Косинусное расстояние между векторами пользователей позволяет находить похожих по вкусам людей (nearest neighbors), а между векторами товаров — рекомендовать аналогичные позиции. Например, в системах потокового видео или интернет-магазинах косинусное сходство используется для построения рекомендаций «похожие товары» или «люди также смотрели».

Машинное обучение

  • Кластеризация: алгоритмы, такие как K-means, могут использовать косинусное расстояние для группировки данных, особенно в пространствах высокой размерности (например, эмбеддинги слов или изображений).
  • Метрическое обучение: в задачах поиска аналогов или распознавания лиц косинусное расстояние применяется как функция потерь (например, в архитектуре Siamese Network).
  • Снижение размерности: методы вроде t-SNE или UMAP часто используют косинусное расстояние как меру близости для визуализации многомерных данных.

Анализ изображений и аудио

Векторные представления изображений (например, из свёрточных нейронных сетей) или аудиосигналов (спектрограммы) сравниваются по косинусному расстоянию для задач поиска по содержанию, идентификации объектов или распознавания речи.

Сравнение с другими метриками

МетрикаФормулаЧувствительность к длинеДиапазонПрименение
Косинусное расстояние\(1 - \cos(\theta)\)Нет[0, 2]Тексты, эмбеддинги
Евклидово расстояние\(\sqrt{\sum (A_i - B_i)^2}\)Да[0, ∞)Кластеризация, регрессия
Манхэттенское расстояние\(\sumA_i - B_i\)Да[0, ∞)Данные с шумом
Корреляция Пирсона\(1 - r\)Нет (нормализация)[0, 2]Статистика, временные ряды

Косинусное расстояние предпочтительнее евклидова, когда важны относительные пропорции признаков, а не их абсолютные значения. Например, в анализе текстов два документа, один из которых содержит в два раза больше повторений одного слова, будут иметь одинаковое косинусное расстояние, но разное евклидово.

Ограничения и критика

  • Нечувствительность к масштабу: в некоторых задачах (например, анализ интенсивности сигнала) игнорирование длины вектора может быть недостатком.
  • Высокая размерность: в пространствах с очень большим числом измерений (например, разреженные векторы TF-IDF) косинусное расстояние может терять различительную способность из-за «проклятия размерности».
  • Неравенство треугольника: невыполнение этого свойства в общем случае может приводить к некорректной работе некоторых алгоритмов кластеризации, которые требуют метрики.
  • Интерпретируемость: значение косинусного расстояния не всегда интуитивно понятно, особенно для ненормированных векторов.

Реализация в программном обеспечении

Косинусное расстояние реализовано во многих библиотеках машинного обучения и анализа данных:

  • Python: scipy.spatial.distance.cosine, sklearn.metrics.pairwise.cosine_distances, numpy (ручное вычисление).
  • R: cosine() из пакета lsa, dist() с параметром method = "cosine" (в некоторых пакетах).
  • Apache Spark: функция cosine_distance в модуле mllib.
  • Elasticsearch: встроенная поддержка косинусного сходства для поиска по векторным индексам (dense vectors).

Пример вычисления

Пусть даны два вектора в трёхмерном пространстве:

  • A = (1, 2, 3)
  • B = (4, 5, 6)

Скалярное произведение: \(1 \cdot 4 + 2 \cdot 5 + 3 \cdot 6 = 4 + 10 + 18 = 32\) Длина A: \(\sqrt{1^2 + 2^2 + 3^2} = \sqrt{14} \approx 3.742\) Длина B: \(\sqrt{4^2 + 5^2 + 6^2} = \sqrt{77} \approx 8.775\) Косинусное сходство: \(\frac{32}{3.742 \cdot 8.775} \approx \frac{32}{32.84} \approx 0.974\) Косинусное расстояние: \(1 - 0.974 = 0.026\)

Таким образом, векторы почти сонаправлены, расстояние мало.

Источники

  1. Manning, C. D., Raghavan, P., & Schütze, H. (2008). Introduction to Information Retrieval. Cambridge University Press.
  2. Tan, P. N., Steinbach, M., & Kumar, V. (2005). Introduction to Data Mining. Addison-Wesley.
  3. Deza, M. M., & Deza, E. (2009). Encyclopedia of Distances. Springer.
  4. Документация библиотеки Scikit-learn: sklearn.metrics.pairwise.cosine_distances.
  5. Документация Apache Spark MLlib: CosineDistance.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →