项目背景
本项目主要介绍电商系统中常见的推荐功能,包括热门商品和优质商品的统计推荐模块,基于隐语义模型实现的离线推荐模块,以及自定义规则的实时推荐模块。
技术栈
CentoOS 7.0
spark 2.1.1
hadoop 2.7
scala 2.11.8
redis 4.0.2
kafka 2.12
mongodb 3.4.3
zookeeper 3.4.10
flume-ng 1.8.0
JDK 1.8
数据流程
核心模块
统计推荐(离线统计)
热门商品 : 根据所有历史评分数据,计算评分次数最多的商品。
近期热门商品 :按月统计所有历史评分数据评分最多的商品。
优质商品 :根据有所历史评分数据,计算平均评分最高的商品。
基于隐语义模型的协同过滤推荐(离线推荐)
1、将用户评分数据,分解为用户向量和商品向量。
2、将用户向量和商品向量相乘,产生的笛卡尔积作为预测评分空矩阵,此时这是个稀疏矩阵。
3、调用saprk的ALS.train,进行模型训练后,使用模型对2的矩阵进行预测,预测结果是稠密矩阵,空的矩阵位置也产生了预测评分。
4、对新的稠密矩阵进行聚合、排序后,即可得到用户评分列表。
商品相似度列表
通过商品特征矩阵结合余弦相似度公式,产生商品相似度列表。
模型评估和参数选取
对于ALS模型训练的过程中,直接指定了隐语义模型的三个参数(rank,iteration,lambda),所以需要对模型进行评估。通常采用均方根误差(RMSE),考察预测评分与实际评分之间的误差值。
实时推荐
1、用户u对商品p进行了评分,触发一次实时推荐计算。
2、获取用户u按时间顺序最近的K个评分,记为RK;获取商品p的最相似K个商品集合,记为S作为候选商品集合。
3、然后对每个商品(s中元素),计算推荐优先级,计算公式如下:
其中:
Rr表示用户u对商品r的评分;
sim(q,r)表示商品q与商品r的相似度,设定最小相似度为0.6,低于该阀值视为两者不相关并忽略;
sim_num表示q与RK中商品相似度大于最小阀值的个数
incount表示RK中与商品q相似且评分较高(>=3)的商品个数
recount表示RK中与商品q相似且本身评分较低(<3)的商品个数
公式意义:
首先对于每个候选商品q,从用户u最近K个评分中,找出与q相似度较高(>=0.6)的u已评分商品们,对于这些商品中的每个商品r,将r于q的相似度乘以用户u对r的评分,将这些乘积计算平均数,作为用户u对商品q的基础预测评分,lgmax{incount,1}是增强因子表示好评,lgmax{recount,1}是减弱因子,表示差评。此公式采用相似度乘以评分加权值,并利用增强与削弱因子,实现了自定义的商品推荐优先级计算。
基于内容的相似推荐
通过提取物品内容的UGC标签,作为特征向量,结合商品相似度公式和实时推荐规则,实现商品相似度列表。为了避免热门标签对特征提取的影响,可以通过TF-IDF调整其权重,尽可能接近用户偏好。
基于物品的协同过滤相似推荐
如果物品有同样的受众(感兴趣的人群),那么它们是有内在相关性的。所以利用已有的行为数据,分析受众的相似程度,进而得出物品间的相似度。我们把这种方法定义为“同现相似度”,公示如下: