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

advertisement
Правительство Российской Федерации
Федеральное государственное автономное образовательное учреждение
высшего профессионального образования
«Национальный исследовательский университет
«Высшая школа экономики»
Факультет Бизнес-информатики
Отделение Прикладной математики и информатики
Кафедра Анализа данных и искусственного интеллекта
ВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ РАБОТА БАКАЛАВРА
на тему
Рекомендательная система на основе узорных структур
Выполнил студент группы 472ПМИ
Корнилов Денис Игоревич
Научный руководитель:
Доцент, к.т.н,
Игнатов Дмитрий Игоревич
Москва 2014
ОГЛАВЛЕНИЕ
Введение ............................................................................................................................................ 3
1.
Анализ формальных понятий .......................................................................................... 6
1.1.
Основные определения............................................................................................................. 6
1.2.
Узорные структуры ..................................................................................................................... 7
1.2.1.
Введение в узорные структуры.................................................................................................. 7
1.2.2.
Интервалы в качестве узоров...................................................................................................... 8
1.2.3.
Интервальные векторы в качестве узоров .......................................................................... 8
1.3.
2.
Выводы и результаты по главе ............................................................................................. 9
Рекомендательные системы и алгоритмы ............................................................. 10
2.1.
Существующие подходы........................................................................................................ 10
2.1.1.
Фильтрация содержимого .......................................................................................................... 10
2.1.2.
Коллаборативная фильтрация ................................................................................................ 11
2.2.
Подход Slope One ....................................................................................................................... 13
2.2.1.
2.3.
Подход на основе узорных структур (RAPS) ................................................................ 16
2.3.1.
2.4.
3.
Модельный пример ........................................................................................................................ 15
Модельный пример ........................................................................................................................ 18
Выводы и результаты по главе .......................................................................................... 19
Машинные эксперименты .............................................................................................. 20
3.1.
Данные ........................................................................................................................................... 20
3.2.
Точность и полнота.................................................................................................................. 21
3.3.
Програмные средства ............................................................................................................. 23
3.4.
Эксперименты и оценка результатов ............................................................................. 25
3.5.
Выводы и результаты по главе .......................................................................................... 26
Список литературы .................................................................................................................... 28
Приложение 1 ............................................................................................................................... 29
Приложение 2 ............................................................................................................................... 30
Приложение 3 ............................................................................................................................... 35
Приложение 4 ............................................................................................................................... 37
Приложение 5 ............................................................................................................................... 39
2
Введение
Прежде всего, необходимо дать определение рекомендательной системы.
Рекомендательные системы – это специальные программы, главная цель
которых заключается в формировании рекомендаций различных продуктов или
сервисов для пользователей на основе их предпочтений [4].
С появлением Интернета сильно выросло количество информации, с
которой люди ежедневно сталкиваются. Это означает, что люди должны
ориентироваться
среди
чрезвычайно
большого
количества
доступных
альтернатив, когда хотят что-либо найти. Например, от выбора нового
мобильного телефона или плеера до поиска кинофильма для вечернего
просмотра. С другой стороны выступают владельцы интернет-магазинов и
сервисов: они заинтересованы в персональной рекламе и рекомендациях
каждому конкретному пользователю, потому что такой подход может
существенно увеличить прибыль компаний. Как результат, в последние годы
интерес к разработке и улучшению существующих рекомендательных систем
значительно вырос.
В наши дни рекомендательные системы уже достаточно распространены и
имеют большое количество применений. В первую очередь, рекомендательные
системы используются в интернет-коммерции для того, чтобы помочь
пользователям выбрать подходящие товары. Такие сервисы собирают
информацию о предпочтениях пользователей и пытаются предложить им
полезные товары. Яркими примерами компаний, использующих данный
подход, являются Amazon, eBay, iTunes и другие. Другое важное применение
рекомендательных систем – это помощь пользователям в выборе книг, музыки
и фильмов. Например, сервисы Pandora, GoodReads, and IMDb используют
рекомендательные системы для этих целей.
3
На данный момент существует множество методов для формирования
рекомендаций, но все они имеют свои преимущества и недостатки [4], [5].
Именно поэтому исследования в данной области актуальны.
Главная задача этой работы – разработка рекомендательной системы
кинофильмов на основе узорных структур и исследование ее практической
полезности. Узорные структуры позволяют использовать методы Анализа
Формальных Понятий для данных со сложными описаниями, например
интервалами или графами [2].
Стоит отметить, что Анализ Формальных Понятий уже применялся при
построении рекомендательных систем на основе коллаборативной фильтрации
[7]. В той работе было разработано два метода, которые использовали решетку
понятий для поиска «ближайших соседей» и прогнозирования. В другой работе
использовали
узорные
структуры
для
поиска
генов
со
схожими
биологическими функциями [3].
Объектом данного исследования являются рекомендательные системы.
Предмет исследования –метод формирования рекомендаций на основе узорных
структур.
Помимо представленного в работе метода рекомендаций на основе
узорных структур, также был рассмотрен и реализован метод рекомендаций
Slope One [6]. Алгоритм Slope One использовался для экспериментальной
проверки метода, разработанного на основе узорных структур.
Для экспериментов использовались свободно распространяемые данные
оценок фильмов MovieLens, которые содержат 100000 оценок от 943
пользователей по 1682 фильмам.
Экспериментальное сравнение разработанного алгоритма и алгоритма
Slope One проводилось для различных наборов параметров по трем критериям:
среднее время работы, средняя точность и средняя полнота.
4
Для проведения экспериментов было написано несколько программ на
языке MATLAB:
 программа,
которая
обрабатывает
начальные
данные
и
преобразовывает их в глобальные матрицы, с которыми работают
все остальные программы.
 программа, которая запускает методы с различными параметрами и
сравнивает полученные результаты в терминах точности и полноты.
 программа, реализующая алгоритм рекомендаций на основе узорных
структур.
 программа, которая реализовывала алгоритм Slope One.
 программа для вычисления точности и полноты.
