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

spark-How can I retrieve item-pair after calculating similarity using RowMatrix

我在推荐系统中遇到了 "all-pairs similarity" 问题。感谢this databricks blog,RowMatrix 似乎可以提供帮助。

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

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

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

user::item::rating

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

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)

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

RowMatrix 可以计算列之间的相似度。所以你必须重新考虑你的构建方法 ratings.map(rating=>(rating.user, (rating.product, rating.rating))).groupByKey() (并相应地遵循以下几行)

然后您将在列中获得产品 ID,您可以调用 columnSimilarities().entries 来检索 product-from,product-to,score 结构。

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

我遇到了和你一样的问题,解决方法如下。

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

  2. 那就简单了。在 columnSimilarities() 的结果中,索引 i 和 j 完全对应于项目 i 和项目 j。

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