Какую технологию хранения/обработки данных использовать для реализация алгоритма схожести предметов (рекомендаций)?

Привет!
Столкнулся с проблемой производительности при реализации алгоритма рекомендаций.

Входные данные:
Есть порядка 60000 записей с оценками пользователей, вида {user_name, item, score} в виде CSV файла на диске, а так же в MongoDB.

Задача:
Для каждой пары предметов рассчитать их схожесть на основе оценок пользователей.

Проблема: Производительность. Пробовал работать с базой данных и вытаскивать оценки для каждой пары, но т.к. всех возможных пар n(n-1)/2, получается слишком долго; много обращений к базе данных. Потом подумал загрузить всё в память и там обсчитывать, но не понятно как маштабировать с увеличением количества оценок (что если все данные не поместятся в память?). Пишу на Node.js, если это важно.

Может, есть специальные технологии для подобной задачи? Подскажите, в каком направлении смотреть:
- более эффективные реализации алгоритма, с малым количеством обращений к базе данных?
- написать какой-то хитрый MapReduce / Aggregate?
- посмотреть базы данных на основе графов?
- что-то другое?

Спасибо!
  • Вопрос задан
  • 2896 просмотров
Решения вопроса 1
В плане теории я бы предложил метод "k-Nearest Neighbours" между покупателями. При этом величину k держать где-то в диапазоне 20-50, и предлагать взвешенно пропорционально степени близости те продукты, которые тоже были положительно оценены k соседями.

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

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

Если интересует мое мнение о формуле расстояния между покупателями или алгоритме средневзвешенного предложения - спрашивайте ...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
AMar4enko
@AMar4enko
А что такое схожесть? Линейное соотношение одного score к другому?
Вы можете сделать MapReduce для начального расчета и обновления оценок, запихать оценку в item и искать по вхождению в некий диапазон.
Главное - полный пересчет каждый раз не делать.
Ответ написан
@mir0shnik
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы