【发布时间】:2013-09-03 08:53:16
【问题描述】:
我遇到了 Mahout 中预先计算的项目相似性的性能问题。
我有 400 万用户,他们拥有大致相同数量的项目,大约有 1 亿个用户项目偏好。我想根据文档的 TF-IDF 向量的余弦相似度做基于内容的推荐。 由于动态计算速度很慢,我预先计算了前 50 个最相似文档的成对相似度,如下所示:
- 我使用
seq2sparse来生成 TF-IDF 向量。 - 我使用
mahout rowId来生成mahout 矩阵 - 我使用 mahout
rowSimilarity -i INPUT/matrix -o OUTPUT -r 4587604 --similarityClassname SIMILARITY_COSINE -m 50 -ess生成了前 50 个最相似的文档
我使用 hadoop 预先计算所有这些。对于 400 万个项目,输出仅为 2.5GB。
然后我使用docIndex 将reducers 生成的文件的内容加载到Collection<GenericItemSimilarity.ItemItemSimilarity> corrMatrix = ... 以解码文档的ID。它们已经是整数了,但是 rowId 已经从 1 开始解码它们,所以我必须把它取回来。
为了推荐,我使用以下代码:
ItemSimilarity similarity = new GenericItemSimilarity(correlationMatrix);
CandidateItemsStrategy candidateItemsStrategy = new SamplingCandidateItemsStrategy(1, 1, 1, model.getNumUsers(), model.getNumItems());
MostSimilarItemsCandidateItemsStrategy mostSimilarItemsCandidateItemsStrategy = new SamplingCandidateItemsStrategy(1, 1, 1, model.getNumUsers(), model.getNumItems());
Recommender recommender = new GenericItemBasedRecommender(model, similarity, candidateItemsStrategy, mostSimilarItemsCandidateItemsStrategy);
我正在尝试使用有限的数据模型(160 万个项目),但我在内存中加载了所有项目-项目成对相似性。我设法使用 40GB 将所有内容加载到主内存中。
当我想为一位用户做推荐时
Recommender cachingRecommender = new CachingRecommender(recommender);
List<RecommendedItem> recommendations = cachingRecommender.recommend(userID, howMany);
推荐过程经过的时间是554.938583083秒,而且它没有产生任何推荐。现在我真的很担心推荐的表现。我玩过CandidateItemsStrategy 和MostSimilarItemsCandidateItemsStrategy 的数字,但性能没有任何提升。
难道不是预先计算所有内容以加快推荐过程的想法吗?
有人可以帮助我并告诉我我做错了什么以及我做错了什么。
另外,为什么在主内存中加载 parwise 相似性会呈指数级增长?在Collection<GenericItemSimilarity.ItemItemSimilarity> mahout 矩阵的 40GB 主内存中加载了 2.5GB 的文件?我知道这些文件是使用IntWritable、VectorWritable hashMap 键值对文件进行序列化的,并且对于ItemItemSimilarity 矩阵中的每个向量值,该键必须重复,但这有点太多了,你不觉得吗?
提前谢谢你。
【问题讨论】:
标签: mahout recommendation-engine mahout-recommender