推荐系统---协同过滤
推荐
终于找到好文章了!!!
可以给两个脚本定时执行,来处理打点数据,来完成对用户的推荐。
dt-recommend 中 Trainer 是保存数据的地方.
Trainer:
- 找到打点数据(打点数据放在 hbase 中, 取出其中的 userid,feedid,feedtype 等)
- 通过spark.mllib库调用一个 ALS(最小二乘法)算法, 得到一个 model
- 从这个 model 中得到 userFeatures, productFeatures(对应user, feed. 这时两个特征矩阵,具体的还得看ALS是什么).
- 保存 model, 放到hadoop? 分两个文件夹 matadata(className, formatversion, rank), data(user, product)
- 开始推荐, 推荐时就是计算 userid , feeid ,score. 其中 score 是一个打分, score 越高, 说明越应该给用户推荐这个 feed.
其中有一个 ddot 是个 java 程序, 用来计算特征向量的, 计算用户和 feed 的特征向量得到一个 score.
协同过滤
概念
rating:
记录一个矩阵, 每一行代表一个用户, 每一列是一个 item(product).
隐式反馈 显式反馈:
比如对电影的评分, 属于显式
比如用户的点击,评论, 收藏等, 属于隐式
代码
val model = ALS.*trainImplicit*(clickEvents, rank, iterations, lambda, blockSize, alpha)
**
clickEvents 就是 rating, 我的理解 rating 就是行为用户,列为 item, 值为评分的矩阵.
这个 trainImplicit 方法是隐式反馈要调用的.
对 rating 进行矩阵分解, 矩阵分解有种方法, 这里就是 ALS 方法进行矩阵分解.
关于 spark mllib 库的讲解:
mllib 库中只提供了基于矩阵分解的协同过滤算法.
还有一片比较容易懂的:
mllib 使用 ASL 对 rating 矩阵进行分解, 得到 user 和 product 矩阵.
user 特征向量 和 product 特征向量 点积, 可以得到每个用户对于该 feed 的推荐值