1、Spark构建推荐引擎之一:基于物品的协同过滤推荐
1.0 前言
目前SparkMLlib支持的推荐算法只有alternating least squares (ALS)这一种,相比较Mahout中的推荐算法,SparkMLlib目前不能支持目前的业务需求;因此,参照Mahout的推荐引擎,在Spark上构建同样一套推荐算法,以支持各种业务需求。
目前SparkMLlib官方网址:
http://spark.apache.org/docs/latest/mllib-guide.html
Mahout的推荐引擎的详细介绍参照:
http://blog.fens.me/mahout-recommend-engine/
1.1 数据输入模型
输入数据格式:
用户ID,物品ID,评分
用户输入数据模型:
defUserData (
sc:SparkContext,input:String,
split:String
):(RDD[(String,String,Double)]) = {
valuser_rdd1= sc.textFile(input,10)
valuser_rdd2=user_rdd1.map(line=> {
valfileds= line.split("split")
(fileds(0),fileds(1),fileds(2).toDouble)
})
user_rdd2
}
通过UserData可以获取用户评分RDD;
输入参数:sc是SparkContext,input就输入数据路径,split是数据分割符号。
1.2 相似度矩阵模型
基于物品(ItemCF)的相似度算法:
1)同现相似度
2)欧氏距离相似度
3)余弦相似度
4)秩相关系数相似度
5)曼哈顿距离相似度
6)对数似然相似度
1.2.1 同现相似度矩阵
参照:《推荐系统实践》一书中的介绍:
公式定义:
实例:
同现相似度模型:根据用户评分数据表,生成物品的相似矩阵;
输入参数:user_rdd:用户评分表;
输出参数:余弦相似矩阵:物品1,物品2,相似度值;
同现相似度矩阵模型:
def Cooccurrence (
user_rdd:RDD[(String,String,Double)]
) : (RDD[(String,String,Double)]) = {
// 0 数据做准备
valuser_rdd2=user_rdd.map(f => (f._1,f._2)).sortByKey()
user_rdd2.cache
// 1 (用户:物品)笛卡尔积 (用户:物品) =>物品:物品组合
valuser_rdd3=user_rdd2joinuser_rdd2
valuser_rdd4=user_rdd3.map(data=> (data._2,1))
// 2 物品:物品:频次
valuser_rdd5=user_rdd4.reduceByKey((x,y) => x + y)
// 3 对角矩阵
valuser_rdd6=user_rdd5.filter(f=> f._1._1 == f._1._2)
// 4 非对角矩阵
valuser_rdd7=user_rdd5.filter(f=> f._1._1 != f.