我正在做一个推荐系统端项目,遇到了这个C ++程序包,该程序包使用并行SGD(https://github.com/cjlin1/libmf)对BPR实现了协作过滤。模型将P (#users * k)
和Q (#items * k)
矩阵作为.txt
文件输出。而且我正在尝试将它们相乘以获得估计的R
,然后对每一行进行排名,以获得每个客户的最高N
推荐。
我使用的软件包没有提供 recommend_top_n
API ,因此我一直在研究一种高效的大型密集矩阵乘法解决方案,其中包括带有.h5
的Spark IndexedRowMatrix和Scipy文件。
尺寸:
P (300,000 * 32) * Q (32 * 250,000) = R (300,000 * 250,000)
,然后将值四舍五入为最小的类型(int16
)。因此,所得的R矩阵应在150 GB
附近。我目前正在使用带有160 GB
RAM(m4.10xlarge)的EC2。我正在将每个用户的最高N
结果写到一个表中,供仪表盘使用,而不是作为Web服务提供。
我想知道对于这种情况有什么好的解决方案?我认为最直接的方法是像Strassen算法一样对用户或项目矩阵进行分区。但是,是否有更好的方法可以更优雅,更有效地进行操作,还是应该简单地升级EC2?我找不到很多有关人们如何解决此问题的材料,而且对于我来说,没有太多的实现方法对我来说似乎很奇怪。这让我想知道是否有更好的解决方案。
我的主要代码是Python,但是我很高兴使用任何语言或工具进行矩阵乘法和排名。还是我什至不应该做乘法,而应该尝试使用不同的协作过滤程序包来直接预测最重要的N
个推荐?