推荐系统

1-推荐系统简介


1.1推荐系统概念及产生背景

个性化推荐(推荐系统)经历了多年的发展,已经成为互联网产品的标配,也是AI成功落地的分支之一,在电商(淘宝/京东)、资讯(今日头条/微博)、音乐(网易云音乐/QQ音乐)、短视频(抖音/快手)等热门应用中,推荐系统都是核心组件之一。

  • 什么是推荐系统

没有明确需求的用户访问了我们的服务, 且服务的物品对用户构成了信息过载, 系统通过一定的规则对物品进行排序,并将排在前面的物品展示给用户,这样的系统就是推荐系统

  • 信息过载 & 用户需求不明确
    • 分类⽬录(1990s):覆盖少量热门⽹站。典型应用:Hao123 Yahoo
    • 搜索引擎(2000s):通过搜索词明确需求。典型应用:Google Baidu
    • 推荐系统(2010s):不需要⽤户提供明确的需求,通过分析⽤ 户的历史⾏为给⽤户的兴趣进⾏建模,从⽽主动给⽤户推荐能 够满⾜他们兴趣和需求的信息。
  • 推荐系统 V.S. 搜索引擎
    在这里插入图片描述

1.2推荐系统的工作原理及作用

  • 推荐系统的工作原理及作用
    • 社会化推荐 向朋友咨询, 社会化推荐, 让好友给自己推荐物品
    • 基于内容的推荐 打开搜索引擎, 输入自己喜欢的演员的名字, 然后看看返回结果中还有什么电影是自己没看过的
    • 基于流行度的推荐 查看票房排行榜,
    • 基于协同过滤的推荐 找到和自己历史兴趣相似的用户, 看看他们最近在看什么电影
  • 推荐系统的作用
    • 高效连接用户和物品
    • 提高用户停留时间和用户活跃程度
    • 有效的帮助产品实现其商业价值
  • 推荐系统的应用场景
    在这里插入图片描述

1.3推荐系统和Web项目的区别

  • 通过信息过滤实现目标提升 V.S. 稳定的信息流通系统

    • web项目: 处理复杂业务逻辑,处理高并发,为用户构建一个稳定的信息流通服务
    • 推荐系统: 追求指标增长, 留存率/阅读时间/GMV (Gross Merchandise Volume电商网站成交金额)/视频网站VV (Video View)
  • 确定 V.S. 不确定思维

    • web项目: 对结果有确定预期
    • 推荐系统: 结果是概率问题

2-推荐系统设计


2.1推荐系统要素

  • UI 和 UE(前端界面)
  • 数据 (Lambda架构)
  • 业务知识
  • 算法

2.2推荐系统架构

  • 1推荐系统整体架构
    在这里插入图片描述

  • 2大数据Lambda架构

    • Lambda架构是由实时大数据处理框架Storm的作者Nathan Marz提出的一个实时大数据处理框架。

    • Lambda架构的将离线计算和实时计算整合,设计出一个能满足实时大数据系统关键特性的架构,包括有:高容错、低延时和可扩展等。

    • 分层架构

      • 批处理层
        • 数据不可变, 可进行任何计算, 可水平扩展
        • 高延迟 几分钟~几小时(计算量和数据量不同)
        • 日志收集: Flume
        • 分布式存储: Hadoop
        • 分布式计算: Hadoop、Spark
        • 视图存储数据库
          • nosql(HBase/Cassandra)
          • Redis/memcache
          • MySQL
      • 实时处理层
        • 流式处理, 持续计算
        • 存储和分析某个窗口期内的数据(一段时间的热销排行,实时热搜等)
        • 实时数据收集 flume & kafka
        • 实时数据分析 spark streaming/storm/flink
      • 服务层
        • 支持随机读
        • 需要在非常短的时间内返回结果
        • 读取批处理层和实时处理层结果并对其归并
    • Lambda架构图
      在这里插入图片描述

  • 3推荐算法架构

    • 召回阶段 (海选)
      • 召回决定了最终推荐结果的天花板
      • 常用算法:
        • 协同过滤
        • 基于内容
    • 排序阶段 (精选)
      • 召回决定了最终推荐结果的天花板, 排序逼近这个极限, 决定了最终的推荐效果
      • CTR预估 (点击率预估 使用LR算法) 估计用户是否会点击某个商品 需要用户的点击数据
    • 策略调整
      在这里插入图片描述
  • 4推荐系统的整体架构
    在这里插入图片描述
    在这里插入图片描述


3-推荐算法


3.1推荐模型构建流程

Data(数据)->Features(特征)->ML Algorithm(选择算法训练模型)->Prediction Output(预测输出)

  • 1数据清洗/数据处理

    • 数据来源
      • 显性数据
        • Rating 打分
        • Comments 评论/评价
      • 隐形数据
        • Order history 历史订单
        • Cart events 加购物车
        • Page views 页面浏览
        • Click-thru 点击
        • Search log 搜索记录
    • 数据量/数据能否满足要求
  • 2特征工程

    • 从数据中筛选特征
      • 一个给定的商品,可能被拥有类似品味或需求的用户购买
      • 使用用户行为数据描述商品
        在这里插入图片描述
  • 用数据表示特征

    • 将所有用户行为合并在一起 ,形成一个user-item 矩阵
      在这里插入图片描述
  • 3选择合适的算法

    • 协同过滤
    • 基于内容
  • 4产生推荐结果

    • 对推荐结果进行评估,评估通过后上线

3.2最经典的推荐算法:协同过滤推荐算法(Collaborative Filtering)

