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

时间:2015-04-25 02:55:12

标签: apache-spark apache-spark-mllib

我在推荐系统中遇到了“全对相似”问题。感谢this databricks blog,似乎RowMatrix可能会提供帮助。

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

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

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

user::item::rating

2)我构建了一个RowMatrix,其中每个稀疏向量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)

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

2 个答案:

答案 0 :(得分:1)

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 :(得分:1)

如果在您的情况下阈值不是那么理想,您可以在IndexedRowMatrix上使用columnSimilarities。这对我很有用。通过这种方式,您可以更好地管理行索引。