Косинусное сходство — это показатель, основанный на косинусном расстоянии между двумя объектами. Его можно использовать в системах рекомендаций, таких как рекомендации фильмов и книг. В этой статье мы узнаем, что это такое и как с его помощью можно давать рекомендации, определяя похожие элементы.

Введение

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