大数据——推荐系统

news2024/11/26 15:01:30

1 推荐系统的发展

推荐系统是指面对没有需求的用户在进入产品时,要给用户推荐什么东西,现在的APP基本上都会采用推荐系统。
从一开始的1990s开始的门户网站,像Yahoo、搜狐和Hao123等等,都是基于分类目录的网页导航网站,将各个网页聚合在一个网页中,方便用户跳转访问;到了2000s开始,进入搜索引擎,例如百度、google和必应,用户通过有目的的搜索,找到自己的需求网站;而进入2010s开始,进入推荐系统,不需要用户提供明确需求,通过分析用户的历史行为,主动给用户推荐他们感兴趣的东西,典型的APP有:快手、抖音和B站等等,基本上现在的APP都是基于推荐系统。
在这里插入图片描述

2 推荐系统的工作原理

推荐系统是基于以下四种推荐来进行的:

  1. 社会化推荐 让用户的社会关系进行推荐,例如好友推荐,例如分享功能;
  2. 基于内容推荐 根据用户的搜索的东西,了解用户的兴趣;
  3. 基于热点推荐 向用户推荐当前的热点资讯;
  4. 基于协同过滤推荐 向同一类用户推荐东西,拓展用户的边界。

综合应用以上四种推荐,可以高效链接用户和商品,提高用户的活跃度和停留时间,从而提高产品的商业价值。目前最成功的的APP当属抖音。
在这里插入图片描述

3 推荐系统的总体架构

用户服务
用户行为反馈
数据采集
推荐算法

如上图所示,其中用户服务主要是前端界面,数据采集会采用Lambda架构,推荐算法包含召回和排序两个方面。
其中推荐系统的数据采集架构Lambda架构图如下:

实时处理
批处理
数据收集Flume
数据收集Flume
视图存储数据库
Memcached
Redis
Spark streaming
Storm
Flink
Kafka
HBase
HDFS
HDFS
MySQL
Oracle
分布式计算
MapReduce
Spark
数据源

在批处理层,数据不可变,并且能进行任何计算同时可水平扩展;但对于及时性要求不高,可以是几分钟的延迟也可以是几个小时的延迟。
在实时处理层需要低延迟(最好在秒级)同时进行持续计算。
推荐算法架构可以分为召回、排序和策略调整三个主要阶段,其主要架构图如下:

海量Item
召回
候选集合
排序
排序列表
规则
topN
展示到页面

4 推荐算法

推荐算法部分跟业务数据分析中的机器学习过程很类似,包含以下步骤:

  1. 数据处理
  2. 特征工程
  3. 算法模型训练
  4. 产生推荐结果并评估

前两个不具体展开,原理同机器学习数据分析一样,算法模型部分会不同,这里主要会采用协同过滤算法。

协同过滤算法

该算法的核心思想为:物以类聚,人以群分,一般基于两种假设:

  • 基于用户协同过滤:跟你有相同喜好的用户喜欢的东西,你也可能会喜欢。
  • 基于物品系统过滤:你喜欢的东西同性质的东西,你也可能会喜欢。

协同过滤算法主要是两个步骤:

  1. 找出TopN相似的人或者物品:一般通过计算两两的相似度来进行排序。
  2. 根据相似的人或者物品进行推荐:利用TopN的推荐结果,过滤掉已有的东西或者明确不喜欢的东西,就是最后的结果。

以下是基于用户协同过滤步骤:
在这里插入图片描述
基于物品协同过滤步骤:
在这里插入图片描述
上面的相似度计算公式如下(以用户协同过滤为例):
用户1和用户2相同的物品数量:2
用户1物品数量:3
用户2物品数量:3
2/3×2/3 = 0.67×0.67

相似度计算

相似度的计算方法主要包含以下四种:

  • 欧式距离
    欧式距离公式: E = ∑ i = 1 n ( p i − q i ) 2 E = \sqrt{\sum_{i=1}^{n}(p_i - q_i)^2} E=i=1n(piqi)2
    因为相似度的结果是[-1,1]之间,所以进行如下转换: 1 1 + E \frac{1}{1+E} 1+E1

  • 余弦相似度
    在这里插入图片描述

  • Pearson相关系数
    余弦相似度的变形,对向量去中心化,即各自减去向量均值。

  • 杰卡德相似度Jaccard
    在这里插入图片描述

