我在推荐系统中遇到了“全对相似”问题。感谢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 。
答案 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。这对我很有用。通过这种方式,您可以更好地管理行索引。