推荐系统-01-电影推荐与结果评估

import spark.sql
import org.apache.spark.sql.types._
import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.MatrixFactorizationModel
import org.apache.spark.mllib.recommendation.Rating

// 数据预处理
case class Movie(movieId:Int, title:String, genres:Seq[String])
case class User(userId:Int, gender:String, age:Int, occupation:Int, zip:String)

def parseMovie(str:String):Movie={
    val fields = str.split("::")
    assert(fields.size == 3)
    Movie(fields(0).toInt, fields(1).toString, Seq(fields(2)))
}

def parseUser(str:String):User={
    val fields = str.split("::")
    assert(fields.size == 5)
    User(fields(0).toInt, fields(1).toString, fields(2).toInt, fields(3).toInt, fields(4).toString)
}

def parseRating(str:String):Rating={
    val fields = str.split("::")
    assert(fields.size == 4)
    Rating(fields(0).toInt, fields(1).toInt, fields(2).toInt)
}
// 加载评分文件到RDD, 这个也可以是HADOOP源
val ratingText = sc.textFile("file:/home/hadoop/ml-1m/ratings.dat");
ratingText.first()

// 对原始RDD数据, 进行转换处理,并缓存
val ratingRDD = ratingText.map(parseRating).cache()
// 下面是打印查看一下相关信息
println("Total number of ratings : " + ratingRDD.count())
println("Total number of movies rated : " + ratingRDD.map(_.product).distinct().count())
println("Total number of users who rated moives:" + ratingRDD.map(_.user).distinct().count())

// 将RDD转换成为DataFrame
val ratingDF = ratingRDD.toDF();
// 同理,加载电影信息
val movieDF=sc.textFile("file:/home/hadoop/ml-1m/movies.dat").map(parseMovie).toDF();
// 同理,加载用户信息
val userDF=sc.textFile("file:/home/hadoop/ml-1m/users.dat").map(parseUser).toDF();
ratingDF.printSchema()
movieDF.printSchema()
userDF.printSchema()

// 将DataFrame数据注册临时表, 就可以临时表进行SQL操作
ratingDF.registerTempTable("ratings")
movieDF.registerTempTable("movies")
userDF.registerTempTable("users")

// SQL操作DataFrame数据后,返回DataFrame数据
val result = sql("""select title, rmax, rmin, ucnt from
(select product, max(rating) as rmax, min(rating) as rmin, count(distinct user) as ucnt from ratings group by product) ratingsCNT
join movies on product=movieId
order by ucnt desc""")
result.show()

// SQL操作DataFrame数据后,返回DataFrame数据
val mostActiveUser=sql("""select user, count(*) as cnt
from ratings group by user order by cnt desc limit 10 """)
mostActiveUser.show()
// SQL操作DataFrame数据后,返回DataFrame数据
var result = sql("""select title from ratings join movies on movieId=product
where user=4169 and rating>4""")
result.show()

// ALS(交替最小二乘法)算法处理
// 将评分RDD数据化分成训练集与测试集
val split=ratingRDD.randomSplit(Array(0.8,0.2), 0L)
val trainingSet=split(0).cache()
val testSet=split(1).cache()
trainingSet.count()
testSet.count()

// 这里的RANK是UV间的feature秩, 训练得出模型
val model = (new ALS().setRank(20).setIterations(10).run(trainingSet))

// Array[Rating], 这里注意DF,没有直接的map操作
// 利用模型进行电影推荐
val recomForTopUser=model.recommendProducts(4169,5)
val movieTitle = movieDF.rdd.map(array=>(array(0),array(1))).collectAsMap();
val recomResult=recomForTopUser.map(rating=>(movieTitle(rating.product), rating.rating)).foreach(println)

// 这里MAP运算, 类匹配
val testUserProduct=testSet.map{
    case Rating(user,product,rating) => (user,product)
}
// 对测试集进行预测
val testUserProductPredict=model.predict(testUserProduct)
testUserProductPredict.take(10).mkString("\n")

val testSetPair=testSet.map{
    case Rating(user,product,rating) => ((user,product), rating)
}

val predictionPair=testUserProductPredict.map{
    case Rating(user,product,rating) => ((user,product), rating)
}
// 将测试集的预测评分与测试集给定的评分相减, 统计得出平均错误mae
val joinTestPredict=testSetPair.join(predictionPair)
val mae=joinTestPredict.map{
    case ((user,product),(ratingT,ratingP)) =>
    val err=ratingT-ratingP
    Math.abs(err)
}.mean()

//FP, 过滤一下低分和高分
val fp = joinTestPredict.filter{
    case ((user,product),(ratingT,ratingP)) =>
    (ratingT <= 1 & ratingP >=4)
}
fp.count()

import org.apache.spark.mllib.evaluation._
val ratingTP=joinTestPredict.map{
    case ((user,product),(ratingT,ratingP))=>
    (ratingP,ratingT)
}
// 现测试一下平均绝对误差
val evaluator = new RegressionMetrics(ratingTP)
evaluator.meanAbsoluteError

