美文网首页程序员
sparkMllib的ALS过滤算法

sparkMllib的ALS过滤算法

作者: 飞叔Brother | 来源:发表于2018-07-05 13:53 被阅读38次

依托spark平台完成的电影推荐系统,上代码:

后续有对该程序的参数校调:参数校调程序

该程序应用到的数据:数据

如上述数据找不到,请到群内下载数据:624108656

超级热心的群

package als

import org.apache.log4j.{Level, Logger}

import org.apache.spark.mllib.recommendation.{ALS,MatrixFactorizationModel, Rating}

import org.apache.spark.rdd.RDD

import org.apache.spark.{SparkConf, SparkContext}

/.*

* Created by Weipengfei on 2017/5/3 0003.

* ALS过滤算法

*/

object Recommend {

    def main(args: Array[String]) {

         println("====================数据准备阶段=====================")

         SetLogger

         val (ratings,movieTitle)=PrepareData()

         println("====================训练阶段=====================")

         print("开始使用"+ratings.count().toString+"条评比数据进行训练模型.....")

         val model=ALS.train(ratings ,10,5,0.01)

         println("训练完成!")

         println("====================推荐阶段=====================")

         recommend(model,movieTitle)

    }    

    /.*    

    *针对用户推荐电影

    * @parammodel 训练好的ALS模型

    * @parammovieTitle 电影id与名字的对应表

    * @paraminputUserId 用户id

    */

    def RecommendMovies(model:MatrixFactorizationModel, movieTitle:Map[Int,String], inputUserId:Int): Unit ={

         val recommendMovie=model.recommendProducts(inputUserId,10)//获取针对inputUserId推荐前十部电影

         println("针对用户id:"+inputUserId+" 推荐下列电影:")

         var i=1

         recommendMovie.foreach{

              movie=>println(i.toString+"."+movieTitle(movie.product.toInt)+"评分:"+movie.rating.toString)

              i+=1

         }

    }

    /.*

    *针对电影推荐给用户

    * @parammodel 训练好的ALS模型

    * @parammovieTitle 电影id与名字的对应表

    * @paraminputMovieId 电影id

    */

    def RecommendUsers(model:MatrixFactorizationModel, movieTitle: Map[Int, String],inputMovieId: Int): Unit ={

         val recommendUser=model.recommendUsers(inputMovieId,10)//获取针对inputMovieId推荐前十名用户

         println("针对电影id:"+inputMovieId+" 推荐下列用户id:")

         var i=1

         recommendUser.foreach{

             u=>println(i.toString+".用户id:"+u.user+" 评分:"+u.rating)

             i+=1

         }

    }

    /.*

    *实行具体推荐

    * @parammodel 训练好的推荐模型

    * @parammovieTitle 电影id与名字的对应表

    */

    def recommend(model:MatrixFactorizationModel,movieTitle:Map[Int,String]): Unit ={

         var choose=""

         while(choose!= "3"){

               print("请选择要推荐类型 1.针对用户推荐电影 2.针对电影推荐给感兴趣的用户 3.离开?")

              choose=readLine()

              if(choose=="1"){

                    print("请输入用户id?")

                    val inputUserId=readLine()

                    RecommendMovies(model,movieTitle,inputUserId.toInt)

              }else if(choose=="2"){

                    print("请输入电影的id?")

                   val inputMovieId=readLine()

                   RecommendUsers(model,movieTitle,inputMovieId.toInt)

             }

         }

    }

    /.*

    *设置日志及乱七八糟的配置

    */

    def SetLogger: Unit ={

         System.setProperty("hadoop.home.dir","E:\\John\\hadoop-2.7.3")

        Logger.getLogger("org").setLevel(Level.OFF)

        Logger.getLogger("com").setLevel(Level.OFF)

        System.setProperty("spark.ui.showConsoleProgress","false")

        Logger.getRootLogger.setLevel(Level.OFF)

    }    

    /.*

    * 数据准备

    * @return(RDD[Rating[Int] (用户id,电影id,评分),电影id与名称的对照表)

    */

    defPrepareData():(RDD[Rating],Map[Int,String])={

        val sc=newSparkContext(newSparkConf().setAppName("Recommend").setMaster("local[2]").set("spark.testing.memory","21474800000"))

        //创建用户评分数据

        print("开始读取用户评分数据中...")

        val rawUserData=sc.textFile("hdfs://v100:8020//weipengfei//data//u.data")

        val rawRatings=rawUserData.map(_.split("\t").take(3))

        val ratingsRDD=rawRatings.map{

            caseArray(user,movie,rating) => Rating( user.toInt,movie.toInt,rating.toFloat)

        }

        println("共计:"+ratingsRDD.count().toString+"条评分")

        //创建电影ID和名称对应表

        print("开始读取电影数据中...")

        val itemRDD=sc.textFile("hdfs://v100:8020//weipengfei//data//u.item")

        val moiveTitle=itemRDD.map(_.split("\\|").take(2)).map(array=>(array(0).toInt,array(1))).collect().toMap

        //显示数据记录数

        val numRatings=ratingsRDD.count()

        val numUser=ratingsRDD.map(_.user).distinct().count()

        val numMoive=ratingsRDD.map(_.product).distinct().count()

        println("共计:评分"+numRatings+"条 用户"+numUser+"个电影"+numMoive+"个")

        (ratingsRDD,moiveTitle)

    }

}

相关文章

  • sparkMllib的ALS过滤算法

    依托spark平台完成的电影推荐系统,上代码: 后续有对该程序的参数校调:参数校调程序 该程序应用到的数据:数据 ...

  • SparkMLlib ALS算法

    本次试验使用movieLens数据集的一千万行评分数据进行训练和预测,每个用户取预测评分最高的Top10存入HBa...

  • sparkMllib的ALS过滤算法调校参数

    对源程序的参数校调,下述如有不解,请到群内讨论:624108656 源程序:源程序,上代码: package al...

  • implicit 库 ALS 算法分析

    implicit 库 ALS 算法分析 ALS 算法 推荐模型基于“隐式反馈数据集的协同过滤”一文中描述的算法,其...

  • (9)推荐算法

    (1)ALS交替最小二乘算法 ALS指使用交替最小二乘法求解的协同过滤算法。通过观察到的所有用户给产品...

  • 协同过滤-ALS算法

    ALS算法应用场景 ALS属于数据挖掘,可以做推荐系统,比如电影推荐,商品推荐,广告推荐等. 原理就是给各个指标,...

  • 总结

    1.ALS 2.基于ALS算法的改进 3.实验结果分析 4.结论 1.ALS 1.1ALS算法的基本思想 ALS(...

  • pyspark协同过滤算法(ALS)

    ALS:Alternating Least Square,交替最小二乘法,用于推荐系统 算法原理 假设有一矩阵R,...

  • ALS协同过滤推荐算法【Spark MLlib】

    交替最小二乘法(ALS)是统计分析中最常用的逼近计算的一种算法,其交替计算结果使得最终结果尽可能地逼近真实结果。而...

  • spark自带的ALS算法实现协同过滤

    环境:spark1.6.0 scala2.11.4使用的数据集是tpch数据集 第一步进行文件的读取,将读取到的d...

网友评论

    本文标题:sparkMllib的ALS过滤算法

    本文链接:https://www.haomeiwen.com/subject/exouuftx.html