Apache spark spark如何在使用RowMatrix计算相似性后检索项目对
我在推荐系统中遇到了“所有对相似性”问题。多亏了,RowMatrix似乎能帮上忙 但是,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的相似性?虽然它
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)