当前位置:   article > 正文

educoder-Spark机器学习

educoder-Spark机器学习

第1关:基于物品的推荐算法

        给用户2推荐2个商品。利用spark.mllib中的矩阵计算库,构建用户与物品的打分矩阵,然后计算物品之间的相似分数,进行推荐。实现基于用户(User CF)的协同过滤算法。

  1. import org.apache.log4j.{Level, Logger}
  2. import org.apache.spark.mllib.linalg.SparseVector
  3. import org.apache.spark.mllib.linalg.distributed.{CoordinateMatrix, IndexedRow, MatrixEntry, RowMatrix}
  4. import org.apache.spark.rdd.RDD
  5. import org.apache.spark.{SparkConf, SparkContext}
  6. object ItemBasedCF {
  7. def main(args: Array[String]): Unit = {
  8. Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
  9. Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
  10. //读入数据
  11. val conf = new SparkConf().setAppName("ItemBasedCFModel").setMaster("local")
  12. val sc = new SparkContext(conf)
  13. val data = sc.textFile("/root/data/als/ratingdata.txt")
  14. /*MatrixEntry代表一个分布式矩阵中的每一行(Entry)
  15. * 这里的每一项都是一个(i: Long, j: Long, value: Double) 指示行列值的元组tuple。
  16. * 其中i是行坐标,j是列坐标,value是值。*/
  17. val parseData: RDD[MatrixEntry] =
  18. data.map(_.split(",") match { case Array(user, item, rate) => MatrixEntry(user.toLong, item.toLong, rate.toDouble) })
  19. //CoordinateMatrix是Spark MLLib中专门保存user_item_rating这种数据样本的
  20. val ratings = new CoordinateMatrix(parseData)
  21. /* 由于CoordinateMatrix没有columnSimilarities方法,所以我们需要将其转换成RowMatrix矩阵,调用他的columnSimilarities计算其相似性
  22. * RowMatrix的方法columnSimilarities是计算,列与列的相似度,现在是user_item_rating,与基于用户的CF不同的是,这里不需要进行矩阵的转置,直接就是物品的相似*/
  23. val matrix: RowMatrix = ratings.toRowMatrix()
  24. //需求:为某一个用户推荐商品。基本的逻辑是:首先得到某个用户评价过(买过)的商品,然后计算其他商品与该商品的相似度,并排序;从高到低,把不在用户评价过
  25. //商品里的其他商品推荐给用户。
  26. //例如:为用户2推荐商品
  27. //第一步:得到用户2评价过(买过)的商品 take(5)表示取出所有的5个用户 2:表示第二个用户
  28. //解释:SparseVector:稀疏矩阵
  29. val user2pred = matrix.rows.take(5)(2)
  30. val prefs: SparseVector = user2pred.asInstanceOf[SparseVector]
  31. val uitems = prefs.indices //得到了用户2评价过(买过)的商品的ID
  32. val ipi = (uitems zip prefs.values) //得到了用户2评价过(买过)的商品的ID和评分,即:(物品ID,评分)
  33. //计算物品的相似性,并输出
  34. val similarities = matrix.columnSimilarities()
  35. val indexdsimilar = similarities.toIndexedRowMatrix().rows.map {
  36. case IndexedRow(idx, vector) => (idx.toInt, vector)
  37. }
  38. //ij表示:其他用户购买的商品与用户2购买的该商品的相似度
  39. val ij = sc.parallelize(ipi).join(indexdsimilar).flatMap {
  40. case (i, (pi, vector: SparseVector)) => (vector.indices zip vector.values)
  41. }
  42. /********** begin **********/
  43. //ij1表示:其他用户购买过,但不在用户2购买的商品的列表中的商品和评分
  44. val ij1 = ij.filter { case (item, pref) => !uitems.contains(item) }
  45. //将这些商品的评分求和,并降序排列,并推荐前两个物品
  46. val ij2 = ij1.reduceByKey(_ + _).sortBy(_.
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/569293
推荐阅读
相关标签
  

闽ICP备14008679号