Эффективное умножение матриц и ранжирование для совместной фильтрации - PullRequest
0 голосов
/ 21 марта 2019

Я работаю над проектом рекомендательной системы и наткнулся на этот пакет C ++, в котором реализована совместная фильтрация для BPR с параллельным SGD (https://github.com/cjlin1/libmf).. Модель выводит матрицу P (#users * k) и Q (#items * k) как .txtя пытаюсь умножить их, чтобы получить оценку R, а затем ранжировать каждую строку, чтобы получить лучшие N рекомендации для каждого клиента.

Пакет, который я использую, не предлагает recommend_top_n API , поэтому я исследовал эффективные решения для умножения больших плотных матриц, включая Spark IndexedRowMatrix и Scipy с файлом .h5.

Размер:

P (300,000 * 32) * Q (32 * 250,000) = R (300,000 * 250,000)и я округлил значения до наименьшего возможного типа (int16). Таким образом, полученная матрица R должна быть около 150 GB. В настоящее время я использую EC2 с 160 GB RAM (m4.10xlarge). И я пишуtop N результатов для каждого пользователя в таблице для панели инструментов, которую нужно взять вместо предложения в качестве веб-сервиса.

Мне было интересно, что будет хорошим решениемВ этом случае?Я думаю, что самый простой способ - это разделить матрицу пользователя или элемента, как алгоритм Штрассена.Но есть ли лучший способ сделать это более элегантно и эффективно, или я должен просто обновить свой EC2?Я не смог найти много материалов о том, как люди решают эту проблему, и мне кажется странным, что для этого не так много реализаций.И это заставляет меня задуматься, есть ли лучшее решение.

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

...