hadoop - 使用项目相似度 hadoop 作业具有预先计算的项目相似度的基于可扩展实时项目的 mahout 推荐器?

标签 hadoop machine-learning mahout

我有以下设置:

bool 数据:(userid, itemid)

基于 hadoop 的 mahout itemSimilarityJob 具有以下参数: --similarityClassname Similarity_Loglikelihood --maxSimilaritiesPerItem 50 & others (input,output..)

基于项目的 bool 推荐器: -模型 MySqlBooleanPrefJDBCDataModel -相似性 MySQLJDBCInMemoryItemSimilarity -candidatestrategy AllSimilarItemsCandidateItemsStrategy -mostSimilarItemsCandidateStrategy AllSimilarItemsCandidateItemsStrategy

  1. 有没有办法在我的设置中使用相似性共现来获得最终推荐?如果我在作业中插入 SIMILARITY_COOCCURENCE,MySqlJDBCInMemorySimilarity 前提条件检查会失败,因为计数变得大于 1。我知道我可以通过在预先计算的相似性上运行推荐作业来获得最终推荐。有没有办法像使用 MysqlInMemorySimilarity 的相似性对数似然(以及相似性值在 -1 和 1 之间的其他相似性度量)一样使用 api 实时执行此操作?

  2. 我们如何限制最大数量?项目相似性作业中每个项目的相似项目。我在这里的意思是 allsimilaritemscandidatestrategy 调用 .allsimilaritems(item) 来获取所有可能的候选对象。有没有一种方法可以让我使用 API 获得排名前 10/20/50 的相似项目。我知道我们可以将 --maxSimilaritiesPerItem 传递给项目相似性作业,但我不完全确定它代表什么以及它是如何工作的。如果我将其设置为 10/20/50,我是否能够实现上述目标。也有办法通过 api 完成此操作吗?

  3. 我正在使用 rescorer 过滤和重新评分最终推荐。使用 rescorer,对/recommend/userid?howMany=10&rescore={..} 和/similar/itemid?howMany=10&rescore{..} 的调用比 (30-70ms) 的调用时间更长 (300ms-400ms)没有rescorer。我正在使用 Redis 作为内存存储来获取重新评分数据。 rescorer 还接收一些运行时数据,如上所示。在 rescorer 中只有少数检查发生。问题是没有。特定用户的项目偏好增加(> 100),没有。对 isFiltered() 和 rescore() 的调用大幅增加。这主要是因为对于每个用户偏好,对 candidateStrategy.getCandidatItems(item) 的调用会为每个返回大约 (100+) 个相似的项目,并且会为这些项目中的每一个调用 rescorer。因此需要限制工作中每个项目的最大相似项目数。这是正确的还是我在这里遗漏了什么?在这种情况下,优化 rescorer 的最佳方法是什么?

MysqlJdbcInMemorySimilarity 使用 GenericItemSimilarity 在内存中加载项目相似度,其 .allsimilaritems(item) 从 mysql 中预先计算的项目相似度返回给定项目的所有可能相似项目。我是否需要实现自己的项目相似度类以返回排名前 10/20/50 的相似项目。如果用户没有呢?偏好继续增长?

如果有人能告诉我如何实现上述目标,那就太好了?谢谢堆!

最佳答案

您指的是什么先决条件检查?我没有看到他们;我不确定是否真的禁止相似度 > 1。但你似乎在问你是否可以制作一个只返回共现的相似度函数,作为 ItemSimilarity 不与哈多普。是的你可以;它在项目中不存在。我不建议这样做; LogLikelihoodSimilarity 会变得更加智能。

您需要一个不同的 CandidateItemStrategy,特别是查看 SamplingCandidateItemsStrategy 及其 javadoc。但这与Hadoop无关,而不是运行时元素,并且您提到了Hadoop作业的标志。这不是一回事。

如果重新评分很慢,这意味着 IDRescorer 很慢。它被调用了很多次,你当然需要在内存中缓存任何查找数据。但是,减少上述候选人的数量也会减少调用的次数。

不,不要实现你自己的相似性。您的问题不是相似性度量,而是有多少项目被视为候选项目。

我是您所谈论的大部分代码的作者。我认为您正在努力解决大多数人在尝试大规模进行基于项目的工作时遇到的问题。你可以,只要有足够的采样和调整。

不过,我正在将新开发项目投入到另一个名为 Myrrix 的项目和公司中,它正在开发一种基于相同 API 的“下一代”推荐器,但它应该可以在没有这些复杂性的情况下进行扩展,因为它基于矩阵分解。如果您有时间和兴趣,我强烈建议您看看 Myrix。相同的 API,实时服务层是免费/开放的,支持的基于 Hadoop 的计算层也可用于测试。

关于hadoop - 使用项目相似度 hadoop 作业具有预先计算的项目相似度的基于可扩展实时项目的 mahout 推荐器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12216781/

相关文章:

hadoop - 无法更改HDFS DataNode目录

hadoop - 使用 Informatica 将数据从 Teradata 提取到 Hadoop 中的最佳方式是什么?

sql - Hive - 如何检查数字列是否有数字/小数?

Matlab:创建 n 次特征的多项式组合。

java - 象夫 : Normalizing UserSimilarity distances

hadoop - mapreduce应用程序和yarn应用程序之间有什么区别?

python - 使用粒子群优化进行适当的编码

python - 我的 CNN Keras 预测不正确,我不知道该怎么办

java - apache mahout 用于西类牙语文本

java - 错误 : java. lang.ClassNotFoundException : org. apache.mahout.common.RandomWrapper