Косинусное сходство — это показатель, основанный на косинусном расстоянии между двумя объектами. Его можно использовать в системах рекомендаций, таких как рекомендации фильмов и книг. В этой статье мы узнаем, что это такое и как с его помощью можно давать рекомендации, определяя похожие элементы.
Введение
Системы рекомендаций являются частью нашей повседневной жизни. Просто приведу несколько распространенных примеров: мы получаем рекомендации, когда совершаем покупки в Интернете на Amazon и когда открываем Youtube или Netflix. Цель этих систем — порекомендовать, что вы можете захотеть купить, исходя из того, что у вас есть в сумке, или какое видео или фильм посмотреть дальше, исходя из того, что вы уже посмотрели.
Система рекомендаций может быть настолько сложной, насколько мы хотим, например, те, которые используют глубокое обучение [1,2], но они также могут быть простыми и основанными на сходстве между элементами. И один из способов вычислить сходство между элементами — использовать косинусное сходство.
Косинус между двумя векторами
Чтобы понять эту метрику подобия, нам сначала нужно понять некоторые концепции. Предположим, у нас есть таблица книг 1 и 2, содержащая их жанр, согласно рис. 3. Для каждого слова в таблице жанров мы создаем еще один столбец во второй таблице, где, если слово находится в жанре, мы присваиваем ему 1 , если нет, то 0. Так как у нас есть жанры Научная фантастика и Фантастика, мы создаем еще одну таблицу с этими двумя словами. Если мы нарисуем график, где ось x — это ось науки, а ось Y — ось фантастики, мы сможем связать точку с каждой книгой. Например, книга 1 будет синей точкой с осью науки, равной 1, и осью фантастики, равной 1 (научная фантастика). Книга 2 будет желтой точкой с осью Науки, равной 0, и осью Вымысла, равной 1 (Художественная литература). Мы рисуем вектор из начала координат в точки, который мы называем книгой-вектором.
Теперь мы можем видеть, что книжные векторы образуют угол θ друг с другом. Косинус этого угла является нашей мерой подобия и определяется по формуле:
где A и B — рассматриваемые нами векторы, ||A|| и ||B|| являются их нормой (длиной). Ai и Bi в формуле — это компоненты каждого вектора. Книжный вектор 1 равен (1,1), а книжный вектор 2 равен (0,1). Рассчитаем косинусное подобие:
что говорит о двух вещах: во-первых, эти векторы имеют некоторое сходство, а во-вторых, θ равно 45º, что мы уже ожидали и могли вычислить, используя теорему Пифагора и вычислив косинус, используя стороны треугольника.
Если бы обе книги были научной фантастикой, у нас были бы одни и те же векторы книг (1,1), а косинус был бы равен 1, что означает, что они одинаковы. Но если бы книга 1 была Научная фантастика (1,1), а книга 2 Террор (0,0), в этом случае у них не было бы ничего общего, и косинус был бы равен 0. Следовательно, высокое сходство означает косинус близкий к 1, и низкое сходство, косинус близкий к 0.
Вычисления с использованием Python
Мы можем указать по крайней мере два способа вычисления косинусного сходства между двумя заданными векторами. Один использует numpy:
import numpy as np from numpy.linalg import norm A = np.array([1,8]) B = np.array([9,2]) cos_sim = np.dot(A,B)/(norm(A)*norm(B)) print(f"The cosine similarity is: {round(cos_sim,2)}")
Другой способ - использовать sklearn:
from sklearn.metrics.pairwise import cosine_similarity cos_sim = cosine_similarity(A.reshape(1, -1),B.reshape(1, -1)) print(f"The cosine similarity is: {cos_sim}")
В любом случае, вычисление косинусного сходства является простым и, если сделать это вручную, потребуется только простая математическая формула.
Применение в качестве рекомендателя книг
В этом репозитории я использую косинусное сходство для создания рекомендателя книг.
Для этого проекта основная идея заключается в том, что пользователь будет вводить книги, которые он/она прочитал, и классифицировать их от 1 до 5, где 5 является наивысшей оценкой, таким образом создавая таблицу, содержащую столбцы: название книги, автор, описание, жанр, страницы и классификация. Как только таблица создана, мы конвертируем ее в фрейм данных pandas, затем нормализуем с помощью функции normalize(data) и быстро кодируем категориальные столбцы с помощью функции ohe(df, enc_col) (что мы и сделали, когда создавали другую таблицу на рис. 2). Важно нормализовать числовые столбцы, поскольку большие числа могут искажать результаты.
Функция recommend(book_id, owner_id, df) вычисляет косинусное сходство между книгой, введенной пользователем, и всеми остальными книгами в таблице, создает столбец с этими значениями, а затем выбирает 10 наиболее похожие книги рекомендовать пользователю. Сам расчет сходства косинуса довольно прост и определяется функцией cosine_sim(v1, v2), аналогично тому, что мы делали с numpy, единственное отличие здесь в том, что векторы имеют более двух измерений. .
Вы можете запустить API и протестировать рекомендации.
Выводы
Косинусное сходство дает полезную меру того, насколько похожи два объекта. Это довольно простая математическая концепция, которую легко реализовать с помощью вычислений. Его можно использовать для многих целей: в машинном обучении в качестве метрики расстояния, с текстовыми данными для сравнения двух документов и в рекомендательных системах.
Ссылки
[1] Дау А., Салим Н. Система рекомендаций, основанная на методах глубокого обучения: систематический обзор и новые направления. Artif Intell Rev 53, 2709–2748 (2020 г.). https://doi.org/10.1007/s10462-019-09744-1
[2] Шедл, М. (2019). Глубокое обучение в системах музыкальных рекомендаций. Границы прикладной математики и статистики, 5. https://doi.org/10.3389/fams.2019.00044