Расстояния и сходство
Евклидово расстояние, dot product, cosine similarity. Кейс: сравнение текстов и объектов.
Как только мы представили данные в виде чисел и векторов, возникает естественный вопрос: как понять, что два объекта похожи или, наоборот, сильно отличаются? Машинное обучение почти всегда сводится к сравнению. Этот текст ближе к тому или к этому, этот пользователь похож на другого или нет, это изображение относится к классу A или B и т.д.
Чтобы формализовать такие рассуждения, нам нужны меры расстояния и меры сходства. В математике и ML это не абстрактные термины, а конкретные функции, которые принимают два вектора и возвращают число. По этому числу алгоритм и принимает решения.
В этой главе мы разберем три ключевых инструмента: евклидово расстояние, скалярное произведение (dot product) и косинусное сходство (cosine similarity). Они лежат в основе kNN, линейных моделей, рекомендательных систем, поиска по текстам и эмбеддингов.
Евклидово расстояние – "обычная" геометрия
Евклидово расстояние – это расстояние "по линейке" между двумя точками в пространстве.
Если у нас есть два вектора
то евклидово расстояние между ними определяется формулой:
Если , это расстояние между точками на плоскости. Если или, например, , то по сути геометрия остается той же самой, просто ее уже нельзя нарисовать напрямую, так как человек не может воспринять изображения в пространстве, имеющем больше, чем 3 измерения.

Но, при этом, на плоскости это выглядит очень наглядно: две точки и отрезок между ними. В машинном обучении мы делаем ровно то же самое, только в пространстве большей размерности.
Как вы наверняка запомнили из предыдущей главы – евклидово расстояние чувствительно к масштабу и поэтому перед использованием такого расстояния данные часто нормализуют или стандартизируют, если признаки имеют разные масштабы.
Интуитивно: два объекта похожи, если расстояние между их векторами маленькое.
PHP-пример
Пример:
Этот код уже можно использовать в простейшем kNN-классификаторе: мы просто ищем объекты с минимальным расстоянием среди имеющейся выборки.
Скалярное произведение (dot product) – мера согласованности
Скалярное произведение двух векторов определяется как:
На первый взгляд это просто сумма произведений соответствующих координат и выглядит всего лишь как удобный способ перемножить два набора чисел. Однако у скалярного произведения есть и геометрический смысл:
где – угол между векторами, а длина (модуль) вектора, определяется как:

Скалярное произведение становится большим, когда одновременно выполняются два условия:
Векторы смотрят почти в одну сторону Если угол между ними маленький, их направления совпадают – вклад направления максимален ().
Векторы длинные Чем больше длины векторов, тем больше итоговое значение (произведение модулей велико), даже при фиксированном направлении.
Проще говоря:
скалярное произведение = насколько направления совпадают × насколько векторы "крупные"
Это ключевой момент: скалярное произведение учитывает и направление, и масштаб. Из-за этого скалярное произведение смешивает два разных эффекта:
направление (похожи ли векторы),
масштаб (насколько они большие).
Поэтому его нельзя считать "чистой" мерой сходства. Два вектора могут быть идеально сонаправлены, но если один из них в 10 раз длиннее, скалярное произведение вырастет в 10 раз – хотя направление осталось тем же.
В машинном обучении это используется осознанно. В линейных моделях большое скалярное произведение означает сильную активацию. В нейросетях и attention-механизмах он интерпретируется как мера важности или связи.

Если представить геометрически, то это можно интерпретировать как длину проекции одного вектора на направление другого, умноженную на длину второго вектора.
PHP-пример
Пример:
Косинусное сходство – сравнение направлений
Как мы уже упоминали в прошлой главе - косинусное сходство отвечает на вопрос: насколько векторы направлены в одну сторону, независимо от их длины.
Оно определяется следующей формулой (нетрудно заметить, что она выводится из формулы скалярного произведения векторов):
Результат лежит в диапазоне от -1 до 1, и хотя в практических задачах NLP и эмбеддингов отрицательные значения встречаются редко, но математически они возможны:
1 – одинаковое направление;
-1 – противоположные направления.

На этой картинке важно увидеть: длины разные, но угол одинаковый – значит, косинусное сходство одинаковое.
Это делает косинусное сходство идеальной мерой для текстов и эмбеддингов, где длина вектора часто отражает не смысл, а масштаб (длина текста, частота слов).
PHP-пример
Пример:
В данном случае результат 0.8 означает, что векторы довольно похожи по направлению, но не совпадают полностью.
Last updated