在选择相似度计算方法:

  • 数值型的采用余弦相似度或者Person相关系数;
  • 布尔型数据一般采用杰卡德相似度。

协同过滤算法代码

导入模块

import pandas as pd
import numpy as np
from sklearn.metrics import jaccard_score
from sklearn.metrics.pairwise import pairwise_distances
from pprint import pprint

准备数据


users = ["User1", "User2", "User3", "User4", "User5"]
items = ["Item A", "Item B", "Item C", "Item D", "Item E"]
# ⽤户购买记录数据集,1表示购买,0表示没有购买
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],
]
df = pd.DataFrame(datasets, columns=items, index=users)
df

在这里插入图片描述

基于用户之间的相似度

# 计算⽤户间相似度
user_similar = 1 - pairwise_distances(df.values,metric='jaccard')
user_similar = pd.DataFrame(user_similar, columns=users, index=users)
print("⽤户之间的两两相似度:")
print(user_similar)

在这里插入图片描述

每个用户相似用户top2

topN_user = {}
for i in user_similar.index:
    # 取出每列数据,并删除自己的数据
    df_ = user_similar.loc[i].drop([i])
    # 按照相似度降序排序
    df_sorted = df_.sort_values(ascending=False)
    # 取前两条结果
    top2 = list(df_sorted.index[:2])
    topN_user[i] = top2
    
pprint(topN_user)

在这里插入图片描述

过滤掉已购买物品,筛选出其余的东西

# 相似用户的物品,并过滤已购买的东西
rs_results = {}
for user, sim_users in topN_user.items():
    rs_result = set()
    for sim_user in sim_users:
        # 将所有推荐人买过的东西合并在一起
        rs_result = rs_result.union(set(df.loc[sim_user].replace(0,np.nan).dropna().index))
        
        # 过滤掉自己已经买过的东西
    rs_result -= set(df.loc[user].replace(0,np.nan).dropna().index)
   
    rs_results[user] = rs_result
    
pprint(rs_results)

在这里插入图片描述

基于物品相似度


# 计算物品间相似度
item_similar = 1 - pairwise_distances(df.T.values, metric='jaccard')
item_similar = pd.DataFrame(item_similar, columns=items, index=items)
print("物品之间的两两相似度:")
print(item_similar)

计算物品相似top2物品

topN_items = {}
for i in item_similar.index:
    # 取出每列数据,并删除自己的数据
    df_ = item_similar.loc[i].drop([i])
    # 按照相似度降序排序
    df_sorted = df_.sort_values(ascending=False)
    # 取前两条结果
    top2 = list(df_sorted.index[:2])
    topN_items[i] = top2
    
pprint(topN_items)

在这里插入图片描述

构建推荐列表

it_results = {}
# 构建推荐结果
for user in df.index: # 遍历所有⽤户
    it_result = set()
    for item in df.loc[user].replace(0,np.nan).dropna().index: # 取出每个⽤户当前已购物品列表
    # 根据每个物品找出最相似的TOP-N物品,构建初始推荐结果
        it_result = it_result.union(topN_items[item])
       
    # 过滤掉⽤户已购的物品
    it_result -= set(df.loc[user].replace(0,np.nan).dropna().index)
    # 添加到结果中
    it_results[user] = it_result
print("最终推荐结果:")
pprint(it_results)

在这里插入图片描述

5 推荐系统评估

好的算法可以实现三方共赢,即用户满足、服务方实现商业价值、内容方获得收益。其中评估的数据也分为直接评估和间接评估,像电影评分或者推荐量表示用户喜欢该内容的属于直接评估,准确性高,但数量少获取成本也较高;更多需要我们间接评估像播放量、点击量、购买量、评论和下载等等,这种方式虽然准确性较低,但数量多成本少。

评估指标

