4

我有一个包含 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);

根据我的基本理解,我相信分解是离线进行的,它会创建用户特征和项目特征。而实际请求是通过对用户向量和所有可能的项目向量进行点积来计算用户的顶级产品来服务的。

我对这种方法有几个疑问:-

  1. 选择分解参数的最佳方法是什么?分解通常需要多长时间?我尝试使用上述参数,分解本身运行了 30+ 分钟。
  2. 有没有办法更快地处理实时请求,因为采用所有可能的项目向量的点积会导致请求时间长?有离线 SVD 之类的东西吗?
  3. 查看我拥有的数据集的大小,我应该尝试其他一些分解器吗?
4

1 回答 1

2

我想一起回答你所有的问题。

鉴于您的数据大小和实时请求,您应该采取另一种方法。

  1. 进行离线项目相似度计算,对于具有大量评级的项目,不需要经常这样做。他们大多不会改变。您可能需要重新计算评分很少的项目。
  2. 使用项目-项目相似度列表实时计算每个用户的用户-项目评分预测。此操作的成本并不高,因为您拥有的项目比用户少得多。当项目大小没有太大变化时,这也是一个常数时间操作。
于 2014-01-07T18:01:14.093 回答