推荐系统最常用的是协同过滤算法,下面我们来分析下同过滤算法
协同过滤算法可分为:
1.基于用户的(UserCF)
2.基于商品的(itemCF)
3.基于模型的(ModelCF)
按照模型可以分为
1.最近邻模型:基于距离的协同过滤
2Latent Factor Model(SVD):基于矩阵分解
3Graph:图模型
1.基于用户的协同过滤-基于用户相似性
通过不同用户对物品的评分来预测用户之间的相识度,基于用户之间的相似度做出推荐,就是给用户推荐和他兴趣相似的其他用户喜欢的物品
物品/用户 物品A 物品B 物品C 物品D
用户A 1 1 推荐
用户B 1
用户C 1 1 1
我们要给A推荐物品,因为用户A和C买的东西非常相似,用户C买了物品D,所有我们可以給用户A推荐物品D
基于UserCF的思想就是:基于用户对物品的偏好的相似性(通过用户对物品的评分,用户查看物品记录,用户对物品评论),找到相邻用户,将相邻用户喜欢的我推荐给当前用户。
基于商品(itemCF)-基于商品相似性
基于用户的协同过滤,通过用户对不同我的评分来预测物品之间的相似度,基于物品之间的相似度做出推荐。就是,给用户推荐和他之前喜欢的物品的相似的物品
用户/物品 物品A 物品B 物品C
用户A 1 1
用户B 1 1 1
用户C 1 推荐
因为用户A和用户C都买了物品A和物品C,说明物品A和物品C非常相似,用户C买了物品A,所以推荐用户C买物品C
推荐系统中迭代最小二乘算法的实现
实现代码:
inport org.apache.spark.ml.evaluation.RegressionEvaluator
import org.apache.spark.ml.recommendation.ALS
case class Rating(userId:Int,movieId:Int,rating:Float,timestamp:Long)
def parseRating(str:string):Rating={
val fields=str.split("::")
assert(fields.size==4)
Rating(fields(0).toInt,field(1).toInt,fields(2).tiFloat,fields(3).toLong)
}
//加载数据
val ratings=spark.read.textFile("data/mllib/als/sample_movielens_ratings.txt").map(parseRating).toDF
//分成训练集和测试集
val Array(training,test)=ratings.randomSplite(Array(0.8,0.2))
//在训练集上使用迭代最小二乘建立推荐模型
val als=new ALS().setMaxIter(5).setRegParam(0.01).setImlicitPrefs(true).setUserCol("userId").setItemCol("movieId").setRatingCol("rating")
val model=als.fit(training)
//在测试集上计算均方误差评估模型
val predictions=model.transform(test)
val evaluator=new RegressionEvalutor().setMetricName("rmse").setLabelCol("rating").setPredictionCol("prediction")
val rmse=evaluator.evaluate(predictions)
println(s"Root-mean-square error=$rmse")
topKRecs=model.recommendProducts(userId,K)
movieForUser=ratings.groupBy(user).mapValue(list).lookup(userId)
print moviesForUser
spark的使用矩阵因子来来做相关推荐
A*B的矩阵M=A*L矩阵N*L*B矩阵H
该模型称为潜在特征模型,旨在寻找那些潜在的特征,间接表示用户物品评分矩阵
隐式矩阵因子
前面我们在讨论显式的一些偏好信息,如rating,但在大部分应用中,拿不到这类信息,我们更多收集到的是隐式反馈信息,这类反馈信息没有明确地告诉某个用户对某个物品的偏好信息,但是可以从用户对某个物品的交互信息中建模出来,例如:一些二元特征,包括是否浏览过,是非购买过产品,以及多少次看过某部电影。
M矩阵是用户对物品的评分矩阵,N矩阵是是影片是否被某用户看过,用户看某部电影次数。
从数据中提取特征
数值特征:这些特征通常是实数或整数,比如年龄,
类别特征:它们的取值可能是状态集合中的某一种,例如用户性别,职业或电影类别,婚姻状况
文本特征:它们派生子数据中的文本内容,比如电影名,描述或是评论。
其它特征:大部分其他特征都最终表示为数值,比如图像,视频和音频被表示为数值数据的几何,地理位置则可由经纬或地理散列表示。