Главная
#Математика и ML #Data Science

Что такое Cosine similarity в Data Science и как измерять близость между векторами и объектами в 2026 году?

Cosine similarity в Data Science нужен тогда, когда нас интересует не просто расстояние между объектами, а направление их векторов. Это тонкое, но очень важное различие. Два документа, два товара, два пользователя, два embedding-вектора могут иметь разную длину, но все равно указывать почти в одну сторону. Для многих прикладных задач именно это и означает смысловую близость.

Содержание
  1. Почему обычное евклидово расстояние не всегда отвечает на правильный вопрос
  2. Интуиция через угол
  3. Основная формула cosine similarity
  4. Что означают значения от -1 до 1
  5. Геометрический смысл: мы сравниваем не длину, а ориентацию
  6. Почему cosine similarity особенно полезна вместе с embeddings
  7. Как cosine similarity связана с нормировкой
  8. Где cosine similarity используется в Data Science в 2026 году
  9. Когда cosine similarity может ввести в заблуждение
  10. Связь с оптимизацией и обучением модели
  11. Python: как посчитать cosine similarity на практике
  12. Что важно вынести из темы
  13. Kaggle notebook по теме:

Интуитивно cosine similarity отвечает не на вопрос “насколько далеко стоят точки”, а на вопрос “насколько одинаково они ориентированы в пространстве”. Это особенно полезно там, где абсолютный масштаб не так важен, как структура признаков. В рекомендациях, поиске, NLP, retrieval, embeddings и semantic similarity как раз так и происходит: нас интересует не длина вектора сама по себе, а его направление относительно других векторов.

Поэтому cosine similarity — это не второстепенная метрика из учебника по линейной алгебре. Это одна из самых практичных геометрических идей в современном Machine Learning.

Поэтому cosine similarity — это не второстепенная метрика из учебника по линейной алгебре. Это одна из самых практичных геометрических идей в современном Machine Learning.

Почему обычное евклидово расстояние не всегда отвечает на правильный вопрос

Допустим, у нас есть два текста, превращенных в TF-IDF векторы. Один документ длиннее и содержит больше слов, другой короче, но тематически очень похож. Если смотреть только на обычное расстояние, длинный документ может выглядеть более далеким просто потому, что у него больше суммарный вес признаков. Но если оба текста распределяют важные слова в схожем направлении, для retrieval-задачи они по смыслу могут быть почти соседями.

То же самое происходит с embeddings. Один вектор может быть масштабирован сильнее, другой слабее, но если они указывают почти в одну сторону, их часто разумно считать похожими. Именно поэтому cosine similarity так хорошо заходит в пространствах представлений: она отделяет вопрос направления от вопроса длины. В этом месте особенно полезно рядом держать и материал о том, как сами embeddings создают пространство, внутри которого эта близость потом измеряется.

Интуиция через угол

Самая полезная картинка здесь очень простая. Представьте два вектора, выходящие из начала координат. Если угол между ними маленький, они направлены почти одинаково. Если угол близок к девяноста градусам, они почти независимы. Если угол тупой, векторы направлены в разные стороны. Cosine similarity просто превращает этот угол в число.

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

Основная формула cosine similarity

Раздел математики: линейная алгебра и аналитическая геометрия.

(\cos(\theta)=\frac{u \cdot v}{|u||v|})

Что означает каждый символ:

(u) и (v) — два вектора, которые мы сравниваем.

(u \cdot v) — их скалярное произведение.

(|u|) и (|v|) — длины этих векторов.

После нормировки по длинам остается мера именно направленности, а не абсолютного масштаба.

Численный пример вручную: пусть (u=(1,2)), а (v=(2,4)). Тогда скалярное произведение равно (u \cdot v = 1\cdot 2 + 2\cdot 4 = 10). Длины равны (|u|=\sqrt{5}) и (|v|=\sqrt{20}). Получаем (\cos(\theta)=\frac{10}{\sqrt{5}\sqrt{20}}=1). Это максимальная близость: векторы направлены одинаково.

Уже этот пример показывает ключевую идею: cosine similarity может считать два вектора идеально похожими, даже если один длиннее другого. Для многих прикладных задач это именно то, что нужно.

Что означают значения от -1 до 1

Если cosine similarity равен 1, векторы направлены одинаково. Если значение равно 0, они ортогональны, то есть не имеют направленной близости. Если значение равно -1, векторы смотрят в противоположные стороны. В реальных ML-задачах чаще всего нас интересует диапазон от 0 до 1, особенно если признаки или embeddings уже неотрицательные или нормализованные особым образом.

Но важно не превращать эти числа в магию. Значение 0.92 может быть очень сильным в одной задаче и умеренным в другой. Интерпретация всегда зависит от природы данных, распределения векторов и downstream-задачи.

Геометрический смысл: мы сравниваем не длину, а ориентацию

Это главный conceptual payoff всей темы. Евклидово расстояние видит, насколько далеко концы векторов находятся друг от друга. Cosine similarity смотрит, насколько векторы сонаправлены. Геометрически это два разных вопроса. Если embeddings обучены так, что семантически похожие объекты тяготеют к похожим направлениям, cosine similarity оказывается более естественным способом сравнения.

В retrieval это особенно заметно. Нам не всегда нужно, чтобы документ был близок по абсолютной длине признакового вектора. Нам нужно, чтобы он был близок по смысловой ориентации. Поэтому cosine similarity и стала почти стандартом для dense retrieval, sentence embeddings, item embeddings и многих рекомендательных систем.

