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

2024-05-07 15:08

本文主要是介绍基于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机器学习这本书的例子实现的 有不足之处请指出

这篇关于基于spark机器学习--物品推荐 物品推荐的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/967699

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

硬件基础知识——自学习梳理

计算机存储分为闪存和永久性存储。 硬盘(永久存储)主要分为机械磁盘和固态硬盘。 机械磁盘主要靠磁颗粒的正负极方向来存储0或1,且机械磁盘没有使用寿命。 固态硬盘就有使用寿命了,大概支持30w次的读写操作。 闪存使用的是电容进行存储,断电数据就没了。 器件之间传输bit数据在总线上是一个一个传输的,因为通过电压传输(电流不稳定),但是电压属于电势能,所以可以叠加互相干扰,这也就是硬盘,U盘

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa