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

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

Косинусная схожесть имеет несколько приложений в реальном мире, и с использованием векторов вложения мы можем сравнивать реальные значения программным способом. 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 без дополнительных библиотек:

A = [5, 3, 4]B = [4, 2, 4]# Вычисление скалярного произведенияdot_product = sum(a*b for a, b in zip(A, B))# Вычисление величины каждого векторамagnitude_A = sum(a*a for a in A)**0.5magnitude_B = sum(b*b for b in B)**0.5# Вычисление косинусной схожестипохожестьcosine_similarity = dot_product / (magnitude_A * magnitude_B)print(f"Косинусная схожесть с использованием стандартного Python: {cosine_similarity}")

NumPy

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

import numpy as npA = 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"Косинусная схожесть с использованием NumPy: {cosine_similarity}")

Scikit-Learn

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

from sklearn.metrics.pairwise import cosine_similarityA = np.array([[5, 3, 4]])B = np.array([[4, 2, 4]])cosine_similarity_result = cosine_similarity(A, B)print(f"Косинусная схожесть с использованием 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

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


Leave a Reply

Your email address will not be published. Required fields are marked *