3

我有以下设置:

布尔数据:(用户 ID,项目 ID)

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

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

MysqlJdbcInMemorySimilarity 使用 GenericItemSimilarity 加载 memeory 中的项目相似性,其 .allsimilaritems(item) 从 mysql 中预先计算的项目相似性中返回给定项目的所有可能相似项目。我是否需要实现我自己的项目相似性类来返回前 10/20/50 个相似项目。如果用户的号码呢?的喜好继续增长?

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

4

1 回答 1

2

您指的是什么前提条件检查?我没有看到它们;我不确定是否实际上禁止相似性大于 1。但是您似乎在问是否可以创建一个仅返回共现的相似性函数,因为ItemSimilarity它不与 Hadoop 一起使用。是的你可以; 它在项目中不存在。我不建议这样做;LogLikelihoodSimilarity会变得更聪明。

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

如果重新评分很慢,这意味着,嗯,IDRescorer很慢。它被调用了很多次,以至于您肯定需要在内存中缓存任何查找数据。但是,减少上述每个候选者的数量也会减少调用的次数。

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

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

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

于 2012-08-31T15:50:00.547 回答