Расчет косинусного сходства двух списков чисел в Python
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для расчета косинусной меры сходства между двуми списками чисел, используя numpy, следуйте трем основным шагам:
- Преобразуйте списки в numpy массивы.
- Вычислите скалярное произведение этих массивов.
- Нормализуйте результат с помощью L2-норм этих самых массивов.
Вот эти шаги на примере кода на Python:
import numpy as np
# Задаем два числовых массива
nums1 = np.array([1, 2, 3])
nums2 = np.array([4, 5, 6])
# Рассчитываем косинусную меру сходства
cosine_similarity = np.dot(nums1, nums2) / (np.linalg.norm(nums1) * np.linalg.norm(nums2))
print(cosine_similarity) # Выводим результат – итоговый коэффициент сходства!
Таким образом, значение cosine_similarity
будет варьироваться от -1
до 1
. Значение 1
означает полное совпадение направлений, а -1
— полное противоположение. Так и работает косинусная мера сходства!
Расшифровка косинусной меры сходства
Косинусная мера сходства можно рассматривать как своеобразный секретный код мира алгоритмов, благодаря которому мы можем быстро оценить степень сходства двух числовых последовательностей или векторов слов.
Представьте эти списки как векторы в n-мерном пространстве. Косинус угла между векторами – это и есть мера их сходства. В расчет принимается как направление векторов, так и их длина.
Влияние на производительность
Что делать, если объем данных существенно возрастает? Здесь становятся особо полезными эффективные операции с массивами, предоставляемые numpy. Они обладают высокой производительностью и простотой использования.
Если вы предпочитаете библиотеку pandas, преобразуйте Series
в numpy массивы и примените апробированную формулу.
Расширение функциональности с помощью альтернативных инструментов
Spatial.distance от SciPy: Эта библиотека предлагает функцию
spatial.distance.cosine
. Используя её, не забудьте вычесть итоговое значение из единицы, чтобы получить действительную меру сходства.from scipy.spatial import distance # Рассчитываем косинусное расстояние cos_dist = distance.cosine(nums1, nums2) cos_sim = 1 – cos_dist # Получаем косинусную меру сходства print(cos_sim) # Выводим результат – косинусная мера сходства!
Стандартные метрики парности от Sklearn: Если используете
sklearn.metrics.pairwise.cosine_similarity
, вы сможете проанализировать множество наборов данных. Вам будет достаточно извлечь нужное значение из результирующей матрицы для сравнительного анализа.from sklearn.metrics.pairwise import cosine_similarity # Функция ожидает двумерные массивы cos_sim = cosine_similarity([nums1], [nums2])[0][0] # Извлекаем необходимое значение print(cos_sim) # Получаем косинусную меру сходства в соответствии со стандартами Sklearn
Умение обрабатывать специфические случаи
- Необходимость совпадения длин: Проверьте, что длины списков совпадают, используя функцию
len()
. - Типы данных: Проанализируйте, чтобы списки содержали именно числовые данные, так как это критично для numpy.
- Нулевые векторы: Если векторы состоят только из нулей, устраните деление на ноль, устанавливая сходство равным нулю.
Визуализация
Косинусная мера сходства аналогична методу сравнения двух стрелок компаса:
Список A (🧭): [1, 2, 3]
Список B (🧭): [2, 3, 4]
Косинусная мера сходства отражает степень совпадения направлений этих стрелок.
🧭🔄🧭: Мы анализируем угол между векторами наших списков.
Когда векторы указывают в одном направлении (⬆️⬆️), сходство равно **1**.
Если они перпендикулярны друг другу (⬆️➡️), сходство равно **0**.
Работа с большими данными
При обработке больших объемов данных применяйте векторизацию от numpy для увеличения производительности.
Если же вы работаете только с чистым Python, ускорьте процессы с помощью включений списков и функции sum()
.
def python_cosine_similarity(lst1, lst2):
dot_product = sum(a * b for a, b in zip(lst1, lst2)) # Скалярное произведение на скорости молнии!
norm_lst1 = sum(a**2 for a in lst1) ** 0.5 # Рассчитаем L2-норму lst1
norm_lst2 = sum(b**2 for b in lst2) ** 0.5 # Рассчитаем L2-норму lst2
return dot_product / (norm_lst1 * norm_lst2)
Эффективное использование памяти и избегание дублирования массивов данных помогут обеспечить высокую производительность.