我有一个包含许多用户(超过1000万)的列表,每个用户由一个用户ID表示,后跟10个浮点数表示他们的偏好。我想基于mapreduce使用余弦相似度有效地计算用户相似度矩阵。但是,由于值是浮点数,因此很难确定mapreduce框架中的键。有什么建议吗?
答案 0 :(得分:2)
我认为最简单的解决方案是 Mahout 库。在Mahout中有一些map-reduce相似矩阵作业可能适用于您的用例。
第一个是Mahout的ItemSimilarityJob
,它是推荐系统库的一部分。可以在 here 找到该作业的具体信息。您只需要以所需格式提供输入数据,然后选择VectorSimilarityMeasure
(对于您的情况将是SIMILARITY_COSINE)以及任何其他优化。由于您希望根据十个浮点值的偏好向量计算用户 - 用户相似度,您可以做的是为向量的索引分配一个简单的1到10数字哈希,并生成一个简单的.csv文件vectorIndex,userID,decimalValue作为Mahout项目相似性作业的输入(userID是数字Int或Long值)。结果输出应该是用户标识,用户标识,相似性的制表符分隔文本文件。
第二个解决方案可能是Mahout的RowSimilarityJob
包含在其数学库中。我自己从未使用过它,但有些信息可以在 here 和 previous stackoverflow thread 中找到。您需要将输入数据转换为DistributedRowMatrix
,而不是.csv作为输入,userID是矩阵的行。我相信,输出也将是一个DistributedRowMatrix
序列文件,其中包含您正在寻找的用户 - 用户相似性数据。
我认为哪种解决方案更好取决于您喜欢的输入/输出格式。一切顺利。