基于spark机器学习--物品推荐 物品推荐

基于spark机器学习---------物品推荐

物品推荐

[html]  view plain  copy
  1. import org.apache.spark.SparkContext  
  2. import org.apache.spark.mllib.recommendation.{ALS, Rating}  
  3. import org.jblas.DoubleMatrix  
  4.   
  5. /**  
  6.  * Created by LXM55 on 2016/1/26.  
  7.  * 物品推荐  
  8.  */  
  9. object ItemRecommend {  
  10.   def main(args: Array[String]) {  
  11.     val sc = new SparkContext("local", "ItemRecommend Test")  
  12.     val rawData = sc.textFile("testdata/u.data")  
  13.     val rawRatings =rawData.map(_.split("\t").take(3))  
  14.     val ratings = rawRatings.map{  
  15.       case Array(user,movie,rating) =>  
  16.         Rating(user.toInt,movie.toInt,rating.toDouble)  
  17.     }  
  18.     val model = ALS.train(ratings,50,10,0.01);  
  19.     val aMatrix = new DoubleMatrix(Array(1.0,2.0,3.0))  
  20.   
  21.     val itemId = 567  
  22.     val itemFactor = model.productFeatures.lookup(itemId).head  
  23.     val itemVector = new DoubleMatrix(itemFactor)  
  24.     val a = cosineSimilarity(itemVector,itemVector)  
  25.     println("aaa------->"+a)  
  26.   
  27.     //求各个物品的余弦相似度  
  28.     val sims = model.productFeatures.map {  
  29.       case (id, factor) =>  
  30.         val factorVector = new DoubleMatrix(factor)  
  31.         val sim = cosineSimilarity(factorVector,itemVector)  
  32.         (id,sim)  
  33.     }  
  34.   
  35.     //取出567最相似的前10个物品  
  36.     val K = 10  
  37.     val sortedSims = sims.top(K)(Ordering.by[(Int,Double),Double]{  
  38.       case (id,similarity) =>similarity})  
  39.     println(sortedSims.take(10).mkString("\n"))  
  40.   
  41.   
  42.   }  
  43.   
  44.   def cosineSimilarity(vec1:DoubleMatrix,vec2:DoubleMatrix):Double = {  
  45.     vec1.dot(vec2)/(vec1.norm2()*vec2.norm2())  
  46.   }  
  47.   
  48. }  


 

评价推荐结果:

[html]  view plain  copy
  1. package com.bailian.bigdata  
  2.   
  3. import org.apache.spark.SparkContext  
  4. import org.apache.spark.mllib.recommendation.{ALS, Rating}  
  5. import org.jblas.DoubleMatrix  
  6.   
  7. /**  
  8.  * Created by LXM55 on 2016/1/26.  
  9.  * 检查推荐的相似物品  
  10.  */  
  11. object CheckItemRecommend {  
  12.   def main(args: Array[String]) {  
  13.     val sc = new SparkContext("local", "CheckItemRecommend Test")  
  14.     val rawData = sc.textFile("testdata/u.data")  
  15.     val rawRatings =rawData.map(_.split("\t").take(3))  
  16.     val ratings = rawRatings.map{  
  17.       case Array(user,movie,rating) =>  
  18.         Rating(user.toInt,movie.toInt,rating.toDouble)  
  19.     }  
  20.     val model = ALS.train(ratings,50,10,0.01);  
  21.     val aMatrix = new DoubleMatrix(Array(1.0,2.0,3.0))  
  22.   
  23.     val movies = sc.textFile("testdata/u.item")  
  24.     val tittles = movies.map(line => line.split("\\|").take(2))  
  25.       .map(array =>(array(0).toInt,array(1)))  
  26.       .collectAsMap()  
  27.     val itemId = 567  
  28.     println("给定的电影名称为: " + tittles(itemId))  
  29.   
  30.   
  31.     val itemFactor = model.productFeatures.lookup(itemId).head  
  32.     val itemVector = new DoubleMatrix(itemFactor)  
  33.     cosineSimilarity(itemVector,itemVector)  
  34.   
  35.     //求各个物品的余弦相似度  
  36.     val sims = model.productFeatures.map {  
  37.       case (id, factor) =>  
  38.         val factorVector = new DoubleMatrix(factor)  
  39.         val sim = cosineSimilarity(factorVector,itemVector)  
  40.         (id,sim)  
  41.     }  
  42.   
  43.     val K = 10  
  44.     //被推荐那些电影名称及相应相似度  
  45.     val sortedSims2 = sims.top(K+1)(Ordering.by[(Int,Double),Double]{  
  46.       case (id,similarity) =>similarity  
  47.     })  
  48.   
  49.      val  result = sortedSims2.slice(1,11).map{  
  50.       case (id,sim) =>(tittles(id),sim)  
  51.     }.mkString("\n")  
  52.   
  53.     println("被推荐电影为---》 "+result)  
  54.   
  55.   }  
  56.   
  57.   def cosineSimilarity(vec1:DoubleMatrix,vec2:DoubleMatrix):Double = {  
  58.     vec1.dot(vec2)/(vec1.norm2()*vec2.norm2())  
  59.   }  
  60.   
  61. }  



