Apache spark spark如何在使用RowMatrix计算相似性后检索项目对

Apache spark spark如何在使用RowMatrix计算相似性后检索项目对,apache-spark,apache-spark-mllib,Apache Spark,Apache Spark Mllib,我在推荐系统中遇到了“所有对相似性”问题。多亏了,RowMatrix似乎能帮上忙 但是,RowMatrix是一种没有有意义的行索引的矩阵类型,因此我不知道如何在调用ColumnCompirations(threshold)后检索特定项目I和j的相似性结果 以下是我正在做的一些细节: 1) 我的数据文件来自以下格式: user::item::rating 2) 我建立了一个行矩阵,其中每个稀疏向量I表示所有用户对该项目I的评分 现在我得到一个坐标矩阵相似性。如何获得特定项目I和j的相似性?虽然它

我在推荐系统中遇到了“所有对相似性”问题。多亏了,RowMatrix似乎能帮上忙

但是,RowMatrix是一种没有有意义的行索引的矩阵类型,因此我不知道如何在调用
ColumnCompirations(threshold)
后检索特定项目I和j的相似性结果

以下是我正在做的一些细节:

1) 我的数据文件来自以下格式:

user::item::rating
2) 我建立了一个行矩阵,其中每个稀疏向量I表示所有用户对该项目I的评分


现在我得到一个坐标矩阵
相似性
。如何获得特定项目I和j的相似性?虽然它可以用来检索
RDD[MatrixEntry]
,但我不确定行I和列j是否对应于项I和j。

行矩阵可以计算列之间的相似性。因此,您必须重新考虑构建
ratings.map(rating=>(rating.user,(rating.product,rating.rating)).groupByKey()的方法
(及相应的以下行)

然后,您将在列中拥有产品的ID,您可以调用
columnComplomics()。条目
来检索
产品来源、产品目标、评分结构


如果产品id中有较大的值,则可能需要将值映射到人工索引值上。例如,如果您有3个ID为:1、900000、9000000的产品,则需要将其映射到0、1、2上,然后计算相似性。如果没有此映射,您将计算产品0-9000000之间的相似性,即使您没有这么多。

我遇到了与您相同的问题,并解决了如下问题

  • 您应该注意columnComplications()是调用列向量的相似性。然而,我们的“行”总是由行向量组成。所以你应该得到“行”的转置,让我们假设它是“tran_行”。然后计算tran_rows.columnComparison()

  • 事情就这么简单了。在ColumnComparison()的结果中,索引i和j与项目i和项目j完全对应


  • 如果阈值在您的情况下不太理想,您可以在IndexedRowMatrix上使用ColumnComparison。这对我很有效。这样,您就有了更好的方法来管理行索引

    需要注意的是,columnCompliations()返回一个上三角坐标矩阵,因此条目中只存在(i,j)或(j,i)中的一个。哪一个存在取决于ival dataPath = ... val ratings: RDD[Rating] = sc.textFile(dataPath).map(_.split("::") match { case Array(user, item, rate) => Rating(user.toInt, item.toInt, rate.toDouble) }) val rows = ratings.map(rating=>(rating.product, (rating.user, rating.rating))) .groupByKey() .map(p => Vectors.sparse(userAmount, p._2.map(r=>(r._1-1, r._2)).toSeq)) val mat = new RowMatrix(rows) val similarities = mat.columnSimilarities(0.5)