spark-如何使用RowMatrix计算相似度后检索项目对

Eri*_*eng 7 apache-spark apache-spark-mllib

我在推荐系统中遇到了"全对相似"问题.感谢这个数据库博客,似乎RowMatrix可能会提供帮助.

然而,RowMatrix是没有意义的行索引矩阵类型,因此我不知道如何调用后检索相似结果columnSimilarities(threshold)特定项目i和j

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

1)我的数据文件来自Movielens,格式如下:

user::item::rating
Run Code Online (Sandbox Code Playgroud)

2)我构建了一个RowMatrix,其中每个稀疏向量i代表该项目i的所有用户的评级

val 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)
Run Code Online (Sandbox Code Playgroud)

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

小智 10

我遇到了和你一样的问题,并解决了如下问题.

  1. 你应该注意columnSimilarities()是调用列向量的相似性.但是,我们的"行"总是由行向量组成.所以你应该得到"行"的转置,让我们假设它是"tran_rows".然后计算tran_rows.columnSimilarities()

  2. 事情很简单.在columnSimilarities()的结果中,索引i和j完全对应于项目i和项目j.