Интересный способ построения рекомендательной системы с помощью теории графов
На практике в большинстве случаев трудно получить оценку интереса пользователя к конкретному элементу, и иногда у нас может не быть дополнительной информации для построения системы рекомендаций, например, спецификаций продукта или демографической информации пользователя. Например, когда нам нужно построить рекомендательную модель для веб-страниц, а у нас есть только идентификатор файла 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 оценивает элемент {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'], .... ]
Первый кластер в основном состоит из боевиков, драм и приключенческих фильмов.
Вывод
Рекомендация на основе кластеризации с использованием теории графов может быть не идеальным решением при построении рекомендательной системы, но она способна обеспечить хорошее начало для снижения сложности набора данных и может быть встроена в другое приложение системы рекомендаций в качестве разработки функций. техника.
Спасибо за чтение, и желаю вам хорошего дня.