8

在过去的几天里,我一直在与 Mahout 合作,试图创建一个推荐引擎。我正在从事的项目有以下数据:

  • 1200 万用户
  • 200 万件商品
  • 18M 用户项目布尔推荐
  • 我现在正在试验我们拥有的全套产品的 1/3(即 18M 建议中的 6M)。在我尝试的任何配置中,Mahout 都提供了令人失望的结果。一些建议需要 1.5 秒,而另一些建议需要一分钟以上。我认为推荐的合理时间应该在 100 毫秒左右。

    为什么 Mahout 工作这么慢?
    我正在使用以下 JVM 参数在 Tomcat 上运行应用程序(即使添加它们并没有太大区别):

    -Xms4096M -Xmx4096M -da -dsa -XX:NewRatio=9 -XX:+UseParallelGC -XX:+UseParallelOldGC
    

    以下是我的实验的代码片段:

    用户相似度1:

    DataModel model = new FileDataModel(new File(dataFile));
    UserSimilarity similarity = new CachingUserSimilarity(new LogLikelihoodSimilarity(model), model);
    UserNeighborhood neighborhood = new NearestNUserNeighborhood(10, Double.NEGATIVE_INFINITY, similarity, model, 0.5);
    recommender = new GenericBooleanPrefUserBasedRecommender(model, neighborhood, similarity);
    

    用户相似度2:

    DataModel model = new FileDataModel(new File(dataFile));
    UserSimilarity similarity = new CachingUserSimilarity(new LogLikelihoodSimilarity(model), model);
    UserNeighborhood neighborhood = new CachingUserNeighborhood(new NearestNUserNeighborhood(10, similarity, model), model);
    recommender = new GenericBooleanPrefUserBasedRecommender(model, neighborhood, similarity);
    

    物品相似度1:

    DataModel dataModel = new FileDataModel(new File(dataFile));
    ItemSimilarity itemSimilarity = new LogLikelihoodSimilarity(dataModel);
    recommender = new GenericItemBasedRecommender(dataModel, itemSimilarity);
    
    4

    2 回答 2

    4

    在 Mahout 社区通过其邮件列表的亲切帮助下,我们找到了解决我的问题的方法。所有与解决方案相关的代码都提交到 Mahout 0.6 中。更多详细信息可以在相应的JIRA 票证中找到。

    使用 VisualVM,我发现性能瓶颈在于项目相似性的计算。@Sean 使用非常简单但有效的修复方法解决了这个问题(有关更多详细信息,请参阅SVN 提交

    此外,我们还讨论了如何改进SamplingCandidateItemsStrategy以更好地控制采样率。

    最后,我使用上述修复程序对我的应用程序进行了一些测试。所有建议都用了不到 1.5 秒,绝大多数用时不到 500 毫秒。Mahout 每秒可以轻松处理 100 条建议(我并没有试图强调它)。

    于 2011-12-08T07:56:54.947 回答
    2

    小建议:你的最后一个片段应该使用GenericBooleanPrefItemBasedRecommender.

    对于您的数据集,基于项目的算法应该是最好的。

    这听起来有点慢,而且分钟太长了。罪魁祸首是块状数据;时间可以随着用户提供的评分数量而变化。

    SamplingCandidateItemsStrategy。这将允许您通过面对特别密集的数据进行采样来限制在这方面所做的工作量。您可以将其插入GenericBooleanPrefItemBasedRecommender而不使用默认值。我认为这将为您提供一个提高速度的杠杆,并使响应时间更可预测。

    于 2011-11-23T11:05:28.343 回答