Результаты
экспериментов
показали,
что
разработанный
метод
рекомендаций на основе узорных структур дает неплохие рекомендации и
применим для практического использования.
Данная работа разбита на три смысловые части. В первой рассматриваются
основные определения Анализа Формальных Понятий и узорных структур. Во
второй части, рассматриваются существующие подходы к рекомендательным
системам, приводятся алгоритм Slope One и алгоритм рекомендаций на основе
узорных структур с примерами применения. Заключительная часть посвящена
проведенным экспериментам и всему с ними связанному.
5
1. Анализ формальных понятий
1.1. Основные определения
Базовые определения анализа формальных понятий мы используем из [1].
Пусть 𝐺 и 𝑀 - некоторые множества, а 𝐼 – бинарное отношение между 𝐺 и
𝑀, такое что 𝐼 ⊆ 𝐺 × 𝑀, то есть – подмножество их декартового произведения.
Тогда тройка (𝐺, 𝑀, 𝐼) называется формальным контекстом. Элементы
множества 𝐺 (𝑔 ∈ 𝐺) принято называть объектами, а элементы множества 𝑀
(𝑚 ∈ 𝑀) называют признаками формального контекста (𝐺, 𝑀, 𝐼). Попросту
говоря, пара (𝑔, 𝑚) ∈ 𝐼 (или 𝑔𝐼𝑚) означает, что 𝑔 и 𝑚 находятся в бинарном
отношении 𝐼 и это можно интерпретировать как “объект 𝑔 имеет признак 𝑚”.
Два оператора ( . )′, определяемые ниже, задают соответствие Галуа между
(2𝐺 , ⊆) и (2𝑀 , ⊆):
𝐴′ = {𝑚 ∈ 𝑀|∀𝑔 ∈ 𝐴: 𝑔𝐼𝑚} для 𝐴 ⊆ 𝐺
(1.1)
𝐵′ = {𝑔 ∈ 𝐺|∀𝑚 ∈ 𝐵: 𝑔𝐼𝑚} для 𝐵 ⊆ 𝑀
(1.2)
Оператор (1.1) для некоторого множества объектов 𝐴 возвращает
максимальное множество признаков, которыми обладает каждый объект из
множества 𝐴. Аналогичным образом, оператор (1.2) для некоторого множества
признаков 𝐵 возвращает максимальное множество объектов, которые обладают
всеми признаками из 𝐵.
Теперь определим формальное понятие. Пара (𝐴, 𝐵), где A ⊆ G и B ⊆ M,
называется формальным понятием, если она удовлетворяет условиям: 𝐴′ = 𝐵 и
𝐵′ = 𝐴. В этом случае множество объектов 𝐴 называется объемом формального
понятия (𝐴, 𝐵) ,
а
множество
признаков 𝐵 называется
содержанием
формального понятия (𝐴, 𝐵).
6
Формальные
понятия
обычно
частично
упорядочены:
(𝐴1 , 𝐵1 ) ≤
(𝐴2 , 𝐵2 ) ⇔ 𝐴1 ⊆ 𝐴2 (⇔ 𝐵2 ⊆ 𝐵1 ). Для данного частичного порядка, множество
всех частично упорядоченных формальных понятий
обозначается как
ℬ(𝐺, 𝑀, 𝐼) и называется решеткой понятий формального контекста (𝐺, 𝑀, 𝐼).
1.2. Узорные структуры
Вся информация в данном разделе взята из источников [2] и [3].
1.2.1.
Введение в узорные структуры
Пусть 𝐺 – некоторое множество объектов, 𝐷 – множество всех возможных
узоров (patterns), которые также называют описаниями объектов. Пусть ⊓ операция сходства (similarity operator). Эта операция позволяет нам работать с
объектами, которые в качестве признаков имеют не бинарные признаки, как в
классическом анализе формальных понятий, а признаки со сложным
описанием, например интервалом или графом. Тогда (𝐷,⊓) полурешетка
пересечений (meet-semi-lattice) описаний объектов. Отображение 𝛿: 𝐺 → 𝐷
сопоставляет объекту 𝑔 описание 𝑑 ∈ (𝐷,⊓).
Тройку (𝐺, (𝐷,⊓), 𝛿) будем называть узорной структурой. Два оператора
( . )☐ определяемые ниже задают соответствие Галуа между (2𝐺 , ⊆) и (𝐷,⊓):
𝐴☐ =⊓𝑔∈𝐴 𝛿(𝑔) для 𝐴 ⊆ 𝐺
(1.3)
𝑑 ☐ = {𝑔 ∈ 𝐺|𝑑 ⊑ 𝛿(𝑔)} для 𝑑 ∈ (𝐷,⊓), где
(1.4)
𝑑 ⊑ 𝛿(𝑔) ⇔ 𝑑 ⊓ 𝛿(𝑔) = 𝑑
Оператор (1.3) будем называть первым оператором Галуа (derivation
operator). Он для множества объектов 𝐴 возвращает общее максимальное
описание (узор) всех объектов из 𝐴. Оператор (1.4) будем называть вторым
оператором Галуа. Он для описания 𝑑 возвращает множество всех объектов,
которые разделяют описание 𝑑.
7
Пара (𝐴, 𝑑), где A ⊆ G и 𝑑 ∈ (𝐷,⊓), называется узорным понятием узорной
структуры (𝐺, (𝐷,⊓), 𝛿) , если она удовлетворяет двум условиям: 𝐴☐ = 𝑑 и
𝑑 ☐ = 𝐴. В этом случае множество объектов 𝐴 называется объемом узорного
понятия (A, d), а описание 𝑑 называется содержанием узорного понятия (𝐴, 𝑑).
Узорные понятия частично упорядочены (𝐴1 , 𝑑1 ) ≤ (𝐴2 , 𝑑2 ) ⇔ 𝐴1 ⊆ 𝐴2 (⇔
𝑑2 ⊑ 𝑑1 ) . Для данного частичного порядка, множество всех частично
упорядоченных узорных понятий формирует решетку узорных понятий
узорной структуры (𝐺, (𝐷,⊓), 𝛿).
1.2.2.
Интервалы в качестве узоров
Очевидно, что реализация операции сходства между двумя интервалами
должна удовлетворять такому условию, что эти два интервала должны лежать в
некотором новом интервале, который содержит исходные. Положим этот
новый интервал будет минимальным интервалом, который содержит два
исходных. Если даны два интервала [𝑎1 , 𝑏1 ] и [𝑎2 , 𝑏2 ] такие, что 𝑎1 , 𝑏1 , 𝑎2 , 𝑏2 ∈
ℝ, 𝑎1 ≤ 𝑏1 и 𝑎2 ≤ 𝑏2 , тогда мы определим операцию сходства двух интервалов
как:
[𝑎1 , 𝑏1 ] ⊓ [𝑎2 , 𝑏2 ] = [min(𝑎1 , 𝑎2 ) , max(𝑏1 , 𝑏2 )]
(1.5)
Откуда очевидно, что:
[𝑎1 , 𝑏1 ] ⊑ [𝑎2 , 𝑏2 ] ⟺ [𝑎1 , 𝑏1 ] ⊓ [𝑎2 , 𝑏2 ] = [𝑎1 , 𝑏1 ]
⟺ [min(𝑎1 , 𝑎2 ) , max(𝑏1 , 𝑏2 )] = [𝑎1 , 𝑏1 ]
(1.6)
⟺ 𝑎1 ≤ 𝑎2 и 𝑏1 ≥ 𝑏2 ⟺ [𝑎1 , 𝑏1 ] ⊇ [𝑎2 , 𝑏2 ]
Также необходимо сделать замечание о том, что действительное число
𝑎 ∈ ℝ можно представить интервалом [𝑎, 𝑎].
1.2.3.
Интервальные векторы в качестве узоров
Будем называть p-размерные векторы интервалов интервальными
векторами. В данном случае для интервальных векторов одинаковой
8
размерности 𝑒 = ⟨[𝑎𝑖 , 𝑏𝑖 ]⟩𝑖∈[1,𝑝] и 𝑓 = ⟨[𝑐𝑖 , 𝑑𝑖 ]⟩𝑖∈[1,𝑝]
определим
операцию
сходства как пересечение соответствующих координат интервальных векторов,
то есть:
𝑒 ⊓ 𝑓 = ⟨[𝑎𝑖 , 𝑏𝑖 ]⟩𝑖∈[1,𝑝] ⊓ ⟨[𝑐𝑖 , 𝑑𝑖 ]⟩𝑖∈[1,𝑝] ⟺ 𝑒 ⊓ 𝑓 = ⟨[𝑎𝑖 , 𝑏𝑖 ] ⊓ [𝑐𝑖 , 𝑑𝑖 ]⟩𝑖∈[1,𝑝]
(1.7)
Следует заметить, что интервальные векторы могут быть также частично
упорядочены:
𝑒 ⊑ 𝑓 ⟺ ⟨[𝑎𝑖 , 𝑏𝑖 ]⟩𝑖∈[1,𝑝] ⊑ ⟨[𝑐𝑖 , 𝑑𝑖 ]⟩𝑖∈[1,𝑝]
(1.8)
⟺ [𝑎𝑖 , 𝑏𝑖 ] ⊑ [𝑐𝑖 , 𝑑𝑖 ] для всех 𝑖 ∈ [1, 𝑝]
1.3. Выводы и результаты по главе
В данной главе были рассмотрены основные определения анализа
формальных понятий и узорных структур. Также были рассмотрены
расширения узорных структур для интервалов и интервальных векторов. В
последующих главах данные определения будут использованы при создании
подхода к формированию рекомендаций на основе узорных структур.
9
2. Рекомендательные системы и алгоритмы
2.1. Существующие подходы
При написание данного раздела использовались источники [4] и [5].
На
сегодняшний
используются
две
день
основные
при
создании
стратегии:
рекомендательных
фильтрация
систем
содержимого
и
коллаборативная фильтрация. Сразу стоит отметить, что на практике обычно
используются
гибридные
методы,
сочетающие
в
себе
преимущества
рассмотренных ниже подходов.
2.1.1.
Фильтрация содержимого
Фильтрация содержимого требует создания профилей для пользователей и
объектов, которые будут рекомендоваться.
Профиль объекта может содержать сотни признаков, отражающих
наиболее полно его свойства. Причем профили объектов заполняются
экспертами
в
конкретной
области.
Например,
в
музыкальных
рекомендательных системах, которые работают на принципе фильтрации
содержимого, объектами являются музыкальные записи, которые имеют такие
признаки,
как
жанр,
исполнитель,
год
создания,
тип
бэк-вокала,
использованные инструменты и так далее. Причем за наполнение всех
признаков в таком случаем отвечают музыкальные аналитики. Профиль
пользователя также может иметь много признаков, но они заполняются обычно
лично пользователем, например в ходе ответов на вопросы анкеты о
музыкальных
предпочтениях.
Также
рекомендательная
система
может
заполнять профиль пользователя, анализируя его прошлые оценки. После того
как профили созданы, рекомендательная система, сопоставляя профили
объектов и пользователей, выдает рекомендации.
10
С одной стороны, использующие данный подход рекомендательные
системы обеспечивают точные рекомендации, потому что они полагаются
исключительно на оценки, данные объектам, и предпочтения именно
конкретного пользователя. Другими словами, рекомендации пользователю не
зависят от оценок остальных пользователей. Также, системы данного типа
способны рекомендовать объекты, которые ранее никем не были оценены,
иначе говоря, такие системы не страдают от проблемы неоцененных объектов.
С другой стороны, рассматриваемые системы имеют и существенные
недостатки. Главным из них является трудность создания профилей объектов.
Это обусловлено тем, что это требует огромных усилий экспертов и сбор
большого количества информации по каждому объекту. Другим недостатком
таких систем является то, что они рекомендуют объекты, похожие на те,
которые ранее были высоко оценены пользователем, то есть они не
рекомендуют что-либо кардинально новое.
2.1.2.
Коллаборативная фильтрация
Другой распространённый подход при построении рекомендательных
систем – коллаборативная фильтрация. При данном подходе не требуется
создавать профили пользователей и объектов, как в рассмотренном выше
подходе. Этот подход базируется на собранных данных о прошлой активности
и
действиях
пользователей.
Рекомендательные
системы
на
основе
коллаборативной фильтрации можно разделить на два типа: системы,
использующие методы «соседства», и использующие методы «латентных
факторов».
Главная идея рекомендательных систем, работающих на методах
«соседства», состоит в том, что они оценивают взаимосвязь между объектами,
или между пользователями. Пользователь-ориентированные системы пытаются
найти пользователей с похожими предпочтениями, тогда как объекториентированные системы оценивают, понравится ли пользователю новый
11
объект на основе его прошлых оценок «соседних» объектов, то есть объектов,
близких по оценкам другими пользователями к данному.
Системы, использующие методы «латентных факторов», пытаются
выявить скрытые зависимости в оценках объектов пользователями для того
чтобы разделить пользователей на группы. При этом используются различные
математические методы классификации и кластеризации. После разбиения
пользователей на группы, если нескольким пользователям в одной группе
понравился новый объект, то рекомендательная система порекомендует этот
объект остальным пользователям в этой группе.
Подход на основе коллаборативной фильтрации также имеет свои
недостатки. Одной из самых острых проблем является «проблема холодного
старта». Это означает, что пользователю необходимо сначала оценить
достаточно большое количество объектов, прежде чем рекомендательная
система сможет дать хорошие рекомендации. Другой важной проблемой
является
разреженность
данных,
что
очень
сильно
влияет
на
производительность таких рекомендательных систем, так как это сильно
снижает вероятность нахождения пользователей (или объектов) со схожими
оценками. Эта проблема возникает вследствие того, что рекомендательные
системы обычно работают с огромным количеством объектов и пользователей.
Например, конкретный пользователь просто физически не может посмотреть и
оценить большинство выходящих в прокат кинофильмов.
12
2.2. Подход Slope One
Slope One – это один из самых простых подходов к рекомендациям на
основе коллаборативной фильтрации по схожести предметов, но в то же время
точность
рекомендаций
алгоритма
сравнима
с
более
сложными
и
ресурсоемкими алгоритмами [6]. Он был разработан Даниелем Лемайром и
Анной Маклахман в 2004 году и опубликован в 2005 году в статье [6].
Slope one будет использоваться в данном исследовании при проведении
экспериментов для сравнения полученных результатов от подхода на основе
узорных структур.
Метод Slope One работает с оценками объектов, полученных от
пользователей. В нашем случае данные представляют собой оценки фильмов
разными пользователями. Если 𝑀 = {𝑚1 , 𝑚2 , … , 𝑚𝑛 } – множество фильмов (в
общем случае, вместо фильмов могут быть любые другие объекты), 𝑈 =
{𝑢1 , 𝑢2 , … , 𝑢𝑘 } – множество пользователей, то оценки оценки пользователя
данные различным объектам удобно представить таблицей:
Таблица 2.1. Оценки фильмов пользователями
…
𝑚𝑛
𝑢1
𝑟1,1
…
𝑟1,𝑗
…
𝑟1,𝑛
…
𝑟𝑖,𝑗
…
𝑟𝑖,𝑛
…
𝑟𝑘,𝑗
…
𝑟𝑘,𝑛
𝑢𝑖
𝑟𝑖,1
…
…
𝑟𝑘,1
…
…
𝑢𝑘
…
𝑚𝑗
…
…
…
𝑚1
…
user\movie
Каждый пользователь посмотрел некоторое количество фильмов и дал
им свою оценку. Оценки 𝑟𝑖,𝑗 могут быть целыми числами от 1 до 5, или, если
пользователь не смотрел фильм, то вместо оценки будет стоять ∗ , то есть
отсутствие оценки.
13
Теперь перейдем непосредственно к алгоритму:
1) На вход алгоритм получает множество оценок всех пользователей
(например как в таблице 2.1.), номер пользователя 𝑡, для которого
будут производиться рекомендации. Также на вход необходимо
отправить левую и правую границу (𝑙𝑒𝑓𝑡_𝑏𝑜𝑟𝑑𝑒𝑟 и 𝑟𝑖𝑔ℎ𝑡_𝑏𝑜𝑟𝑑𝑒𝑟)
оценки искомых фильмов, то есть, если мы хотим получить в
качестве рекомендаций все фильмы с оценками от 4 до 5, то левая и
правая граница должны быть 4 и 5 соответственно. И последнее:
необходимо
задать
минимальную
и
максимальную
оценки
( 𝑚𝑖𝑛_𝑏𝑜𝑟𝑑𝑒𝑟 и 𝑚𝑎𝑥_𝑏𝑜𝑟𝑑𝑒𝑟 ), допустимые в нашей задаче. Здесь
имеется в виду то, что если например алгоритм спрогнозировал для
объекта оценку 6.54, а максимально возможная оценка 5, то 6.54 мы
должны понимать как 5.
2) В первую очередь находим множество всех фильмов оцененных
пользователем 𝑆(𝑢𝑡 ).
3) Для каждого неоцененного фильма 𝑚𝑗 ∈ 𝑀\𝑆(𝑢𝑡 ) пользователем 𝑢𝑡
выполняем шаг 4), тем самым считая прогнозируемую оценку для
фильма 𝑚𝑗 . После этого переходим к шагу 5).
4) Для каждого оцененного пользователем 𝑢𝑡 фильма 𝑚𝑖 ∈ 𝑆(𝑢𝑡 ) ,
находим
𝑆𝑗,𝑖 (𝑈\{𝑢𝑡 }) –
множество
пользователей,
которые
посмотрели фильмы 𝑚𝑖 и 𝑚𝑗 . В случае если множество 𝑆𝑗,𝑖 (𝑈\{𝑢𝑡 })
непустое, то есть мощность множества |𝑆𝑗,𝑖 (𝑈\{𝑢𝑡 })| > 0, считаем
отклонение:
𝑑𝑒𝑣𝑗,𝑖 = ∑𝑢𝑘∈𝑆𝑗,𝑖(𝑈\{𝑢𝑡})
𝑟𝑘,𝑗 −𝑟𝑘,𝑖
|𝑆𝑗,𝑖 (𝑈\{𝑢𝑡 })|
и
добавляем
к
множеству 𝑅𝑗 номер 𝑖.
После того, как подсчитаны все существующие отклонения, считаем
прогнозируемую оценку: 𝑃(𝑢𝑡 )𝑗 =
1
|𝑅𝑗 |
∑𝑖∈𝑅𝑗(𝑑𝑒𝑣𝑗,𝑖 + 𝑟𝑡,𝑖 ), где как уже
было сказано выше 𝑅𝑗 = { 𝑖 | 𝑚𝑖 ∈ 𝑆(𝑢𝑡 ), 𝑖 ≠ 𝑗, |𝑆𝑗,𝑖 (𝑈\{𝑢𝑡 })|> 0 }. В
14
случае,
если
множество 𝑅𝑗
пусто,
спрогнозировать
оценку
невозможно.
5) К
данному
шагу
алгоритм
подсчитал
все
возможные
прогнозируемые оценки 𝑃(𝑢𝑡 ) для фильмов из множества 𝑀\𝑆(𝑢𝑡 ).
Алгоритм рекомедует все фильмы с оценками 𝑙𝑒𝑓𝑡_𝑏𝑜𝑟𝑑𝑒𝑟 ≤
𝑃(𝑢𝑡 )𝑗 ≤ 𝑟𝑖𝑔ℎ𝑡_𝑏𝑜𝑟𝑑𝑒𝑟 , учитывая минимальную и максимальную
допустимые оценки.
Здесь необходимо сделать замечание о том, что если нужно получить
топ-N
рекомендаций,
то
можно
отсортировать
все
полученные
прогнозируемые оценки для объектов по убыванию, и в качестве рекомендаций
взять первые N объектов.
2.2.1.
Модельный пример
Рассмотрим работу алгоритма Slope One на простом примере:
Таблица 2.2. Пример данных для Slope One
user\movie
𝑚1
𝑚2
𝑢1
5
3
𝑢2
3
4
𝑢3
∗
2
Попробуем предсказать оценку 𝑢3 фильму 𝑚1 .
1) Пусть
𝑚3
2
∗
5
𝑙𝑒𝑓𝑡_𝑏𝑜𝑟𝑑𝑒𝑟 = 4 , 𝑟𝑖𝑔ℎ𝑡_𝑏𝑜𝑟𝑑𝑒𝑟 = 5 , 𝑚𝑖𝑛_𝑏𝑜𝑟𝑑𝑒𝑟 = 1 и
𝑚𝑎𝑥_𝑏𝑜𝑟𝑑𝑒𝑟 = 5.
2) Находим 𝑆(𝑢3 ) = {𝑚2 , 𝑚3 } – множество оцененных пользователем
фильмов.
3) 𝑀\𝑆(𝑢3 ) = {𝑚1 }
4) 𝑆1,2 (𝑈\{𝑢3 }) = {𝑢1 , 𝑢2 }
𝑑𝑒𝑣1,2 =
(𝑟1,1 − 𝑟1,2 ) + (𝑟2,1 − 𝑟2,2 ) (5 − 3) + (3 − 4)
=
= 0.5
|{𝑢1 , 𝑢2 }|
2
𝑆1,3 (𝑈\{𝑢3 }) = {𝑢1 }
15
𝑑𝑒𝑣1,3 =
(𝑟1,1 − 𝑟1,3 ) (5 − 2)
=
=3
|{𝑢1 }|
1
𝑅1 = {2, 3}
𝑃(𝑢3 )1 =
1
1
(𝑑𝑒𝑣1,2 + 𝑟3,2 + 𝑑𝑒𝑣1,3 + 𝑟3,3 ) = (0.5 + 2 + 3 + 5) = 5.25
2
|𝑅𝑗 |
5) С учетом максимальной допустимой оценки, алгоритм предсказывает
оценку 5 для фильма 𝑚1 , и следовательно рекомендует посмотреть его
пользователю 𝑢3 .
2.3. Подход на основе узорных структур (RAPS)
Подход к формированию рекомендаций на основе узорных структур
главным образом базируется на теории, представленной в главе 1. Было
принято решение дать ему название RAPS (Recommender Algorithm based on
Pattern Structures).
Данный метод, как и рассмотренный выше метод Slope One, работает с
оценками объектов, полученных от пользователей. Аналогично, если 𝑀 =
{𝑚1 , 𝑚2 , … , 𝑚𝑛 } – множество фильмов, 𝑈 = {𝑢1 , 𝑢2 , … , 𝑢𝑘 } – множество
пользователей, то пользовательские оценки объектов удобно представить
таблицей (𝑟𝑖,𝑗 ) 1≤𝑖≤𝑘 (Таблица 2.1.). Оценки 𝑟𝑖,𝑗 могут быть целыми числами от 1
1≤𝑗≤𝑛
до 5, или, если пользователь не смотрел фильм, то вместо оценки будет стоять
∗, то есть отсутствие оценки.
Опишем сам алгоритм:
1) На вход алгоритм получает множество оценок всех пользователей,
номер
пользователя 𝑡 ,
для
которого
будут
формироваться
рекомендации. Также на вход необходимо отправить левую и
правую границу ( 𝑙𝑒𝑓𝑡_𝑏𝑜𝑟𝑑𝑒𝑟 и 𝑟𝑖𝑔ℎ𝑡_𝑏𝑜𝑟𝑑𝑒𝑟 ) оценки искомых
фильмов, то есть, если мы хотим получить в качестве рекомендаций
16
все фильмы с оценками от 4 до 5, то левая и правая граница должны
быть 4 и 5 соответственно.
2) Определяем множество фильмов 𝑀𝑡 = {𝑚𝑡1 , … , 𝑚𝑡𝑞 }, которые
понравились пользователю, то есть те фильмы, которым
пользователь поставил оценку в интервале от 𝑙𝑒𝑓𝑡_𝑏𝑜𝑟𝑑𝑒𝑟 до
𝑟𝑖𝑔ℎ𝑡_𝑏𝑜𝑟𝑑𝑒𝑟.
3) На этом шаге для каждого фильма 𝑚𝑡𝑖 ∈ 𝑀𝑡 , применяем формулу
1.4., находим множество пользователей, которым этот фильм также
понравился: 𝐴𝑡𝑖 = [𝑙𝑒𝑓𝑡_𝑏𝑜𝑟𝑑𝑒𝑟, 𝑟𝑖𝑔ℎ𝑡_𝑏𝑜𝑟𝑑𝑒𝑟]☐
𝑚𝑡𝑖 для 1 ≤ 𝑖 ≤ 𝑞.
В результате получим набор множеств пользователей: 𝐴𝑡1 , … , 𝐴𝑡𝑞
4) Для каждого множества 𝐴𝑡𝑖 , 1 ≤ 𝑖 ≤ 𝑞 применяем формулу 1.3. с тем
чтобы найти описание (узор), которое в нашем случае будет
интервальным вектором: 𝑑𝑡𝑖 = 𝐴☐
𝑡𝑖 =
⟨[𝑎1𝑡𝑖 , 𝑏1𝑡𝑖 ], … , [𝑎𝑛𝑡𝑖 , 𝑏𝑛𝑡𝑖 ]⟩
для 1 ≤ 𝑖 ≤ 𝑞.
Тут важно отметить, что если у какого-то пользователя 𝑢𝑥 из
множества 𝐴𝑡𝑖 отсутствует оценка какому-либо фильму 𝑚𝑦 , то есть
𝑟𝑥,𝑦 = ∗ , то эта пустая оценка не учитывается.
5) На последнем шаге вычисляем вектор 𝑅 = (𝑅1 , … , 𝑅𝑛 ) ∈ ℝ𝑛
𝑡
𝑡
𝑅𝑗 = |{ 𝑖 | 1 ≤ 𝑖 ≤ 𝑞, [𝑎𝑗 𝑖 , 𝑏𝑗 𝑖 ] ⊆ [𝑙𝑒𝑓𝑡_𝑏𝑜𝑟𝑑𝑒𝑟, 𝑟𝑖𝑔ℎ𝑡_𝑏𝑜𝑟𝑑𝑒𝑟]}|, то
есть для каждого фильма 𝑚𝑗 мы считаем сколько раз его описания
𝑡
𝑡
[𝑎𝑗 𝑖 , 𝑏𝑗 𝑖 ] попали в заданный интервал [𝑙𝑒𝑓𝑡_𝑏𝑜𝑟𝑑𝑒𝑟, 𝑟𝑖𝑔ℎ𝑡_𝑏𝑜𝑟𝑑𝑒𝑟].
Если 𝑅𝑗 > 0, то алгоритм рекомендует фильм к просмотру.
Заметим также, что если необходимо получить топ-N рекомендаций, то
можно отсортировать вектор частоты рекомендаций 𝑅 по убыванию и в
качестве рекомендаций взять первые N объектов.
Проанализируем временную сложность данного алгоритма. Шаг 2)
выполняется за 𝑂(|𝑀|), шаги 3), 4) и 5) за 𝑂(|𝑀| ∗ |𝑈|) каждый. Следовательно,
временная сложность данного алгоритма 𝑂(|𝑀| ∗ |𝑈|).
17
2.3.1.
Модельный пример
Рассмотрим работу алгоритма на примере:
Таблица 2.3. Пример данных для подхода на основе узорных структур
user\movie
𝑚1
𝑚2
𝑚3
𝑚4
𝑚5
𝑚6
𝑢1
5
3
1
3
5
3
𝑢2
4
4
1
5
4
3
𝑢3
5
∗
∗
3
∗
4
𝑢4
∗
3
4
∗
2
4
𝑢5
4
∗
4
5
4
∗
𝑢6
3
4
5
5
∗
3
𝑢7
5
4
2
∗
∗
∗
Попробуем сформулировать рекомендации для пользователя 𝑢7 :
1) На
вход
отправляем
алгоритму: 𝑡 = 7 , 𝑙𝑒𝑓𝑡_𝑏𝑜𝑟𝑑𝑒𝑟 = 4 и
𝑟𝑖𝑔ℎ𝑡_𝑏𝑜𝑟𝑑𝑒𝑟 = 5.
2) 𝑀7 = {𝑚1 , 𝑚2 }
3) 𝐴1 = [4,5]☐
𝑚1 = {𝑢1 , 𝑢2 , 𝑢3 , 𝑢5 }
𝐴2 = [4,5]☐
𝑚2 = {𝑢2 , 𝑢6 }
4) 𝑑1 = 𝐴1☐ = ⟨[𝑎11 , 𝑏11 ], [𝑎21 , 𝑏21 ], [𝑎31 , 𝑏31 ], [𝑎41 , 𝑏41 ], [𝑎51 , 𝑏51 ], [𝑎61 , 𝑏61 ]⟩ =
= ⟨[4,5], [3,4], [1,4], [3,5], [4,5], [3,4]⟩ .
Например
интервал
[𝑎61 , 𝑏61 ]
считали
так:
[𝑎61 , 𝑏61 ] =
[min(𝑟1,6 , 𝑟2,6 , 𝑟3,6 , 𝑟5,6 ) , max(𝑟1,6 , 𝑟2,6 , 𝑟3,6 , 𝑟5,6 )] =
= [min(3,3,4,∗) , max(3,3,4,∗)] = [min(3,3,4) , max(3,3,4)] = [3,4]
.
Аналогично и другие интервалы.
𝑑2 = 𝐴☐
2 = ⟨[3,4], [4,4], [1,5], [5,5], [4,4], [3,3]⟩
5) Исходя из заданных левой и правой границы, из 𝑑1 алгоритм
рекомендует фильмы 𝑚1 и 𝑚5 , из 𝑑2 рекомендует 𝑚2 , 𝑚4 и 𝑚5 .
Следовательно 𝑅 = (1, 1, 0, 1, 2, 0), то есть с учетом уже оцененных
фильмов пользователем 𝑢7 , рекомендуем ему посмотреть 𝑚4 и 𝑚5 .
18
2.4. Выводы и результаты по главе
В данной главе были рассмотрены основные подходы к рекомендациям:
коллаборативная
фильтрация
и
фильтрация
содержимого.
Затем
был
рассмотрен метод рекомендаций Slope One, который в дальнейшем будет
использоваться как базовый при проведении экспериментов. Наконец, был
представлен разработанный подход к формированию рекомендаций на основе
узорных структур (RASP).
19
3. Машинные эксперименты
3.1. Данные
Для практических испытаний разработанного метода рекомендаций на
основе узорных структур (RAPS), было принято решение воспользоваться
свободно распространяемыми данными оценок фильмов, которые были
собраны с сентября 1997 года по апрель 1998 года с помощью вебсайта
MovieLens (movielens.umn.edu). Сбор данных проходил в рамках проекта The
GroupLens Research Project Университета Миннесоты.
В выбранных данных представленно 100000 оценок по 1682 фильмам от
943 различных пользователей. Причем каждый пользователь в этих данных
поставил оценки не менее, чем 20 фильмам.
Данные представляют собой 100000 строк вида:
user id | item id | rating | timestamp
То есть в каждой строке записано: номер пользователя, номер фильма,
оценка, которую пользователь поставил этому фильму, и время, когда это
произошло.
20
3.2. Точность и полнота
Для сравнивания методов рекомендаций Slope One и RAPS первоначально
было принято решение воспользоваться стандартными мерами точности
(precision) и полноты (recall):
𝑟𝑒𝑙𝑒𝑣𝑎𝑛𝑡
𝑟𝑒𝑡𝑟𝑖𝑒𝑣𝑒𝑑
|{
}∩{
}|
𝑚𝑜𝑣𝑖𝑒𝑠
𝑚𝑜𝑣𝑖𝑒𝑠
𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 =
𝑟𝑒𝑡𝑟𝑖𝑒𝑣𝑒𝑑
|{
}|
𝑚𝑜𝑣𝑖𝑒𝑠
(3.1)
𝑟𝑒𝑙𝑒𝑣𝑎𝑛𝑡
𝑟𝑒𝑡𝑟𝑖𝑒𝑣𝑒𝑑
|{
}∩{
}|
𝑚𝑜𝑣𝑖𝑒𝑠
𝑚𝑜𝑣𝑖𝑒𝑠
𝑟𝑒𝑐𝑎𝑙𝑙 =
𝑟𝑒𝑙𝑒𝑣𝑎𝑛𝑡
|{
}|
𝑚𝑜𝑣𝑖𝑒𝑠
(3.2)
Рисунок 3.1. Множества рекомендованных и релевантных фильмов
Но уже в ходе первых проведенных экспериментов стало видно, что
точность метода RAPS получается, в сравнении со Slope One, гораздо меньшей.
Причина была в том, что RAPS каждому пользователю в среднем выдавал на
порядок больше рекомендаций, чем Slope One, и большинство из этих
21
рекомендованных фильмов пользователь не смотрел, и следовательно не
оценивал.
Стало понятно, что так оценивать методы не совсем корректно.
Действительно, если метод порекомендовал фильм, а пользователь его еще не
оценил, то мы не можем точно знать, понравится он ему или нет на самом деле.
Тогда для сравнивания методов рекомендаций Slope One и RAPS была
разработана модификация точности (precision) и полноты (recall), которые мы
будем называть скорректированными точностью и полнотой.
Для каждого конкретного пользователя множество просмотренных им
фильмов разбивается на два множества: множество фильмов, на которых
обучаются алгоритмы (train movies), и множество контрольных фильмов (test
movies). Первое множество состояло из 80% просмотренных фильмов, а второе
соответственно из 20%. Причем фильмы из первого множества были оценены
пользователем ранее, чем фильмы из второго множества. Для такого разбиения
все оценки пользователя были упорядочены по времени проставления и потом
поделены.
Итак, было принято решение скорректированную точность и полноту
рассчитывать по формулам указанным ниже:
𝑡𝑒𝑠𝑡
𝑟𝑒𝑙𝑒𝑣𝑎𝑛𝑡
𝑟𝑒𝑡𝑟𝑖𝑒𝑣𝑒𝑑
|{
}∩{
}∩{
}|
𝑚𝑜𝑣𝑖𝑒𝑠
𝑚𝑜𝑣𝑖𝑒𝑠
𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 = 𝑚𝑜𝑣𝑖𝑒𝑠
𝑡𝑒𝑠𝑡
𝑟𝑒𝑡𝑟𝑖𝑒𝑣𝑒𝑑
|{
}∩{
}|
𝑚𝑜𝑣𝑖𝑒𝑠
𝑚𝑜𝑣𝑖𝑒𝑠
(3.3)
𝑡𝑒𝑠𝑡
𝑟𝑒𝑙𝑒𝑣𝑎𝑛𝑡
𝑟𝑒𝑡𝑟𝑖𝑒𝑣𝑒𝑑
|{
}∩{
}∩{
}|
𝑚𝑜𝑣𝑖𝑒𝑠
𝑚𝑜𝑣𝑖𝑒𝑠
𝑟𝑒𝑐𝑎𝑙𝑙 = 𝑚𝑜𝑣𝑖𝑒𝑠
𝑡𝑒𝑠𝑡
𝑟𝑒𝑙𝑒𝑣𝑎𝑛𝑡
|{
}∩{
}|
𝑚𝑜𝑣𝑖𝑒𝑠
𝑚𝑜𝑣𝑖𝑒𝑠
(3.4)
Такие оценки точности и полноты позволили избежать описанную выше
проблему неопределенности, так как мы не знаем как именно пользователь
22
оценит рекомендованный фильм. В реальной жизни мы бы могли спросить
пользователя, верна ли рекомендация, но в нашем случае мы этого позволить
не можем. Другими словами, при оценке точности и полноты данным методом
мы считаем, что в данный конкретный момент, для заданного пользователя,
фильмов кроме train movies и test movies просто не существует.
Рисунок 3.2. Множества рекомендованных, релевантных и контрольных фильмов
3.3. Програмные средства
Для выполнения сравнительного анализа методов Slope One и RAPS на
языке программирования MATLAB было написано несколько программ:
1) data_load.m – эта маленькая программа загружает исходных данные
и из них создает две разреженные (sparse) матрицы: матрицу оценок
и матрицу времени. Эти матрицы сохраняются как глобальные
переменные и используются при запуске других программ. Код
программы с комментариями приведен в Приложении 1.
23
2) main.m – эта программа разбивает случайным образом исходное
множество пользователей на два: train_users (80%) и test_users
(20%).
Затем для каждого пользователя из
следующие
шаги:
множество
test_users
просмотренных
выполняются
им
фильмов
разбивается на множество фильмов, на которых будут обучаться
алгоритмы (train movies), и множество контрольных фильмов (test
movies) таким образом, как это было описано в разделе 3.2. Далее
запускаются рекомендательные алгоритмы RAPS и Slope One с
различными параметрами. И в конце вычисляются точность и
полнота так же, как описано выше по формулам (3.3) и (3.4). Код
программы с комментариями приведен в Приложении 2.
3) raps.m – эта функция является реализацией алгоритма RAPS
описанного в разделе 2.3. Код функции с комментариями приведен в
Приложении 3.
4) slope_one.m – эта функция является реализацией алгоритма Slope
One описанного в разделе 2.2. Код функции с комментариями
приведен в Приложении 4.
5) precision_and_recall.m – эта функция вычисляет скорректированную
точность и полноту по формулам по формулам (3.3) и (3.4). Код
функции с комментариями приведен в Приложении 5.
Необходимо заметить, что перед всеми написанными программами
ставилась чисто исследовательская задача. В дальнейшем они будут
оптимизированы и усовершенствованы.
24
3.4. Эксперименты и оценка результатов
Как уже говорилось выше, для сравнения алгоритмов RAPS и Slope One мы
воспользовались формулами точности (3.3.) и полноты (3.4.).
Все пользователи были случайным образом поделены на два множества:
на 80% пользователей происходило обучение алгоритмов, а на 20% –
тестирование. Причем, для каждого пользователя из контрольной выборки
множество просмотренных им фильмов также делилось на два: 80% ранее
просмотренных фильмов – для обучения алгоритмов, и 20% последних
просмотренных – для тестирования.
Было проведено три серии тестов:
1) Когда хорошей оценкой считалась только оценка 5 (интервал [5,5]).
2) Оценка считалась хорошей, если она лежала в интервале [4,5].
3) Хорошей оценкой фильма для рекомендации считалась любая
оценка в интервале [3,5].
Все тесты проводились на компьютере под управлением OS X 10.9.3 с
процессором Intel Core i7 2.3 ГГц и 8 ГБ оперативной памяти. Версия MATLAB
– R2013a.
Средние значения результатов получились такими:
Таблица 3.1. Результаты экспериментов
Среднее время, сек Средняя точность, % Средняя полнота, %
RAPS [5,5]
𝟑. 𝟔𝟐
𝟏𝟗. 𝟒𝟐
𝟓𝟎. 𝟓𝟐
Slope One[5,5]
18.37
1.57
23.41
RAPS [4,5]
𝟏𝟖. 𝟐𝟑
𝟓𝟓. 𝟔𝟏
𝟔𝟑. 𝟑𝟑
Slope One[4,5]
18.90
53.99
30.39
RAPS [3,5]
32.98
80.11
𝟖𝟑. 𝟔𝟓
Slope One[3,5]
𝟏𝟖. 𝟓𝟏
𝟖𝟑. 𝟖𝟏
81.88
25
В качестве критериев сравнения методов использовались: среднее время
работы алгоритма в секундах, средняя точность и средняя полнота.
Из таблицы с результатами отчетливо видно, что алгоритм RAPS сильно
опережает Slope One по всем критериям оценивания для начальных параметров
[5,5].
Для параметров [4,5] оба подхода имеют схожее среднее время работы и
точность, но Slope One выдает в два раза менее полные рекомендации.
Для параметров [3,5] алгоритмы имеют схожие средние значения точности
и полноты, но RAPS в среднем выполняет работу в полтора раза медленнее.
Из всего этого мы можем сделать вывод, что разработанный нами метод
рекомендаций на основе узорных структур имеет право на существование.
Метод
Slope
One
уже
давно
применяется
в
реально
работающих
рекомендательных система [6], так что мы вполне можем рекомендовать
разработчикам использовать разработанный нами метод рекомендаций на
основе узорных структур.
3.5. Выводы и результаты по главе
В данной главе были описаны данные, на которых проводились
эксперименты, затем были представлены меры точности и полноты для оценки
работы алгоритмов. Далее были кратко описаны разработанные программы,
код которых приведен в приложении. Наконец
были описаны проводимые
эксперименты и рассмотрены результаты сравнительного анализа методов
рекомендаций Slope One и RASP.
26
Заключение
В данной работе был предложен метод формирования рекомендаций на
основе узорных структур (RAPS). Несмотря на то, что разработанный метод
ориентирован на рекомендацию кинофильмов, его с легкостью можно
использовать и в других областях, где пользователи оценивают какие-то
объекты.
Проведенные эксперименты, сравнивающие методы RAPS и Slope One,
показали, что рекомендательная система на основе узорных структур имеет
достаточно неплохие показатели точности, полноты и время работы.
Безусловно, в дальнейшем будет необходимо сравнить RAPS с другими
существующими алгоритмами рекомендаций для того, чтобы сделать более
полное заключение о его практической применимости.
Работа по данной теме будет продолжена по следующим направлениям:
 Дальнейшее исследование и доработка метода RAPS.
 Исследование