常用的评估指标如下:
• 准确性 • 信任度 • 满意度 • 实时性 • 覆盖率 • 鲁棒性 • 多样性 • 可扩展性 • 新颖性 • 商业⽬标 • 惊喜度 • ⽤户留存

评估方法

  • 问卷调查:成本高
  • 离线评估:只能评估少数指标,与线上真实效果存在偏差
  • 在线评估:灰度发布/AB测试

一般会采用离线评估和在线评估相结合,然后定期做问卷调查。

推荐系统冷启动

推荐系统冷启动本质上是缺失历史数据的情况下,怎么预测用户的偏好。其中可分为用户冷启动、物品冷启动和系统冷启动。

用户冷启动:

即如何为新用户做个性化推荐。一般会尽可能收集用户特征数据:

  1. 收集用户的基本信息:性别、年龄、地域、手机型号、GPS定位和APP列表
  2. 引导用户填写兴趣,即进入APP的兴趣选择
    在这里插入图片描述
  3. 关联其他app的行为数据,例如腾讯产品都会跟QQ和微信进行关联
  4. 新老用户推荐差异:一般新用户推荐热门,老用户推荐个性化。

物品冷启动:

如何将新物品推荐给用户。

  1. 给物品打标签:标签从系统业务中产生,也可以从其他网站爬取。
  2. 利用物品的标签将其推荐给曾喜欢类似物品的用户。

系统冷启动:

⽤户冷启动+物品冷启动。

  1. 系统早期基于内容推荐;
  2. 然后过渡到协同过滤;
  3. 内容推荐和协同过滤结合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/847896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Elasticsearch】学好Elasticsearch系列-聚合查询

本文已收录至Github,推荐阅读 👉 Java随想录 先看后赞,养成习惯。 点赞收藏,人生辉煌。 文章目录 概念doc values 和 fielddatamulti-fields(多字段)类型聚合分类分桶聚合Histogram 聚合 指标聚合Percentil…

用chatGPT从左右眼图片生成点云数据

左右眼图片 需求 需要将左右眼图像利用视差生成三维点云数据 先问问chatGPT相关知识 进一步问有没有现成的软件 chatGPT提到了OpenCV,我们让chatGPT用OpenCV写一个程序来做这个事情 当然,代码里面会有一些错误,chatGPT写的代码并不会做模…

笔记本WIFI连接无网络【实测有效,不用重启电脑】

笔记本Wifi连接无网络实测有效解决方案 问题描述: 笔记本买来一段时间后,WIFI网络连接开机一段时间还正常连接,但是过一段时间显示网络连接不上,重启电脑太麻烦,选择编写重启网络脚本解决。三步解决问题。 解决方案&a…

蓝牙技术在工业物联网 (IIoT)中的应用_串口透传蓝牙模块

物联网 (IoT) 正在通过托管和可扩展的数字解决方案帮助全球各行各业提高效率。 更具体地说,工业物联网 (IIoT) 侧重于连接石油和天然气、水电以及制造业等关键行业的机器和设备。 在工厂中,连接传感器在机器上的应用被用来收集有价值的数据,用…

标题:使用 Python 的 wxPython 模块生成 PPTX 文档

导语:本文介绍了如何使用 wxPython 模块和 python-pptx 模块来编写一个程序,用于生成包含首页、内容页和感谢页的 PPTX 文档。 介绍 PPTX 文档是一种常用的演示文稿格式,用于展示和分享信息。在本文中,我们将使用 Python 的 wxP…

前后端分离式项目架构流程复盘之宿舍管理系统

文章目录 🐒个人主页🏅JavaEE系列专栏📖前言:【🎇前端】先创建Vue-cli项目(版本2.6.10,仅包含babel),请选择此项目并创建 【整理简化项目模板】【🎀创建路由】…

kubesphere 部署 ingress 并使用 80 端口

文章目录 创建集群网关创建应用路由访问域名使用 80 端口 创建集群网关 官方文档:集群网关 点击左上角的平台管理并选择集群管理 点击导航面板中集群设置下的网关设置,选择集群网关选项卡,并点击启用网关 选择 NodePort 模式,配…

如何在风控引擎中快速增加策略