推荐模型效果的评估:K值平均准确率

[html]  view plain  copy
  1. package com.bailian.bigdata  
  2. import org.apache.spark.SparkContext  
  3. import org.apache.spark.mllib.recommendation.{ALS, Rating}  
  4. import org.jblas.DoubleMatrix  
  5.   
  6. /**  
  7.  * Created by LXM55 on 2016/1/26.  
  8.  * 推荐模型效果的评估:K值平均准确率  
  9.  */  
  10. object MAPK {  
  11.   def main(args: Array[String]) {  
  12.     val sc = new SparkContext("local", "MAPK Test")  
  13.     val rawData = sc.textFile("testdata/u.data")  
  14.     val rawRatings = rawData.map(_.split("\t").take(3))  
  15.   
  16.     val ratings = rawRatings.map{  
  17.       case Array(user,movie,rating) =>  
  18.         Rating(user.toInt,movie.toInt,rating.toDouble)  
  19.     }  
  20.   
  21.     val model = ALS.train(ratings,50,10,0.01);  
  22.   
  23.     val moviesForUser = ratings.keyBy(_.user).lookup(789)  
  24.   
  25.     //提取用户实际评价过的电影ID  
  26.     val actualMovies = moviesForUser.map(_.product)  
  27.     println("actualMovies: " + actualMovies)  
  28.   
  29.     //提取推荐的用户列表,K为10  
  30.     val k =10  
  31.     val userId = 789  
  32.     val topKRecs = model.recommendProducts(userId,k)  
  33.     val predictedMovies = topKRecs.map(_.product)  
  34.     val predictedUsers = topKRecs.map(_.user)  
  35.     println("predictedMovies: " + predictedMovies.mkString("\n"))  
  36.    // println("predictedUsers: " + predictedUsers.mkString("\n"))  
  37.   
  38.     //计算平均准确率  
  39.     val apk10 = avgPrecisionK(actualMovies,predictedMovies,10)  
  40.     println("apk10: "+apk10)  
  41.   
  42.   
  43.     val itemFactors = model.productFeatures.map{  
  44.       case(id,factor) => factor  
  45.     }.collect()  
  46.   
  47.     val itemMatrix = new DoubleMatrix(itemFactors)  
  48.     println(itemMatrix.rows,itemMatrix.columns)  
  49.   
  50.     val imBroacast = sc.broadcast(itemMatrix)  
  51.     println("imBroacast: " + imBroacast)  
  52.   
  53.     //每一个用户ID及各自对应的电影ID构成RDD  
  54.     val allRecs = model.userFeatures.map{case (userId,array) =>  
  55.         val userVector = new DoubleMatrix(array)  
  56.         val scores = imBroacast.value.mmul(userVector)  
  57.         val sortedWithId = scores.data.zipWithIndex.sortBy(-_._1)  
  58.         val recommendedIds = sortedWithId.map(_._2 + 1).toSeq  
  59.       (userId,recommendedIds)  
  60.     }  
  61.   
  62.     //获取每一个用户及对应的电影ID  
  63.     val userMovies = ratings.map{  
  64.       case Rating(user,product,rating) =>  
  65.         (user,product)  
  66.     }.groupBy(_._1)  
  67.     //println("userMovies---->"+userMovies)  
  68.   
  69.     //通过join得到:用户都有一个实际和预测的那些电影ID  
  70.      val MAPK = allRecs.join(userMovies).map{case (userId,(predicted,actualWithIds )) =>  
  71.         val actual = actualWithIds.map(_._2).toSeq  
  72.         avgPrecisionK(actual,predicted,k)  
  73.     }.reduce(_ + _) /allRecs.count()  
  74.   
  75.     println("MAPK--------->" + MAPK)  
  76.   
  77.   
  78.     //下面使用spark MLlib内置的评估函数  
  79.   
  80.   
  81.   
  82.   
  83.   }  
  84.   
  85.   //APK代码实现  
  86.   def avgPrecisionK(actual:Seq[Int],predicted:Seq[Int],k:Int):Double = {  
  87.     val predK = predicted.take(k)  
  88.     var score = 0.0  
  89.     var numHits = 0.0  
  90.     for((p,i) <- predK.zipWithIndex){  
  91.       if(actual.contains(p)){  
  92.         numHits += 1.0  
  93.         score += numHits/(i.toDouble + 1.0)  
  94.       }  
  95.     }  
  96.   
  97.     if(actual.isEmpty){  
  98.       1.0  
  99.     }else{  
  100.       score/math.min(actual.size,k).toDouble  
  101.     }  
  102.   }  
  103. }  

注意:参照spark机器学习这本书的例子实现的 有不足之处请指出
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值