и
разработка
второго
метода
формирования
рекомендаций на основе узорных структур. Есть предположение о
том, что если брать второй оператор Галуа (1.4) не от одного
фильма, как это делается в RAPS, а сразу от нескольких фильмов,
например с высокими оценками, то могут получится хорошие
результаты.
 Сравнение с моделями рекомендательных систем SVD и SVD++.
27
Список литературы
1)
B. Ganter, R. Wille, Formal Concept Analysis, mathematical foundations ed.,
Springer, 1999.
2)
B. Ganter, S.O. Kuznetsov, Pattern structures and their projections,
H.S. Delugach, G. Stumme (Eds.), ICCS, LNCS, vol. 2120, Springer, 2001, pp.
129–142.
3)
Mehdi Kaytoue, Sergei O. Kuznetsov, Amedeo Napoli, Sébastien Duplessis,
Mining gene expression data with pattern structures in formal concept analysis.
Inf. Sci. 181(10), 2011, pp. 1989–2001.
4)
Prem Melville and Vikas Sindhwani, Recommender Systems, Encyclopedia of
Machine Learning, Claude Sammut and Geoffrey Webb (Eds), Springer, 2010.
5)
Yehuda Koren, Robert M. Bell, Chris Volinsky, Matrix Factorization
Techniques for Recommender Systems. IEEE Computer 42(8), 2009, pp. 42-49
6)
Daniel Lemire, Anna Maclachlan, Slope One Predictors for Online RatingBased Collaborative Filtering. SDM, 2005, pp. 471-475
7)
Patrick du Boucher-Ryan, Derek G. Bridge, Collaborative Recommending
using Formal Concept Analysis. Knowl.-Based Syst. 19(5), 2006, pp. 309-315
28
Приложение 1
data_load.m:
Данная программа загружает данные из исходного файла u.data и
преобразует их в две глобальные разреженные матрицы: inf (с оценками) и
timestamp (время проставления оценок), которые потом используются во всех
остальных программах. Код (19 строк):
clc
clear all
global user_num;
global item_num;
user_num=943;
item_num=1682;
S = load('u.data', '-ascii');
global inf;
inf=sparse(user_num,item_num);
global timestamp;
timestamp=sparse(user_num,item_num);
for i=1:size(S,1)
inf(S(i,1),S(i,2))=S(i,3);
timestamp(S(i,1),S(i,2))=S(i,4);
end
clear S;
clear i;
29
Приложение 2
main.m:
Данная программа выполняет следующие действия:
1) Разбивает множество пользователей случайным образом на два
множества train_users и test_users (80% и 20% соответственно).
2) Затем последовательно запускает алгоритм RAPS с параметрами
хороших фильмов [5,5], [4,5], [3,5]. Сохраняет полученные векторы
рекомендаций
number_of_recommendations
для
дальнейшего
подсчета скорректированной точности и полноты, а также сохраняет
затраченное время на каждый запуск. Тут нужно заметить, что
алгоритм запускается для каждого пользователя из тестовой
выборки: 80% первых оцененных фильмов (используем timestamp, в
котором храниться время проставления оценки) идут на обучение
метода, 20% последних оцененных потом будем использовать для
оценивания результатов.
3) Запускаем алгоритм Slope One также для всех пользователей из
тестовой выборки. Аналогично, 80% фильмов каждого пользователя
для обучения. Параметры хороших фильмов для данного алгоритма
здесь не важны, так как он возвращает нам вектор прогнозируемых
оценок для каждого фильма ratings (который мы сохраняем для
каждого пользователя). Рекомендованные фильмы из этих оценок мы
вычислим при выполнении следующего шага.
4) Рассчитываем среднюю точность, полноту и время для алгоритмов
RAPS и Slope One для параметров хороших фильмов [5,5], [4,5],
[3,5].
5) Выводим полученные результаты.
30
Код (221 строка):
clc
global
global
global
global
inf;
timestamp;
user_num;
item_num;
min_border=1;
max_border=5;
%razbivaem ishodnuu viborku polzovateley na dve 80% i 20%
stime = RandStream('mt19937ar','Seed',333);
perm=randperm(stime,user_num);
train_users=(perm(1:round(user_num*0.8)))';
test_users=(perm((round(user_num*0.8)+1):user_num))';
clear stime;
clear perm;
%-----------------------raps55----------------------------------------left_border=5;
right_border=5;
time_raps55=[];
rec_raps55=[];
for i=1:size(test_users,1)
disp([num2str(size(test_users,1)),' ',num2str(i)])
user=test_users(i);
[i1,temp_index]=sort(timestamp(user,:));
clear i1;
temp_n=size(find(timestamp(user,:)),2);
train_items=(temp_index( (item_num-temp_n+1):(round(temp_n*0.8)+item_numtemp_n ) ))';
test_items=(temp_index( (round(temp_n*0.8)+item_num-temp_n+1):item_num ))';
clear temp_n;
clear temp_index;
tic;
[recommendations,number_of_recommendations]=raps(train_items,train_users,user,le
ft_border,right_border,item_num);
time_raps55=[time_raps55; toc];
rec_raps55=[rec_raps55 number_of_recommendations];
end
%----------------------------------------------------------------------
%-----------------------raps45----------------------------------------left_border=4;
right_border=5;
time_raps45=[];
rec_raps45=[];
for i=1:size(test_users,1)
disp([num2str(size(test_users,1)),' ',num2str(i)])
user=test_users(i);
[i1,temp_index]=sort(timestamp(user,:));
clear i1;
temp_n=size(find(timestamp(user,:)),2);
train_items=(temp_index( (item_num-temp_n+1):(round(temp_n*0.8)+item_numtemp_n ) ))';
test_items=(temp_index( (round(temp_n*0.8)+item_num-temp_n+1):item_num ))';
31
clear temp_n;
clear temp_index;
tic;
[recommendations,number_of_recommendations]=raps(train_items,train_users,user,le
ft_border,right_border,item_num);
time_raps45=[time_raps45; toc];
rec_raps45=[rec_raps45 number_of_recommendations];
end
%---------------------------------------------------------------------%-----------------------raps35----------------------------------------left_border=3;
right_border=5;
time_raps35=[];
rec_raps35=[];
for i=1:size(test_users,1)
disp([num2str(size(test_users,1)),' ',num2str(i)])
user=test_users(i);
[i1,temp_index]=sort(timestamp(user,:));
clear i1;
temp_n=size(find(timestamp(user,:)),2);
train_items=(temp_index( (item_num-temp_n+1):(round(temp_n*0.8)+item_numtemp_n ) ))';
test_items=(temp_index( (round(temp_n*0.8)+item_num-temp_n+1):item_num ))';
clear temp_n;
clear temp_index;
tic;
[recommendations,number_of_recommendations]=raps(train_items,train_users,user,le
ft_border,right_border,item_num);
time_raps35=[time_raps35; toc];
rec_raps35=[rec_raps35 number_of_recommendations];
end
%----------------------------------------------------------------------
%-----------------------sp----------------------------------------left_border=4;
right_border=5;
time_sp=[];
rec_sp=[];
for i=1:size(test_users,1)
disp([num2str(size(test_users,1)),' ',num2str(i)])
user=test_users(i);
[i1,temp_index]=sort(timestamp(user,:));
clear i1;
temp_n=size(find(timestamp(user,:)),2);
train_items=(temp_index( (item_num-temp_n+1):(round(temp_n*0.8)+item_numtemp_n ) ))';
test_items=(temp_index( (round(temp_n*0.8)+item_num-temp_n+1):item_num ))';
clear temp_n;
clear temp_index;
tic;
[recommendations,ratings]=slope_one(train_items,train_users,user,left_border,rig
ht_border,min_border,max_border,item_num);
32
time_sp=[time_sp; toc];
rec_sp=[rec_sp ratings];
end
%----------------------------------------------------------------------
%-----------------------precision and recall-----------------------precision_all_raps55=[];
recall_all_raps55=[];
precision_all_sp55=[];
recall_all_sp55=[];
precision_all_raps45=[];
recall_all_raps45=[];
precision_all_sp45=[];
recall_all_sp45=[];
precision_all_raps35=[];
recall_all_raps35=[];
precision_all_sp35=[];
recall_all_sp35=[];
for i=1:size(test_users,1)
%disp([num2str(size(test_users,1)),' ',num2str(i)])
user=test_users(i);
[i1,temp_index]=sort(timestamp(user,:));
clear i1;
temp_n=size(find(timestamp(user,:)),2);
train_items=(temp_index( (item_num-temp_n+1):(round(temp_n*0.8)+item_numtemp_n ) ))';
test_items=(temp_index( (round(temp_n*0.8)+item_num-temp_n+1):item_num ))';
clear temp_n;
clear temp_index;
left_border=5;
right_border=5;
recommendations=find(rec_raps55(:,i));
[precision,recall]=precision_and_recall(user,test_items,recommendations,left_bor
der,right_border);
precision_all_raps55=[precision_all_raps55;precision];
recall_all_raps55=[recall_all_raps55;recall];
recommendations=find(rec_sp(:,i)>=left_border);
[precision,recall]=precision_and_recall(user,test_items,recommendations,left_bor
der,right_border);
precision_all_sp55=[precision_all_sp55;precision];
recall_all_sp55=[recall_all_sp55;recall];
left_border=4;
right_border=5;
recommendations=find(rec_raps45(:,i));
[precision,recall]=precision_and_recall(user,test_items,recommendations,left_bor
der,right_border);
33
precision_all_raps45=[precision_all_raps45;precision];
recall_all_raps45=[recall_all_raps45;recall];
recommendations=find(rec_sp(:,i)>=left_border);
[precision,recall]=precision_and_recall(user,test_items,recommendations,left_bor
der,right_border);
precision_all_sp45=[precision_all_sp45;precision];
recall_all_sp45=[recall_all_sp45;recall];
left_border=3;
right_border=5;
recommendations=find(rec_raps35(:,i));
[precision,recall]=precision_and_recall(user,test_items,recommendations,left_bor
der,right_border);
precision_all_raps35=[precision_all_raps35;precision];
recall_all_raps35=[recall_all_raps35;recall];
recommendations=find(rec_sp(:,i)>=left_border);
[precision,recall]=precision_and_recall(user,test_items,recommendations,left_bor
der,right_border);
precision_all_sp35=[precision_all_sp35;precision];
recall_all_sp35=[recall_all_sp35;recall];
end
disp(['time_raps55 = ',num2str(sum(time_raps55)/size(test_users,1)) ]);
disp(['precision_average_raps55 =
',num2str(sum(precision_all_raps55)/size(test_users,1))])
disp(['recall_average_raps55 =
',num2str(sum(recall_all_raps55)/size(test_users,1))])
disp(' ')
disp(['time_sp55 = ',num2str(sum(time_sp)/size(test_users,1)) ]);
disp(['precision_average_sp55 =
',num2str(sum(precision_all_sp55)/size(test_users,1))])
disp(['recall_average_sp55 =
',num2str(sum(recall_all_sp55)/size(test_users,1))])
disp(' ')
disp(['time_raps45 = ',num2str(sum(time_raps45)/size(test_users,1)) ]);
disp(['precision_average_raps45 =
',num2str(sum(precision_all_raps45)/size(test_users,1))])
disp(['recall_average_raps45 =
',num2str(sum(recall_all_raps45)/size(test_users,1))])
disp(' ')
disp(['time_sp45 = ',num2str(sum(time_sp)/size(test_users,1)) ]);
disp(['precision_average_sp45 =
',num2str(sum(precision_all_sp45)/size(test_users,1))])
disp(['recall_average_sp45 =
',num2str(sum(recall_all_sp45)/size(test_users,1))])
disp(' ')
disp(['time_raps35 = ',num2str(sum(time_raps35)/size(test_users,1)) ]);
disp(['precision_average_raps35 =
',num2str(sum(precision_all_raps35)/size(test_users,1))])
disp(['recall_average_raps35 =
',num2str(sum(recall_all_raps35)/size(test_users,1))])
disp(' ')
disp(['time_sp35 = ',num2str(sum(time_sp)/size(test_users,1)) ]);
disp(['precision_average_sp35 =
',num2str(sum(precision_all_sp35)/size(test_users,1))])
disp(['recall_average_sp35 =
34
',num2str(sum(recall_all_sp35)/size(test_users,1))])
%--------------------------------------------------------------------------
Приложение 3
raps.m:
Этой функции на вход подается: множество оценок объектов данного
пользователя (на которых происходит обучение), пользователи (на оценках
которых обучаемся), номер пользователя (для которого хотим выдать
рекомендации), левая и правая границы оценок хороших фильмов, количество
имеющихся в базе объектов (фильмов). Эта функция работает с глобальной
матрицей матрицей inf (определена выше). Алгоритм работает также, как и
описано в разделе 2.3. На выходе: recommendations (список рекомендуемых
фильмов), number_of_recommendations (сколько раз порекомендован каждый
фильм).
Код (68 строк):
function
[recommendations,number_of_recommendations]=raps(items,train_users,user,left_bor
der,right_border,item_num)
global inf;
% %granici description
recommendations=[];
number_of_recommendations=zeros(item_num,1);
for k=1:size(items,1)
item=items(k);
if ((inf(user,items(k))>=left_border)&&(inf(user,items(k))<=right_border))
dleft=zeros(item_num,1);
dright=zeros(item_num,1);
% %nahodim polzovateley, kotorie ocenili film 'item'
set_users=[];
temp_index=find(inf(:,item));
for i=1:size(temp_index,1)
if ( (isempty( find( train_users==temp_index(i) ) )==false) && ...
(inf(temp_index(i),item)>=left_border)&&(inf(temp_index(i),item)<=right_border)
)
set_users=[set_users; temp_index(i)];
end
end
size(set_users);
set_users;
35
% % sozdaem description na osnove etih polzovateley
for i=1:size(set_users,1)
temp_index=find(inf(set_users(i),:));
for j=1:size(temp_index,2)
item_i=temp_index(j);
item_r=inf(set_users(i),temp_index(j));
if ((dleft(item_i)==0)&&(dright(item_i)==0))
dleft(item_i)=item_r;
dright(item_i)=item_r;
elseif (dleft(item_i)>item_r)
dleft(item_i)=item_r;
elseif ((dleft(item_i)<item_r)&&(dright(item_i)<item_r))
dright(item_i)=item_r;
end
end
end
%dleft
%dright
% % vozvrashaem filmi, u kotorih granici >=left_border&&<=right_border
for i=1:item_num
if ( (dleft(i)>=left_border)&&(dright(i)<=right_border) )
number_of_recommendations(i)=number_of_recommendations(i)+1;
end
end
end
end
number_of_recommendations;
recommendations=find(number_of_recommendations);
for k=1:size(items,1)
recommendations(recommendations==items(k))=[];
end
end
36
Приложение 4
slope_one.m:
Этой функции на вход подается: множество оценок объектов данного
пользователя (на которых происходит обучение), пользователи (на оценках
которых обучаемся), номер пользователя (для которого хотим выдать
рекомендации), левая и правая границы оценок хороших фильмов, левая и
правая границы возможных (в данной модели) оценок, количество имеющихся
в базе объектов (фильмов). Эта функция работает с глобальной матрицей
матрицей inf (определена выше). Алгоритм работает также, как и описано в
разделе 2.2. На выходе: recommendations (список рекомендуемых фильмов),
ratings (вектор прогнозируемых оценок для каждого фильма).
Код (65 строк):
function
[recommendations,ratings]=slope_one(train_items,train_users,user,left_border,rig
ht_border,min_border,max_border,item_num)
global inf;
ratings=zeros(item_num,1);
for i=1:size(train_items,1)
ratings(train_items(i))=inf(user,train_items(i));
end
ratings;
for i=1:item_num
if (ratings(i)==0)
P=0;%prognoz
R=0;
for j=1:size(train_items,1)
temp=(inf(train_users,i)).*inf(train_users,train_items(j));
temp_index=find(temp);%ishem S_j,i(train_items)
temp=inf(train_users,i)-inf(train_users,train_items(j));
card=size(temp_index,1);
if (card>0)
dev=0;
for k=1:card
dev=dev+temp(temp_index(k));
end
dev=dev/card;
P=P+dev+inf(user,train_items(j));
R=R+1;
end
end
if (R>=1)
37
P=P/R;
ratings(i)=P;
end
end
end
%ratings
recommendations=[];
for i=1:item_num
r=ratings(i);
if (r<min_border)
r=min_border;
end
if (r>max_border)
r=max_border;
end
if ((r>=left_border)&&(r<=right_border))
recommendations=[recommendations; i];
end
end
recommendations;
for k=1:size(train_items,1)
recommendations(recommendations==train_items(k))=[];
end
end
38
Приложение 5
precision_and_recall.m:
Эта функция вычисляет скорректированную точность и полноту как в
разделе 3.2. Этой функции на вход подается: номер пользователя, множество
оценок объектов данного пользователя (на которых происходит тестирование),
полученные рекомендованные фильмы, левая и правая границы оценок
хороших фильмов. Эта функция также работает с глобальной матрицей
матрицей inf (определена выше). На выходе: precision (скорректированная
точность), recall ( скорректированная полнота)
Код (35 строк):
function
[precision,recall]=precision_and_recall(user,test_items,retrieved_items,left_bor
der,right_border)
global inf;
for i=size(retrieved_items,1):-1:1
if (isempty( find(retrieved_items(i)==test_items) )==true)
retrieved_items(i)=[];
end
end
relevant_items=[];
for i=1:size(test_items,1)
if ( (inf(user, test_items(i))>=left_border)&&(inf(user,
test_items(i))<=right_border) )
relevant_items=[relevant_items; test_items(i)];
end
end
%retrieved_items
%relevant_items
if (isempty(relevant_items)==true)
precision=0;
recall=1;
elseif (isempty(retrieved_items)==true)
precision=0;
recall=0;
else
temp=0;
for i=1:size(retrieved_items,1)
if ( isempty( find(relevant_items==retrieved_items(i)) )==false )
temp=temp+1;
end
end
precision=temp/size(retrieved_items,1);
recall=temp/size(relevant_items,1);
end
39
end
40
Download