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