Основной задачей рекомендательной системы является информирование пользователя о товаре, который ему может быть интересен в данный момент. Это может быть как основная, так и вспомогательная функциональность сервиса. Цель данной работы – создать сервис, который на основе текста, может рекомендовать те или иные товары. Т.е. если пользователь хочет купить молоко, то он порекомендует еще взять хлопья.
В центре рекомендательной системы находится так называемая матрица предпочтений. Это матрица, по одной из осей которой отложены все клиенты сервиса (Users), а по другой – объекты рекомендации (Items). На пересечении некоторых пар (user, item) данная матрица заполнена оценками (Ratings) – это известный нам показатель заинтересованности пользователя в данном товаре, выраженный по заданной шкале (например от 1 до 5).

Т.к. шаблоны потребления у людей разные, то принято разделять товары на две группы: повторяемые и неповторяемые.
Если продукт нельзя явно отнести к одному из классов, имеет смысл определять допустимость повторных покупок индивидуально.
Проблема холодного старта.
Одной из проблем, с которой мы столкнулись – проблема холодного старта. Холодный старт – это типичная ситуация, когда ещё не накоплено достаточное количество данных для корректной работы рекомендательной системы.
В данной работе мы будем рассчитывать по каждому рейтингу интервалы достоверности.
Чем больше оценок, тем меньше вариация среднего, значит, более точные данные мы получим. В качестве рейтинга товара будем выводить нижнюю границу интервала. Интервалы будем считать по алгоритму: Wilson Confidence Interval.

По горизонтали отложена оценка среднего значения рейтинга, по вертикали — разброс вокруг среднего значения.
Content-based рекомендации
Персональные рекомендации предполагают максимальное использование информации о предыдущих покупках пользователя.
Неструктурированные признаки описываются типичным для текста способом – векторами в пространстве слов (Vector-Space model). Каждый элемент такого вектора – признак, потенциально характеризующий интерес пользователя. Аналогично, продукт – вектор в том же пространстве.
По мере взаимодействия пользователя с системой (скажем, он покупает фильмы), векторные описания приобретенных им товаров объединяются (суммируются и нормализуются) в единый вектор и, таким образом, формируется вектор его интересов. Далее достаточно найти товар, описание которого наиболее близко к вектору интересов, т.е. решить задачу поиска n ближайших соседей. Не все элементы одинаково значимы: например, союзные слова, очевидно, не несут никакой полезной нагрузки. Поэтому при определении числа совпадающих элементов в двух векторах все измерения нужно предварительно взвешивать по их значимости. Для решения данной задачи будем использовать преобразование TF-IDF, которое назначает больший вес более редким интересам. Совпадение таких интересов имеет большее значение при определении близости двух векторов, чем совпадение популярных.
В качестве меры близости двух векторов, будем использовать косинусовое расстояние.
Косинусевое расстояние актуально в данном случае, т.к. если два вектора сонаправлены (т.е. угол между ними нулевой), то косинус угла между ними равен единице. И наоборот, косинус угла между перпендикулярными векторами равен нулю.
Стандартизация данных (scaling)
Поскольку все пользователи оценивают по-разному – кто-то всем подряд пятерки ставит, а от кого-то четверки редко дождешься – перед расчетом данные лучше нормализовать, т.е. привести к единой шкале, чтобы алгоритм мог корректно сравнивать их между собой.
Естественно, предсказанную оценку затем нужно будет перевести в исходную шкалу обратным преобразованием (и, если нужно, округлить до ближайшего целого числа).
Нормализовать можно несколькими способами:
- центрированием (mean-centering) — из оценок пользователя просто вычитаем его среднюю оценку,
* актуально только для небинарных матриц
- стандартизацией (z-score) — в добавок к центрированию делим оценку ее на стандартное отклонение у пользователя,
* здесь после обратного преобразования рейтинг может выйти за пределы шкалы (т.е. например, 6 по пятибальной шкале), но такие ситуации довольно редки и решаются просто округлением в сторону ближайшей допустимой оценки.
- двойной стандартизацией — первый раз нормируем оценками пользователя, второй раз — оценками товара.