Расчет косинусного сходства двух списков чисел в Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для расчета косинусной меры сходства между двуми списками чисел, используя numpy, следуйте трем основным шагам:

  • Преобразуйте списки в numpy массивы.
  • Вычислите скалярное произведение этих массивов.
  • Нормализуйте результат с помощью L2-норм этих самых массивов.

Вот эти шаги на примере кода на Python:

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 — полное противоположение. Так и работает косинусная мера сходства!

Кинга Идем в IT: пошаговый план для смены профессии

Расшифровка косинусной меры сходства

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

Представьте эти списки как векторы в n-мерном пространстве. Косинус угла между векторами – это и есть мера их сходства. В расчет принимается как направление векторов, так и их длина.

Влияние на производительность

Что делать, если объем данных существенно возрастает? Здесь становятся особо полезными эффективные операции с массивами, предоставляемые numpy. Они обладают высокой производительностью и простотой использования.

Если вы предпочитаете библиотеку pandas, преобразуйте Series в numpy массивы и примените апробированную формулу.

Расширение функциональности с помощью альтернативных инструментов

  • Spatial.distance от SciPy: Эта библиотека предлагает функцию spatial.distance.cosine. Используя её, не забудьте вычесть итоговое значение из единицы, чтобы получить действительную меру сходства.

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

    Python
    Скопировать код
    from sklearn.metrics.pairwise import cosine_similarity
    
    # Функция ожидает двумерные массивы
    cos_sim = cosine_similarity([nums1], [nums2])[0][0]  # Извлекаем необходимое значение
    print(cos_sim)  # Получаем косинусную меру сходства в соответствии со стандартами Sklearn

Умение обрабатывать специфические случаи

  • Необходимость совпадения длин: Проверьте, что длины списков совпадают, используя функцию len().
  • Типы данных: Проанализируйте, чтобы списки содержали именно числовые данные, так как это критично для numpy.
  • Нулевые векторы: Если векторы состоят только из нулей, устраните деление на ноль, устанавливая сходство равным нулю.

Визуализация

Косинусная мера сходства аналогична методу сравнения двух стрелок компаса:

Markdown
Скопировать код
Список A (🧭): [1, 2, 3]
Список B (🧭): [2, 3, 4]

Косинусная мера сходства отражает степень совпадения направлений этих стрелок.

Markdown
Скопировать код
🧭🔄🧭: Мы анализируем угол между векторами наших списков.
Когда векторы указывают в одном направлении (⬆️⬆️), сходство равно **1**.
Если они перпендикулярны друг другу (⬆️➡️), сходство равно **0**.

Работа с большими данными

При обработке больших объемов данных применяйте векторизацию от numpy для увеличения производительности.

Если же вы работаете только с чистым Python, ускорьте процессы с помощью включений списков и функции sum().

Python
Скопировать код
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)

Эффективное использование памяти и избегание дублирования массивов данных помогут обеспечить высокую производительность.

Полезные материалы