风控策略是由规则和模型组成的、用以实现风险控制目标的集合。模型与规则相辅相成,相互补充,在不同的业务阶段彼此的侧重点不同。新业务上线期,数据量不足,策略以规则为主;当业务运行一段时候后,数据有了一…

【逗老师的PMP学习笔记】7、项目的成本管理

目录 一、规划成本管理二、估算成本1、【关键工具】数据分析-考虑质量成本 三、制定预算1、【关键输出】成本基准2、【关键输出】资金需求 四、控制成本1、【定义】成本类型2、【关键工具】挣值分析 一、规划成本管理 成本管理计划是项目管理计划的组成部分,描述将如…

springboot+jpa+mysql电子数码商城含后台管理源码

#开发技术 #前端 bootstarp框架 html页面 #后端技术 SpringBoot SpringMvc jpa #开发工具 eclipse或者idea jdk1.8 mysql5点几版本 maven环境 maven3.5 前端地址::http://localhost:8080/mall 后台地址&#x…

知识图谱推荐系统研究综述

基于协同过滤的推荐是当前应用最为广泛的推荐方法,但也存在着新用户或新项目的冷启动以及数据稀疏等问题。针对上述两种方法出现的问题,研究者进一步提出了混合推荐系统。混合推荐系统结合上述两种方法的优点,可以有效缓解其中的不足,增加推荐的准确性。但是,混合推荐系统…

原型模式(C++)

定义 使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。 应用场景 在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的…

并发编程2:如何进行对象共享?

目录 1、对象的可见性:Volatile 变量 2、发布和逸出 3、线程封闭:ThreadLocal 4、对象的不变性 5、安全发布 5.1 - 安全发布常用的模式 5.2 - 可变对象 5.3 - 安全地共享对象 同步在用于实现原子性或者确定 “临界区(Critical Section)” 的同时…

大公司搞网络部署,关键在哪步?

下午好,我是老杨。 很久没有聊网络部署,今天就说这事儿。 要进行网络部署,涉及的技术点/知识有哪些? 最基本的,你需要掌握vlan划分、路由选择、出口nat处理;你可能还需要懂得链路聚合、mstp、vrrp、ospf…

恒运资本:沪指震荡微涨,医药、酿酒板块反弹,传媒板块活跃

8日早盘,沪指早盘弱势震动下探,临近午盘翻红;深成指、创业板指均止跌回升;两市半日成交超5000亿元,北向资金净卖出超40亿元。 截至午间收盘,沪指微涨0.01%报3269.29点,深成指跌0.06%&#xff0c…

案例分享:NetApp SSD 硬盘重启后全部故障

近日连续处理了几个NetApp FAS存储系统SSD磁盘重启后,全部故障的案例。这里是case的总结和分享,以后有遇到的可以参考处理。 案例1:客户一套FAS8020,带一个DS2246盘柜,内置24个800G X447A的磁盘,机房掉电后…

2023网络安全常用工具汇总(附学习资料+工具安装包)

几十年来,攻击方、白帽和安全从业者的工具不断演进,成为网络安全长河中最具技术特色的灯塔,并在一定程度上左右着网络安全产业发展和演进的方向,成为不可或缺的关键要素之一。 话不多说,网络安全10款常用工具如下 1、…

SQL力扣练习(十)

目录 1.体育馆的人流量(501) 示例 1 解法一(row_number()) 解法二(自定义变量) 解法三 2.好友申请(602) 示例 解法一(union all) 解法二 3.销售员&…

hive修改表或者删除表时卡死问题的解决(2023-08-08)

背景:前阶段在做hive表的改表名时,总是超时,表是内部表,数据量特别大,无论你是修改表名还是删除表都是卡死的状态,怎么破? 终于:尝试出来一个新的方法 将内部表转化成外部表&#…

面试常问:tcp的三次握手和四次挥手你了解吗?

三次握手和四次挥手是各个公司常见的考点,一个简单的问题,却能看出面试者对网络协议的掌握程度,对问题分析与解决能力,以及数据流管理理解和异常情况应对能力。所以回答好一个tcp的三次握手和四次挥手的问题对于我们的面试成功与否…