Почему cosine similarity особенно полезна вместе с embeddings

Embeddings сами по себе переводят объект в вектор. Но после этого возникает новый вопрос: как сравнивать эти векторы между собой? Если embeddings учились так, чтобы близкие по смыслу объекты располагались рядом в пространстве представлений, cosine similarity становится очень естественной метрикой. Она стабильно работает на текстах, товарах, пользователях, изображениях и векторах из encoder-моделей.

Это и есть связка между математикой и Machine Learning: embedding создает пространство, cosine similarity задает механику движения по этому пространству.

Как cosine similarity связана с нормировкой

На практике многие retrieval-системы еще до расчета similarity нормируют векторы до единичной длины. Тогда cosine similarity превращается почти в обычное скалярное произведение между нормализованными векторами. Это упрощает вычисления и ускоряет nearest-neighbor поиск.

(\tilde{u}=\frac{u}{|u|})

Раздел математики: линейная алгебра.

Что означает каждый символ:

(\tilde{u}) — нормализованный вектор.

(|u|) — его длина.

После такой операции вектор сохраняет направление, но теряет исходный масштаб.

Численный пример вручную: если (u=(3,4)), то его длина равна (|u|=5). Тогда нормализованный вектор равен (\tilde{u}=(3/5,4/5)=(0.6,0.8)). Направление осталось тем же, но длина стала равна единице.

Эта идея напрямую связана с production-практикой: если вы храните normalized embeddings, retrieval и comparison становятся проще и быстрее. Но здесь важно помнить, что сильная нормализация и масштабирование признаков меняют геометрию пространства, поэтому рядом полезно отдельно посмотреть, когда feature scaling действительно важен для модели и её представлений.

Где cosine similarity используется в Data Science в 2026 году

Список очень широкий: semantic search, поиск похожих документов, рекомендация товаров, matching пользователей и вакансий, поиск дублей, кластеризация embedding-векторов, reranking, retrieval-augmented generation, сравнение изображений, сравнение музыкальных треков, поиск близких фрагментов кода. Везде, где объект уже представлен вектором, cosine similarity становится одним из самых естественных способов измерить близость. В рекомендательных задачах это особенно заметно в режиме cold start, когда система временно опирается не на историю поведения, а на смысловую близость объектов и описаний.

То есть сама тема давно вышла за пределы классического NLP. Сегодня cosine similarity — это почти универсальный язык сравнения для learned representations.

Когда cosine similarity может ввести в заблуждение

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

Поэтому cosine similarity нельзя рассматривать вне качества признакового пространства. Она не исправляет плохие векторы. Она лишь честно сравнивает то пространство, которое вы ей дали.

А если само пространство со временем уезжает из-за изменения данных или поведения пользователей, близость тоже начинает означать уже не то, что раньше. Поэтому рядом полезно держать и материал о том, как drift меняет смысл признаков и представлений после выкладки.

Связь с оптимизацией и обучением модели

Cosine similarity не всегда является функцией потерь сама по себе, но очень часто участвует в contrastive learning, metric learning и retrieval-обучении. Если модель обучается так, чтобы близкие объекты имели высокий cosine score, а далекие — низкий, то сама геометрия пространства начинает подчиняться задаче. В этом смысле cosine similarity влияет не только на inference, но и на саму логику обучения представлений.

Это важный мост между математикой и ML: метрика сравнения может стать частью objective, а значит формировать embedding-пространство уже на стадии обучения.

Python: как посчитать cosine similarity на практике

import numpy as np  # Подключаем numpy для работы с векторами.
from sklearn.metrics.pairwise import cosine_similarity  # Импортируем готовую функцию cosine similarity.

vectors = np.array([  # Создаем небольшой набор векторов для демонстрации.
    [1.0, 2.0, 0.0],  # Первый вектор.
    [2.0, 4.0, 0.0],  # Второй вектор, направленный почти так же, как первый.
    [0.0, 1.0, 3.0],  # Третий вектор с другой ориентацией.
])  # Получаем матрицу объектов.

similarity_matrix = cosine_similarity(vectors)  # Считаем попарную cosine similarity между всеми векторами.

print("Cosine similarity matrix:")  # Обозначаем вывод результата.
print(similarity_matrix.round(3))  # Печатаем матрицу близостей с округлением для удобства чтения.

В этом коде хорошо видно главное. Первый и второй векторы должны дать similarity, близкую к 1, потому что они практически сонаправлены. А третий вектор будет заметно менее похожим. Именно так cosine similarity работает в реальных retrieval-пайплайнах, только вместо трех коротких векторов там могут быть миллионы embeddings.

Что важно вынести из темы

Cosine similarity измеряет близость не через абсолютное расстояние, а через угол между векторами. Это делает ее особенно полезной там, где направление embedding-вектора важнее его масштаба. Именно поэтому она так хорошо работает в retrieval, recommendation, semantic search и сравнении learned representations.

Если сформулировать совсем коротко, cosine similarity отвечает на вопрос: насколько одинаково два объекта “смотрят” в пространстве признаков. И для современного Data Science это один из самых мощных способов превратить геометрию в прикладное решение.

Kaggle notebook по теме:

https://www.kaggle.com/code/jijosunny/modified-cosine-similarity-0-00632

Что читать дальше

Связанные статьи по этой теме

Инструменты Python в 2026 году: современный стек для профессиональной разработки Что должен знать Junior Data Scientist в 2026 году? Как собрать GitHub-портфолио для Data Science
Вернуться в блог