Как реализовать косинусное сходство в Python

Косинусная близость имеет несколько приложений в реальной жизни, и с помощью векторов вложения мы можем сравнивать реальные смыслы программным способом. Python является одним из самых популярных языков для научных исследований данных, и он предлагает различные библиотеки для легкого расчета косинусной близости. В этой статье мы обсудим, как можно реализовать косинусную близость в Python с помощью библиотек Scikit-Learn и NumPy

Что такое Косинусная близость?

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

Формула Косинусной близости

Косинусная близость между двумя векторами, A и B, рассчитывается по следующей формуле:

Косинусная близость (A, B) = (A · B) / (||A|| * ||B||)

В этой формуле A · B представляет скалярное произведение векторов A и B. Это вычисляется путем умножения соответствующих компонентов двух векторов и суммирования результатов. ||A|| представляет собой евклидову норму (величину) вектора A, которая является квадратным корнем из суммы квадратов его компонентов. Она рассчитывается как ||A|| = √(A₁² + A₂² + … + Aₙ²). ||B|| представляет собой евклидову норму (величину) вектора B, рассчитываемую таким же образом, как и ||A||.

Как рассчитать косинусную близость

Для расчета косинусной схожести сначала выполните расчет скалярного произведения двух векторов. Затем разделите его на произведение их величин. Полученное значение будет в диапазоне от -1 до 1, где:

  • Если косинусная схожесть равна 1, это означает, что векторы имеют одинаковое направление и являются полностью схожими.
  • Если косинусная схожесть равна 0, это означает, что векторы перпендикулярны друг другу и не имеют сходства.
  • Если косинусная схожесть равна -1, это означает, что векторы имеют противоположные направления и являются полностью несхожими.

В анализе текста косинусная схожесть используется для измерения сходства между векторами документов, где каждый документ представлен как вектор в высокомерном пространстве, при этом каждая размерность соответствует термину или слову в корпусе. Рассчитав косинусную схожесть между векторами документов, можно определить, насколько похожи или непохожи друг на друга два документа.

Библиотеки для расчета косинусной схожести

  • NumPy: Отлично подходит для числовых операций и оптимизирована для скорости.
  • scikit-learn: Предлагает различные алгоритмы машинного обучения и включает метод для вычисления косинусной сходства в своем пакете метрик.

Ниже приведены некоторые примеры, показывающие, как можно вычислить косинусное сходство с использованием Python. Мы возьмем наши два теперь уже знакомых вектора рецензий на книги [5,3,4] и [4,2,4]. 

Прямой Python

Хотя мы ранее вычисляли это вручную, конечно, компьютер может это сделать! Вот как можно вычислить косинусное сходство с использованием Python без дополнительных библиотек:

Python

 

A = [5, 3, 4]

B = [4, 2, 4]

# Calculate dot product

dot_product = sum(a*b for a, b in zip(A, B))

# Calculate the magnitude of each vector

magnitude_A = sum(a*a for a in A)**0.5

magnitude_B = sum(b*b for b in B)**0.5

# Compute cosine similarity

cosine_similarity = dot_product / (magnitude_A * magnitude_B)

print(f"Cosine Similarity using standard Python: {cosine_similarity}")

NumPy

Встраивание векторов обычно имеет много измерений — сотни, тысячи, даже миллионы или более! С помощью NumPy вы можете вычислять косинусное сходство с использованием массива операций, которые оптимизированы на высокой скорости. 

Python

 

import numpy as np

A = np.array([5, 3, 4])

B = np.array([4, 2, 4])

dot_product = np.dot(A, B)

magnitude_A = np.linalg.norm(A)

magnitude_B = np.linalg.norm(B)

cosine_similarity = dot_product / (magnitude_A * magnitude_B)

print(f"Cosine Similarity using NumPy: {cosine_similarity}")

Scikit-Learn

Функция cosine_similarity из scikit-learn значительно упрощает вычисление оптимизированных операций косинусного сходства:

Python

 

from sklearn.metrics.pairwise import cosine_similarity

A = np.array([[5, 3, 4]])

B = np.array([[4, 2, 4]])

cosine_similarity_result = cosine_similarity(A, B)

print(f"Cosine Similarity using scikit-learn: {cosine_similarity_result[0][0]}")

Советы по оптимизации вычислений косинусного сходства в Python

Если вы собираетесь использовать Python для прямого вычисления косинусного сходства, стоит учитывать следующее:

  • Используйте оптимизированные библиотеки, такие как NumPy или scikit-learn: Эти библиотеки оптимизированы для производительности и обычно быстрее, чем чистый Python.
  • Используйте Numba:Numba — это открытый исходный JIT-компилятор для Python и кода NumPy, разработанный специально для оптимизации функций научных вычислений.
  • Использование GPU: Если у вас есть доступ к GPU, используйте Python библиотеки, такие как Tensorflow, которые оптимизированы для работы на GPU.
  • Параллелизация вычислений: Если у вас есть аппаратные возможности, рассмотрите возможность параллелизации ваших вычислений для ускорения их выполнения.

Поиск большого количества векторов с использованием Vector Search в AstraDB

Если вам нужно искать большое количество векторов, может оказаться более эффективным и масштабируемым использование векторной базы данных, такой как векторный поиск DataStax Astra. Векторный поиск в Astra DB предлагает мощную платформу для выполнения векторных поисков с встроенными вычислениями косинусной схожести, что позволяет получать больше информации из ваших данных.

Source:
https://dzone.com/articles/how-to-implement-cosine-similarity-in-python