Какое свойство косинусного сходства (cosine similarity) делает его предпочтительным методом поиска ближайших соседей?

«Какое свойство косинусного сходства (cosine similarity) делает его предпочтительным методом поиска ближайших соседей?» — вопрос из категории Классическое ML, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Инвариантность к длине вектора (масштабу) — это ключевое свойство, которое делает cosine similarity особенно полезным для поиска ближайших соседей в задачах обработки текстов и рекомендательных систем.

Почему это важно:

  • При сравнении текстовых документов, представленных в виде векторов (TF-IDF, word2vec, BERT-эмбеддинги), длина вектора часто соответствует количеству слов или общей частоте терминов. Два документа на одну тему могут сильно различаться по длине (например, краткая статья и подробный обзор), но иметь схожее семантическое направление.
  • Cosine similarity измеряет косинус угла между векторами, игнорируя их евклидову норму. Это позволяет находить семантически близкие объекты, даже если они имеют разную «интенсивность».

Пример на Python:

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

# Два документа с одинаковой тематикой, но разной длиной
doc_short = np.array([1, 2, 1])        # TF-IDF для короткого текста
doc_long  = np.array([10, 20, 10])     # TF-IDF для длинного текста (тот же баланс терминов)
doc_other = np.array([1, 0, 3])        # Документ на другую тему

print("Cosine similarity (short vs long):", cosine_similarity([doc_short], [doc_long])[0][0])   # 1.0
print("Euclidean distance (short vs long):", np.linalg.norm(doc_short - doc_long))              # Большое значение
print("Cosine similarity (short vs other):", cosine_similarity([doc_short], [doc_other])[0][0]) # ~0.5345

Другие преимущества для nearest neighbor search:

  • Эффективность для разреженных данных: Хорошо работает с разреженными матрицами (например, TF-IDF), где большинство элементов — нули.
  • Устойчивость к доминированию частых признаков: В рекомендательных системах пользователь с большим количеством взаимодействий не будет автоматически считаться похожим на всех.

Когда использовать: Поиск похожих документов, коллаборативная фильтрация, кластеризация текстовых эмбеддингов.