原文地址:https://www.cnblogs.com/freebird92/p/9038301.html

时间: 2024-11-03 22:13:41

推荐系统-01-电影推荐与结果评估的相关文章

推荐系统-01-Spark电影推荐、评估与部署

原文地址:https://www.cnblogs.com/freebird92/p/9047575.html

《推荐系统》--混合推荐、解释和评估

<Recommender System An Introduction>,第五章,混合推荐方法. <Recommender System An Introduction>,第六章,推荐系统的解释. <Recommender System An Introduction>,第七章,评估推荐系统. 混合推荐方法 如何进行混合推荐,要考虑两个问题:基础的推荐理论框架和系统的混合设计,也就是组合两个以上算法的方法. 推荐理论框架 推荐问题通常可以转换成效用函数rec,预测物品集

MongoDB,HDFS, Spark to 电影推荐

http://www.infoq.com/cn/news/2014/12/mongdb-spark-movie-recommend MovieWeb是一个电影相关的网站,它提供的功能包括搜索电影信息.排名或者电影明星资料等.它拥有10000部电影的信息,70000个用户,和超过1千万的电影评分.借用它的搜索目录,用户可以通过类型分类.排名和片名浏览等方式检索电影.但如何解决电影智能推荐的问题呢?近日MongoDB分享了他们结合Hadoop的经验. MovieWeb基于Python.在构建电影推荐

数据挖掘-MovieLens数据集_电影推荐_亲和性分析_Aprioro算法

[python] view plain copy print? #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Tue Feb  7 14:38:33 2017 电影推荐分析: 使用 亲和性分析方法 基于 Apriori算法 推荐电影 @author: yingzhang """ #读取数据集: http://grouplens.org/datasets/movielen

电商大数据项目-推荐系统实战之推荐算法(三)

电商大数据项目-推荐系统实战(一)环境搭建以及日志,人口,商品分析http://blog.51cto.com/6989066/2325073电商大数据项目-推荐系统实战之推荐算法http://blog.51cto.com/6989066/2326209电商大数据项目-推荐系统实战之实时分析以及离线分析http://blog.51cto.com/6989066/2326214 (七)推荐系统常用算法协同过滤算法协同过滤算法(Collaborative Filtering:CF)是很常用的一种算法,

电影推荐之协同过滤

1.基于内容的推荐 对于基于内容的推荐不多赘述,只说下基本的概念,根据用户已经评分且喜欢(评分高)的电影,为用户推荐和他过去喜欢的电影相似的电影,这里的相似就要依据电影的"内容"来计算了,例如电影的类型等等. 利用到评分预测上,就是对于目标用户A和电影M,从A已经评价过的电影中找到与M相似的电影,利用这些电影的评分来预测用户A对M的评分. 2.协同过滤 协同过滤算法主要分为基于用户的协同过滤算法和基于项目的协同过滤算法. 基于用户的协同过滤通俗的来说呢,就是对于待预测的目标用户A及电影

关于某电影推荐算法专利的吐槽

原谅我是一个有个性的90后,吹毛求疵不是我的菜,吐槽才是我真爱. 最近在做电影推荐算法的评分算法总结,虽然去年某度神的社区比赛有涉及到这样一个题目,就是给定用户对电影的评分数据,以及相关的一些用户数据,然后预测用户对其他电影的评分.根据某社区某些天比赛的排名快照来看,排名靠前大神已经能将误差控制在0.6以下了.下图为佐证: 大神毕竟是大神,作为大神,他们在自己的评分模型上不断的修改,不断的进步~然而,看看某专利上的算法,某专利就是用了SVD结合了KNN的算法,申请了专利,结果呢?看看他的误差曲线

推荐系统的典型推荐案例

转自:https://taozj.org/2016/04/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%85%B8%E5%9E%8B%E6%8E%A8%E8%8D%90%E6%A1%88%E4%BE%8B/ 一.电商 电商类的推荐,首推强大的亚马逊了,其讲求的是了解每个客户,针对客户个性化推荐.当打开自己的推荐列表的时候,不仅显示出推荐的内容.评分,还提供了与用户交互反馈式的方式:我拥有了.我不感兴趣.评分,甚至显示出给你推荐的理由,由此可见亚

【推荐系统篇】--推荐系统介绍和基本架构流程

一.前述 推荐系统是企业中常用的技术,所以系统的掌握推荐系统的知识是很有必要的.本专栏主要讲述手机APP下载的项目. 常用的推荐方法有两个,分别是基于物品的推荐和基于用户的推荐. 基于用户的推荐原理是:跟你喜好相似的人喜欢的东西你也很有可能喜欢(userBaseCF).基于物品的推荐原理是:跟你喜欢的东西类似的东西你也可能喜欢(itemBaseCF). 我们这里用到的是itembaseCF,本质是依据特征找用户喜好规律. 二.协同过滤算法详述 结论:对于用户A,根据用户的历史偏好,这里只计算得出