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

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

Совместная фильтрация на основе пользователей

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

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

Мы вычисляем рейтинг пользователя u для элемента i по взвешенной сумме оценок всех других пользователей для элемента i следующим образом:

Для функции подобия есть две очень распространенные меры: корреляция Пирсона и косинусное сходство. Косинусное сходство - это, по сути, угол между векторами двух пользователей.

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

Совместная фильтрация на основе элементов

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

От элемента к элементу Фильтрация

Мы можем расширить совместную фильтрацию на основе элементов, рекомендуя аналогичные элементы для целевого элемента. Это основа для рекомендаций "похожие продукты", которые отображаются на Amazon, когда вы переходите на страницу продукта. Эти рекомендации генерируются путем вычисления матрицы сходства между всеми элементами и поиска K ближайших элементов к целевому элементу (ближайшего на основе оценки схожести).

Факторизация матрицы

Факторизация матрицы обычно применяется в контексте уменьшения размерности: мы стараемся уменьшить размерность наших данных, сохраняя при этом как можно больше информации. Это может быть достигнуто с помощью анализа главных компонентов (PCA), разложения по сингулярным значениям (SVD) или чередующихся наименьших квадратов (ALS), которые мы будем использовать в этом проекте.

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

Если матрица элементов пользователя R имеет размер M x N, тогда мы хотим иметь матрицу пользователя U и матрицу элементов V размеров M x K и K x N соответственно с K ‹N. Две матрицы U и V называются скрытыми характеристиками пользователя и скрытыми характеристиками элемента. Мы не хотим, чтобы произведение U и V было точно равно `R`, но мы хотим минимизировать ошибку разницы, а также применить некоторую регуляризацию, чтобы убедиться, что мы не переусердствуйте с тренировочными данными. Выразим все это некоторыми уравнениями:

Мы хотим оценить матрицу оценок `R` как можно точнее с помощью пользовательской матрицы X и матрицы элементов Y:

И мы хотим минимизировать разницу между реальной и оценочной матрицами рейтингов, а также дополнительные условия регуляризации для X и Y.

Чтобы минимизировать нашу функцию потерь, мы ALS. Основная идея состоит в том, что на каждой итерации мы фиксируем один из векторов как константу и оптимизируем для другого, а затем делаем наоборот. Отсюда и произошло название «Альтернативный метод наименьших квадратов».

Когда мы фиксируем Y и оптимизируем X, взяв производную на 0 для функции потерь, мы получаем

Затем мы фиксируем X с оптимизированным значением из предыдущего шага и оптимизируем Y, взяв производную на 0 для функции потерь, которую мы получаем

Запустив алгоритм на несколько итераций, мы достигаем сходимости. У этого алгоритма есть 3 параметра, которые необходимо настроить: количество скрытых факторов, которые необходимо сохранить, количество итераций, для которых необходимо запустить ALS, и срок регуляризации. Их необходимо оптимизировать на основе данных.

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

Этот пост изначально был размещен в моем блоге. Если вам понравился этот пост, спасибо, подпишитесь на меня, чтобы получать будущие посты из этой серии.