协同过滤算法做推荐系统核心代码

代码:

package com.lbw
import java.io.File
import org.apache.log4j.Logger
import org.apache.log4j.Level
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.rdd._
import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.Rating
import org.apache.spark.mllib.recommendation.MatrixFactorizationModel
import scala.collection.immutable.Map
import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.Rating
import scala.util.control.Breaks._
object sparkDemo {
  def main(args: Array[String]) {
        Logger.getLogger("org").setLevel(Level.OFF)                //设置代码打印级别,过滤掉多余的日志
        Logger.getLogger("com").setLevel(Level.OFF)
        System.setProperty("spark.ui.showConsoleProgress","false")
        Logger.getRootLogger().setLevel(Level.OFF)
        val sc=new SparkContext(new SparkConf().setAppName("wordcount").setMaster("local[4]"))     //设置运行环境
        val textFile=sc.textFile("hdfs://spark1:9000/swun/data/u.data")
        val movieRDD=sc.textFile("hdfs://spark1:9000/swun/data/u.item")
        val rawRating=textFile.map(_.split("\t").take(3))             //选择数据
        val ratingRDD=rawRating.map{case Array(user,movie,rating)=>Rating(user.toInt,movie.toInt,rating.toDouble)}
        println("--------开始训练模型----------")
        val model=ALS.train(ratingRDD, 10, 10,0.01)
        println("--------模型训练结束----------")
        println("--------开始推荐阶段----------")
        println("请选择推荐的类型:1:针对用户推荐电影2:针对电影推荐用户,3:退出")
        var choose=readInt()
        while(choose!=3){ 
          if(choose==1){
            print("请输入用户id:")
            val inputUserId=readInt()
            //调用根据用户推荐电影的方法
            user_product(inputUserId,model,movieRDD)
          }else if(choose==2){
            print("请输入电影id:")
            val inputMovieId=readInt()
            //调用根据电影推荐用户的方法
            product_user(inputMovieId,model,movieRDD)
          }
          println("请选择推荐的类型:1:针对用户推荐电影2:针对电影推荐用户,3:退出")
          choose=readInt()
        }
  }
  def user_product(userId:Int,model:MatrixFactorizationModel,movieRDD:RDD[String]){     //根据用户推荐电影的方法
    val movieTotol=movieRDD.map(_.split("\\|").take(2)).map(array=>(array(0).toInt,array(1).toString)).collectAsMap()
    val movieMap=model.recommendProducts(userId,5)
    var i=1
    println("针对用户ID:"+userId+",推荐以下五部电影")
    movieMap.foreach{r =>println(i.toString()+".推荐电影名称:"+movieTotol(r.product)+", 评分:"+r.rating);i=i+1}
    
    println("产品推荐结束")
  }
  def product_user(productId:Int,model:MatrixFactorizationModel,movieRDD:RDD[String]){   //根据电影推荐用户的方法
    val movieTotol=movieRDD.map(_.split("\\|").take(2)).map(array=>(array(0).toInt,array(1).toString)).collectAsMap()
    val userMap=model.recommendUsers(productId, 5) 
    var j=1
    println("针对电影ID:"+productId+",电影名称:"+movieTotol(productId)+"推荐以下五名用户")
    userMap.foreach{i=>println(j+". 推荐用户ID:"+i.user+", 推荐电影评分:"+i.rating);j=j+1}
    println("用户推荐结束")
  }
}

代码运行截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值