我有一个包含 5000 万用户偏好的数据集,其中包含 800 万不同的用户和 180K 不同的产品。我目前正在使用一个布尔数据模型,并且有一个基本的基于 tanimoto 相似性的推荐器。我正在尝试探索不同的算法以获得更好的建议,并从带有 ALSWR 分解器的 SVD 开始。我使用了 mahout 中提供的基本 SVD 推荐器,如下所示。
DataModel dataModel = new FileDataModel("/FilePath");
ALSWRFactorizer factorizer = new ALSWRFactorizer(dataModel, 50, 0.065, 15);
recommender = new SVDRecommender(dataModel, factorizer);
根据我的基本理解,我相信分解是离线进行的,它会创建用户特征和项目特征。而实际请求是通过对用户向量和所有可能的项目向量进行点积来计算用户的顶级产品来服务的。
我对这种方法有几个疑问:-
- 选择分解参数的最佳方法是什么?分解通常需要多长时间?我尝试使用上述参数,分解本身运行了 30+ 分钟。
- 有没有办法更快地处理实时请求,因为采用所有可能的项目向量的点积会导致请求时间长?有离线 SVD 之类的东西吗?
- 查看我拥有的数据集的大小,我应该尝试其他一些分解器吗?