机器学习探索-推荐引擎算法(实验一)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习探索-推荐引擎算法(实验一)相关的知识,希望对你有一定的参考价值。

记录今天在机器学习方向的探索,单位的实验室环境用起来很舒服。赞。

记录我在机器学习领域的每一步成长。// 本次实验素材取自林大贵先生的大数据巨量分析和机器学习整合开发实战。

实验用数据源在文件页面下载。

Let‘s go。

------------------------------------------------------------------------------------------------------------------------------------------------------

假设有一个在线电影网站,会员付费在线观赏电影。公司希望运用大数据分析推荐引擎,增加会员观看影片的次数

以增加营收。

------------------------------------------------------------------------------------------------------------------------------------------------------

一,找出问题。

公司原有推荐系统是人口统计式的推荐,必须具有个人属性数据。基于隐私权的原因,越来越难搜集到正确的个人

属性数据。

二,设计解决方案模型。

使用协同过滤式推荐,通过观察所有会员给影片的评分来推断每个会员的喜好,并向会员推荐合适的影片。

三,搜集数据。

冷启动问题,没有历史记录就没有可分析的数据源。

四,创建模型。

使用ALS推荐算法,解决稀疏矩阵的问题。即使大量用户和产品,也能在合理的时间内完成运算。

 

ALS算法介绍

显式评分,用户给影片的评分。

隐式评分,用户点击次数。

稀疏矩阵,用户与产品项目成千上万,整个矩阵就会很大,而且有很多空白,使用计算机来计算这样的矩阵

很浪费内存,需要花费很多时间。

矩阵分解,把矩阵(m*n) 分解为 矩阵(m*rank)和矩阵(rank*n),(m*n)约等于(m*rank)*(rank*n)

------------------------------------------------------------------------------------------------------------------------------------------------------

下载文件页面中的数据源ml-100k上传至/tmp目录,进入spark-shell。

技术分享图片

导入文件
val rawUserData = sc.textFile("file:/tmp/ml-100k/u.data")

技术分享图片



查看
rawUserData.collect()     rawUserData.foreach(println)
rawUserData.take(5).foreach(println)


u.data字段内容
userid itemid rating timestamp

技术分享图片

查看第一个字段的统计信息
rawUserData.map(_.split(‘\\t‘)(0).toDouble).stats()

技术分享图片



导入训练引擎ALS
import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.Rating

技术分享图片

提取前三个字段信息
val rawRatings = rawUserData.map(_.split(‘\\t‘).take(3))

技术分享图片

 



ALS训练数据的格式是RDD[Rating]数据类型,Rating定义如下:
user,product,rating

 

 创建ratingRDD
val ratingsRDD = rawRatings.map{case Array(user, movie, rating) => Rating(user.toInt,movie.toInt,rating.toDouble)}

技术分享图片

 



使用ALS.train训练

显式训练
ALS.train(ratings:RDD[Rating],rank:Int,iterations:Int,lambda:Double):MatrixFactorizationModel  //Rating 数据源RDD,rank 原矩阵m*n 分解为 m*rank和rank*n矩阵,iterations 计算次数,lambda 建议值0.01,返回数据MatrixFactorizationModel


隐式训练
ALS.trainlmplicit(ratings:RDD[Rating],rank:Int,iterations:Int,lambda:Double):MatrixFactorizationModel

进行显式训练
val model = ALS.train(ratingsRDD,10,10,0.01)

 

使用模型推荐
MatrixFactorizationModel.model.recommendProducts(user:Int,num:Int):Array[Rating]

针对用户推荐
model.recommendProducts(196,5).mkString("\\n")

技术分享图片

查看针对用户推荐评分
model.predict(196,464)

技术分享图片



针对产品推荐给用户
MatrixFactorizationModel.model.recommendUsers(product,num)

实际执行
model.recommendUsers(464,5).mkString("\\n")

显示推荐电影名称

导入文件item
val itemRDD = sc.textFile("/tmp/ml-100k/u.item")

技术分享图片

 



创建ID和电影名称对照表
val movieTitle = itemRDD.map(line => line.split("\\\\|").take(2)).map(array => (array(0).toInt,array(1))).collectAsMap()

 

查看前5条
movieTitle.take(5).foreach(println)

技术分享图片

查看某ID电影名称
movieTitle(146)

显示推荐电影
model.recommendProducts(196,5).map(rating => (rating.product,movieTitle(rating.product),rating.rating)).foreach(println)

技术分享图片

 

至此就完成了spark-shell中的推荐引擎算法。

 






























































以上是关于机器学习探索-推荐引擎算法(实验一)的主要内容,如果未能解决你的问题,请参考以下文章

数据热点美团推荐算法实践:机器学习重排序模型成亮点

我的机器学习/数据挖掘的书单

常用机器学习算法优缺点及应用汇总

机器学习算法比较

探索五大机器学习技术及其应用

机器学习算法--协同过滤算法