记录今天在机器学习方向的探索,单位的实验室环境用起来很舒服。赞。
记录我在机器学习领域的每一步成长。// 本次实验素材取自林大贵先生的大数据巨量分析和机器学习整合开发实战。
实验用数据源在文件页面下载。
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(' ')(0).toDouble).stats()
导入训练引擎ALS
import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.Rating
提取前三个字段信息
val rawRatings = rawUserData.map(_.split(' ').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("
")
查看针对用户推荐评分
model.predict(196,464)
针对产品推荐给用户
MatrixFactorizationModel.model.recommendUsers(product,num)
实际执行
model.recommendUsers(464,5).mkString("
")
显示推荐电影名称
导入文件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中的推荐引擎算法。