Я работаю над проектом рекомендательной системы и наткнулся на этот пакет 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
?