Интересный способ построения рекомендательной системы с помощью теории графов

На практике в большинстве случаев трудно получить оценку интереса пользователя к конкретному элементу, и иногда у нас может не быть дополнительной информации для построения системы рекомендаций, например, спецификаций продукта или демографической информации пользователя. Например, когда нам нужно построить рекомендательную модель для веб-страниц, а у нас есть только идентификатор файла cookie пользователя и его посещенная страница. Мы можем использовать метод кластеризации для построения базовой системы рекомендаций по элементам.

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

Набор данных

В этом примере мы будем использовать набор данных movielens (ml-100k).

ссылка: https://grouplens.org/datasets/movielens/

GitHub

Ссылка на Github: https://github.com/chiang9/Recommendation_system_pyspark/blob/main/network_analysis/network_analysis.ipynb

Построение графика

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

Чтобы построить поэлементную сеть, мы используем следующий метод.

  1. Создайте преимущество между пользователем элемента, если пользователь оценивает элемент
  2. Репликация узлов элементов и подключение к соответствующим пользователям
  3. Создайте границу между двумя элементами, если пользователь оценивает оба элемента.
  4. (Необязательно) Рассчитайте вес ребер, используя рейтинговые значения.
  5. Отбросить пользовательские узлы

В приведенном выше примере пользователь 1 оценивает элемент {A, B, C}, мы строим ребра между {(AB), (BC), (AC)}. Пользователь 2 оценивает элемент {A,B}, мы строим ребра между {(AB)}.

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

Weight = {
(A,B): 2,
(A,C): 1,
(B,C): 1
}

Начиная

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

174005
[(1, 6, 2), (1, 9, 20), (1, 12, 24), (1, 13, 5), (1, 14, 11)]

Затем мы строим график, используя networkx.

Total number of graph nodes: 1172
Total number of graph edges: 174005
Average node degree: 296.94
Number of communities: 4

Теперь мы можем видеть все категории фильмов в кластере.

[['Animation', "Children's", 'Comedy'],
 ['Drama'],
 ['Drama', 'Thriller'],
 ['Action', 'Adventure', 'Romance', 'Sci-Fi', 'War'],
 ['Crime', 'Drama', 'Romance', 'Thriller'],
 ['Drama'],
 ['Action', 'Adventure', 'Sci-Fi'],
 ['Drama'],
 ['Action', 'Sci-Fi', 'Thriller'],
 ['Comedy', 'Sci-Fi'],
 ['Comedy', 'Romance'],
 ['Documentary'],
 ['Action', 'Adventure', 'Drama', 'Romance', 'Sci-Fi', 'War'],
 ['Action', 'Adventure', 'Comedy', 'Romance'],
 ['Action', 'Adventure'],
 ['Action', 'Sci-Fi', 'Thriller', 'War'],
 ['Action', 'Adventure', 'Romance', 'Sci-Fi', 'War'],
 ['Action', 'Sci-Fi', 'Thriller'],
 ['Drama'],
 ['Comedy', 'Romance'],
 ['Comedy', 'Sci-Fi'],
 ['Comedy', 'Romance'],
....
]

Первый кластер в основном состоит из боевиков, драм и приключенческих фильмов.

Вывод

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

Спасибо за чтение, и желаю вам хорошего дня.