Что такое косинусное сходство (Cosine Similarity)?

Ответ

Косинусное сходство — это метрика, измеряющая косинус угла между двумя не нулевыми векторами в многомерном пространстве. Она оценивает схожесть направлений векторов, игнорируя их абсолютную величину (длину). Диапазон значений от -1 (векторы противоположно направлены) до 1 (векторы сонаправлены), при 0 векторы ортогональны.

Формула: Для векторов ( A ) и ( B ): [ text{cosine_similarity}(A, B) = frac{A cdot B}{|A| cdot |B|} = frac{sum_{i=1}^{n} A_i Bi}{sqrt{sum{i=1}^{n} Ai^2} cdot sqrt{sum{i=1}^{n} B_i^2}} ]

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

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# Пример из NLP: сравнение документов
documents = [
    "Машинное обучение — это интересно",
    "Глубокое обучение — часть машинного обучения",
    "Я люблю программировать на Python"
]

# Векторизуем текст (TF-IDF)
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(documents)

# Вычисляем попарное косинусное сходство
similarity_matrix = cosine_similarity(tfidf_matrix, tfidf_matrix)

print("Матрица сходства:")
print(similarity_matrix)
# Первые два документа будут иметь высокое сходство, третий — низкое.

Основные сферы применения:

  • Поисковые системы и NLP: Для сравнения текстовых документов, векторизованных через Bag of Words или TF-IDF.
  • Рекомендательные системы: Для нахождения похожих товаров или пользователей на основе их векторных представлений (embeddings).
  • Компьютерное зрение: Для сравнения векторных представлений изображений.

Преимущество перед евклидовым расстоянием: Косинусная мера нечувствительна к масштабу, что важно, например, при сравнении текстов разной длины.

Ответ 18+ 🔞

Давай разберём эту штуку, а то звучит умно, а на деле — проще пареной репы, ёпта.

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

Формула, от которой глаза на лоб лезут: [ text{cosine_similarity}(A, B) = frac{A cdot B}{|A| cdot |B|} = frac{sum_{i=1}^{n} A_i Bi}{sqrt{sum{i=1}^{n} Ai^2} cdot sqrt{sum{i=1}^{n} B_i^2}} ]

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

А вот как это в деле выглядит, на Python:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# Допустим, есть три фразы
documents = [
    "Машинное обучение — это интересно",
    "Глубокое обучение — часть машинного обучения",
    "Я люблю программировать на Python"
]

# Превращаем текст в цифры (TF-IDF). Без этого нихуя не посчитаешь.
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(documents)

# А вот и магия — считаем попарное сходство
similarity_matrix = cosine_similarity(tfidf_matrix, tfidf_matrix)

print("Матрица сходства:")
print(similarity_matrix)
# Первые две фразы про обучение будут иметь высокий score, а третья, про Python, — будет как **хуй с горы**, то есть почти ноль.

Где эту хрень применяют? Да овердохуища где!

  • Поисковики и обработка текста: Чтобы понять, что документ про «собак» ближе к документу про «щенков», чем к документу про «ракетостроение». Доверия ебать ноль к тому, кто этого не использует.
  • Рекомендации: Типа «людям, которые смотрели Игру Престолов, засуньте Властелина Колец». Ищут векторы пользователей, которые смотрят в одном направлении.
  • Компьютерное зрение: Картинки тоже в векторы превращают и ищут похожие.

Главный прикол против евклидова расстояния: Косинусу да похуй на длину векторов. Тексту из трёх слов или трёх томов — ему всё равно, он смотрит только на направление. Евклидово расстояние обосрётся, если один текст будет в сто раз длиннее, даже если они оба про одно и то же. А косинус — хитрая жопа — этого не заметит. Вот и вся наука, я тебя в сраку чих-пых.