推荐概念
信息过滤系统 解决 信息过载 用户需求不明确的问题
利用一定的规则将物品排序 展示给需求不明确的用户
推荐 搜索区别
推荐个性化较强, 用户被动的接受, 希望能够提供持续的服务
搜索个性化弱, 用户主动搜索, 快速满足用户的需求
推荐和 web 项目区别
构建稳定的信息流通通道
推荐 信息过滤系统
Web 对结果有明确预期
推荐 结果是概率问题
Lambda 架构介绍
离线计算和实时计算共同提供服务的问题
离线计算优缺点
优点 能够处理的数据量可以很大 比如 pb 级别
缺点 速度比较慢 分钟级别的延迟
实时计算
优点 响应快 来一条数据处理一条 ms 级别响应
缺点 处理的数据量小一些
离线计算的框架
- hadoop hdfs mapreduce
- spark core , spark sql
- hive
实时计算框架
- spark streaming
- storm
- flink
消息中间件
flume 日志采集系统
kafka 消息队列
存储相关
hbase nosql 数据库
hive sql 操作 hdfs 数据
推荐算法架构
召回
协同过滤 算相似度 memory base
基于模型的 model base 矩阵分解
基于内容
分词
词权重 (提取关键词) tf-idf
word2Vec 词向量
物品向量
排序
逻辑回归
策略调整
推荐模型构建流程
数据收集
显性评分
隐性数据
特征工程
协同过滤: 用户 - 物品 评分矩阵
基于内容: 分词 tf-idf word2Vec
训练模型
协同过滤
kNN
矩阵分解 梯度下降 ALS
评估, 模型上线
协同过滤思路介绍
CF 物以类聚人以群分
做协同过滤的话 首先特征工程把 用户 - 物品的评分矩阵创建出来
基于用户的协同过滤
给用户 A 找到最相似的 N 个用户
N 个用户消费过哪些物品
N 个用户消费过的物品中 - A 用户消费过的就是推荐结果
基于物品的协同过滤
给物品 A 找到最相似的 N 个物品
A 用户消费记录 找到这些物品的相似物品
从这些相似物品先去重 - A 用户消费过的就是推荐结果
相似度计算
余弦相似度, 皮尔逊相关系数
向量的夹角余弦值
皮尔逊会对向量的每一个分量做中心化
余弦只考虑方向 不考虑向量长度
如果评分数据是连续的数值比较适合中余弦, 皮尔逊计算相似度
杰卡德相似度
交集 / 并集
计算评分是 0 1 布尔值的相似度
使用不同相似度计算方式实现协同过滤
如果 买 / 没买 点 / 没点数据 0/1 适合使用杰卡德相似度
- from sklearn.metrics import jaccard_similarity_score
- jaccard_similarity_score(df['Item A'],df['Item B'])
- from sklearn.metrics.pairwise import pairwise_distances
- user_similar = 1-pairwise_distances(df,metric='jaccard')
一般用评分去做协同过滤 推荐使用皮尔逊相关系数
评分预测
- $$
- pred(u,i)=\hat{
- r
- }{
- ui
- }=\cfrac{
- \sum{
- v\in U
- }sim(u,v)*r_{
- vi
- }
- }{
- \sum_{
- v\in U
- }|sim(u,v)|
- }
- $$
基于用户和基于物品的协同过滤 严格上说, 属于两种算法, 实践中可以都做出来, 对比效果, 选择最靠谱的
协同过滤 基于模型的算法
用户 - 物品矩阵比较稀疏的时候 直接去取物品向量 用户向量计算相似度 不太适合
基于模型的方法可以解决用户 - 物品矩阵比较稀疏的问题
矩阵分解
把大的矩阵拆成两个小的 用户矩阵 物品矩阵 MXN 大矩阵 M X K K X N K<<M k<<N
大矩阵 约等于 用户矩阵 乘 物品矩阵
使用 als 交替最小二乘法来优化损失 spark ML recommandation 包封装了 als
优化之后的用户矩阵 取出用户向量
优化之后的物品矩阵 取出物品向量
用户向量点乘物品向量 得到最终评分的预测
推荐系统的评价
准确率 覆盖率
准确率
学术 rmse mas 点击率预估 精准率
工程 A/B test 对比不同的算法 在线上运行对关键指标的影响
baseline 基准线 热门排行
灰度发布
EE
Exploitation & Exploration 探索与利用问题
Exploitation 利用用户的历史行为 只给他曾经看过的 / 消费过的相似物品
Exploration(探测 搜索) 发现用户的新兴趣
ee 问题 实际上是矛盾
评估手段
离线评估和在线评估结合, 定期做问卷调查
在线评估
灰度发布 & A/B 测试
推荐系统的冷启动
用户冷启动
尽可能收集用户信息 构建用户画像 (打标签)
根据用户的标签可以做人群聚类 用以有用户的行为做推荐
更多的使用流行度推荐
物品冷启动
物品打标签 构建物品画像
基于内容的推荐
系统冷启动
如果应用缺少用户行为数据 -> 基于内容的推荐
随着用户行为积累的越来越多 -> 协同过滤
基于内容和协同过滤共同工作
基于内容的推荐
给物品打标签
系统自己提取从业务数据库中提取
用户填写
中文分词 利用算法计算词的权重
tf-idf tf term frequency 词频 5/100 *2
idf 逆文档频率 log 10 文本库篇数 / 出现关键词的文章篇数
- 1000 10python 1000/10 100 2
- 1000/1000 log(1) = 0
- textrank
利用标签的文字 转换成词向量
word2Vec 词 -> 向量
用向量来表示语义
如果两个词的词向量相似度比较高 认为这两个词的语义相近
利用词向量 构建物品的向量
一个物品有 N 个关键词 每一个关键词对应一个词向量
求和 (权重 * 词向量)/N
利用 N 个关键词的词向量获取物品向量
通过物品向量计算相似度
皮尔逊 相关系数 计算物品向量的相似度
基于内容的推荐 基于物品的协同过滤 区别
content_base : 词向量 -> 物品向量 -> 计算相似度
item_based cf :user-item matrix-> 物品向量 -> 相似度
content_base item_based cf 不一样
物品向量构建过程有区别
基于内容的推荐
物品向量 文本 (物品描述信息, 系统填标签, 用户填标签)
基于物品的协同过滤
用户对物品的评分矩阵 用户的行为数据中来
来源: https://www.cnblogs.com/skyell/p/11829038.html