算法思想:物以类聚,人以群分
基本的协同过滤推荐算法基于以下假设:

  • “跟你喜好相似的人喜欢的东西你也很有可能喜欢” :基于用户的协同过滤推荐(User-based CF)
  • “跟你喜欢的东西相似的东西你也很有可能喜欢 ”:基于物品的协同过滤推荐(Item-based CF)

实现协同过滤推荐有以下几个步骤:

  • 找出最相似的人或物品:TOP-N相似的人或物品

通过计算两两的相似度来进行排序,即可找出TOP-N相似的人或物品

  • 根据相似的人或物品产生推荐结果

利用TOP-N结果生成初始推荐结果,然后过滤掉用户已经有过记录的物品或明确表示不感兴趣的物品
以下是一个简单的示例,数据集相当于一个用户对物品的购买记录表:打勾表示用户对物品的有购买记录

  • 关于相似度计算这里先用一个简单的思想:如有两个同学X和Y,X同学爱好[足球、篮球、乒乓球],Y同学爱好[网球、足球、篮球、羽毛球],可见他们的共同爱好有2个,那么他们的相似度可以用:2/3 * 2/4 = 1/3 ≈ 0.33 来表示。
    User-Based CF
    在这里插入图片描述
    Item-Based CF
    在这里插入图片描述
    通过前面两个demo,相信大家应该已经对协同过滤推荐算法的设计与实现有了比较清晰的认识。

3.3 相似度计算(Similarity Calculation)

在这里插入图片描述
相似度的计算方法

  • 1欧氏距离
  • 欧氏距离, 是一个欧式空间下度量距离的方法. 两个物体, 都在同一个空间下表示为两个点, 假如叫做p,q, 分别都是n个坐标, 那么欧式距离就是衡量这两个点之间的距离. 欧氏距离不适用于布尔向量之间

在这里插入图片描述
​ 欧氏距离的值是一个非负数, 最大值正无穷, 通常计算相似度的结果希望是[-1,1]或[0,1]之间,一般可以使用​ 如下转化公式:
在这里插入图片描述

  • 2余弦相似度

    • 度量的是两个向量之间的夹角, 用夹角的余弦值来度量相似的情况
    • 两个向量的夹角为0是,余弦值为1, 当夹角为90度是余弦值为0,为180度是余弦值为-1
    • 余弦相似度在度量文本相似度, 用户相似度 物品相似度的时候较为常用
    • 余弦相似度的特点, 与向量长度无关,余弦相似度计算要对向量长度归一化, 两个向量只要方向一致,无论程度强弱, 都可以视为’相似’
      在这里插入图片描述
      在这里插入图片描述
  • 3皮尔逊相关系数Pearson

    • 实际上也是余弦相似度, 不过先对向量做了中心化, 向量a b各自减去向量的均值后, 再计算余弦相似度
    • 皮尔逊相似度计算结果在-1,1之间 -1表示负相关, 1表示正相关
    • 度量两个变量是不是同增同减
    • 皮尔逊相关系数度量的是两个变量的变化趋势是否一致, 不适合计算布尔值向量之间的相关度
      在这里插入图片描述
  • 4杰卡德相似度 Jaccard

  • 两个集合的交集元素个数在并集中所占的比例, 非常适用于布尔向量表示

  • 分子是两个布尔向量做点积计算, 得到的就是交集元素的个数

  • 分母是两个布尔向量做或运算, 再求元素和
    在这里插入图片描述
    如何选择余弦相似度

余弦相似度/皮尔逊相关系数适合用户评分数据(实数值),
杰卡德相似度适用于隐式反馈数据(0,1布尔值 是否收藏,是否点击,是否加购物车)


3.4 协同过滤推荐算法代码实现:

  • 构建数据集:
users = ["User1", "User2", "User3", "User4", "User5"]
items = ["Item A", "Item B", "Item C", "Item D", "Item E"]
# 构建数据集
datasets = [
    ["buy",None,"buy","buy",None],
    ["buy",None,None,"buy","buy"],
    ["buy",None,"buy",None,None],
    [None,"buy",None,"buy","buy"],
    ["buy","buy","buy",None,"buy"],
]
  • 计算时我们数据通常都需要对数据进行处理,或者编码,目的是为了便于我们对数据进行运算处理,比如这里是比较简单的情形,我们用1、0分别来表示用户的是否购买过该物品,则我们的数据集其实应该是这样的:

users = ["User1", "User2", "User3", "User4", "User5"]
items = ["Item A", "Item B", "Item C", "Item D", "Item E"]
# 用户购买记录数据集
datasets = [
    [1,0,1,1,0],
    [1,0,0,1,1],
    [1,0,1,0,0],
    [0,1,0,1,1],
    [1,1,1,0,1],
]
import pandas as pd

df = pd.DataFrame(datasets,
                  columns=items,
                  index=users)
print(df)
  • 有了数据集,接下来我们就可以进行相似度的计算,不过对于相似度的计算其实是有很多专门的相似度计算方法的,比如余弦相似度、皮尔逊相关系数、杰卡德相似度等等。这里我们选择使用杰卡德相似系数[0,1]
from sklearn.metrics import jaccard_similarity_score
# 直接计算某两项的杰卡德相似系数
# 计算Item A 和Item B的相似度
print(jaccard_similarity_score(df["Item A"], df["Item B"]))

# 计算所有的数据两两的杰卡德相似系数
from sklearn.metrics.pairwise import pairwise_distances
# 计算用户间相似度
user_similar = 1 - pairwise_distances(df, metric="jaccard")
user_similar = pd.DataFrame(user_similar, columns=users, index=users)
  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值