apriori算法c++_关联分析——基于Apriori算法实现

e54dfed3fd41ae0357b22f1f06fb6bb8.png

电子商务推荐系统主要是通过统计和挖掘技术,根据用户在网站上的行为,主动为用户提供推荐服务,从而提高网站体验。而根据不同的业务场景,推荐系统需要满足不同的推荐粒度,包括搜索推荐,商品类目推荐,商品标签推荐,店铺推荐等等,主要还是以 商品推荐 为主。而商品推荐主要分为规则模型,协同过滤模型和基于内内容的推荐。我们今天介绍的Apriori算法就是基于 规则模型 的算法。

把啤酒放在尿布旁,有助于提升啤酒销售量

Apriori最典型的落地就是沃尔玛的啤酒尿布案例。通过用户交易数据集来寻找商品之间的 关联规则,探究物品之间的相关性,同时达到“将尿布放入购物车之后,再推荐啤酒比直接推荐啤酒获取有更好的售卖效果”

本篇文章首先简要介绍一下Apriori算法的基本思想,然后使用业务数据进行了简单的演示。

一、基本概念

以下的是Apriori算法涉及的一些概念,可以通过后续的举例来理解。

频繁项集(frequent item sets): 经常 同时出在订单中商品的组合。{啤酒,尿布}就是一个频繁项集的例子。

关联规则(associational rules): 暗示两种物品集之间可能存在很强的关系。例如,“购买尿布的用户,有大概率购买啤酒”,这就是一个关联规则。

给定关联规则X=>Y,即根据X推出Y:

支持度(Support):该项集出现的次数除以总的记录数(交易数)。 同时包X和Y的记录数/数据集记录数

置信度(Confidence):项集{X,Y}同时出现的次数占项集{X}出现次数的比例。同时包含X和Y的记录数/包含X的记录数

提升度(Lift):度量项集{X}和项集{Y}的独立性。

二、举例说明

本节通过一个关联规则推荐的例子给大家介绍一下上述名词,假设shein售卖四类商品,历史上共5笔订单(见下表)

2.1 数据准备

ec6d89bd810eca05cdbd3e9c5b213dbd.png

每一行表示一条订单信息,例如:订单编号为sh-0001的订单中包含Beauty、Plus Size、Dress三个品类,以下为方便叙述,使用A、B、C、D来代表上图的4个品类。

2.2 支持度的计算

支持度是某个商品在总销售笔数(N)中出现的概率,可以理解为物品当前流行程度。计算方式是:

支持度 = (包含物品A的记录数量) / (总的记录数量)

例如下表中,共5笔订单,3笔包含Beauty,Beauty的支持度是3/5。支持度评估商品包含在订单中的“概率”,一个订单,有多大概率包含这个商品。

4977470b540e45dc7905c7a9bbc42d94.png

组合商品也有支持度。

共5笔订单,2笔同时包含AB,即A&B的支持度是2/5。

全局总共4种商品,假设关联规则只关联2种商品,则一共需要计算$C_4^2$共6种组合商品的支持度{AB,AC,AD,BC,BD,CD}。

如果想查看那几种商品组合出现的次数较多,可以通过计算支持度来实现

2.3 置信度的计算

置信度是指如果购买物品A,有较大可能购买物品B,本质上是条件概率的应用。计算方式是这样:

置信度( A -> B) = (包含物品A和B的记录数量) / (包含 A 的记录数量)

536abbf8f96412c80a1eb0066a931128.png

从上表可以看出,商品A有3次购买,这3次中有2次购买了B,A->B的置信度是2/3。

confidence(A->B) = support(A->B)/support(A)= (2/5)/(3/5) = 2/3

分子support(A->B)是同时购买A与B的比例,分母support(A)是只购买A的比例

这里需要注意的是,$X->Y$与$Y->X$的置信度不一定相等。

B->C的置信度是confidence(B->C)=support(B->C)/support(B)=1,即买商品B时,100%会买C;

C->B的置信度是confidence(C->B)=support(C->B)/support(C)=3/5,买商品C时,只有3/5买了B。

2.4 提升度的计算

提升度表示==先购买==A对购买B的概率的提升作用,用来判断规则是否有实际价值。

在置信度的例子里,$confidence(B->C)=1$,那是不是意味着如果用户将商品B放入购物车,就可以向用户推荐商品C来达到提升C销量的目的呢?

很显然不是。我们目的是“将尿布放入购物车之后,再推荐啤酒”“直接推荐啤酒”有更好的售卖效果。虽然购买商品B,100%会买C,但如果直接推荐C,用户也100%会买C,所以购买B与购买C是独立事件,用户买不买C和用户买不买B没有直接关系。这里的关联规则推荐,并没有比直接推荐获取更好的效果

因此提升度是描述使用规则后商品在购物车中出现的次数是否高于商品单独出现在购物车中的频率。如果大于1说明规则有效,小于等于1则无效。

提升度( A -> B) = 置信度( A -> B) / 支持度(B)

cfcbf1f5449db68055b43357d2af645c.png

在上表中,有3个订单购买A,这3个订单中有2个订单购买了B,所以:

$confidence(A->B) =support(A->B)/support(A) = 2/3$ 即买了A有$2/3$的概率会买B

$support(B) = 3/5$ 表示直接推荐B的话,5个订单中有3个购买了B, 即B的支持度是$3/5$,即有$3/5$的概率会直接买B。

$lift(A->B) =confidence(A->B)/support(B) = 10/9$

会发现,使用关联规则推荐,如果当用户将Beauty(A)品类的商品加入购物车后,再推荐Plus Size(B)品类,比直接推荐Plus Size(B)品类的效果更好。

2.5 总结

在上述关联规则推荐的例子中,推荐的目标是想“将尿布放入购物车之后,再推荐啤酒”“直接推荐啤酒”有更好的售卖效果

  • 支持度support(A->B),是用户同时购买A和B概率
  • 置信度confidence(A->B),是用户购买A的同时,有多大概率购买B
  • 提升度lift(A->B),是“用户购买A的同时,有多大概率购买B”与“直接购买B的概率”的比值
  • 提升度大于1时,说明A->B有正向效果
  • 提升度等于1时,说明A和B是独立事件
  • 提升度小于1时,说明A->B有负向效果

三、算法实现

网上有很多封装好的Apriori算法,大家也可以自行下载使用,代码详见Jupyter notebook

算法对数据分析师而言只是工具,了解基本原理且会调用代码即可。

算法实现涉及到两个重要的定理:

  1. 如果一个集合是频繁项集,则它的所有子集都是频繁项集。假设一个集合{A,B}是频繁项集,则它的子集{A}, {B} 都是频繁项集。
  2. 如果一个集合不是频繁项集,则它的所有超集都不是频繁项集。假设集合{A}不是频繁项集,则它的任何超集如{A,B},{A,B,C}必定也不是频繁项集。

通过以上两个定理可以减少程序的计算次数,提高程序的速度。

Apriori实际应用

​ 1.需要根据不同的粒度,如品类,skc等,结合不同的维度,如浏览行为,购买行为,构建符合业务场景的规则模型。

​ 2.Apriori也可以用来进行个topn个性化推荐。首先可以根据一定时间范围内订单数据找到强关联规则(skc)。然后在根据用户购买的商品和规则进行关联,预测用户感兴趣的商品,同时过滤掉用户已经购买过的商品,对于其他商品按照置信度降序进行排序,为用户推荐。

​ 3.Apriori也可以用来进行关键路径分析,研究某个功能或者某些特点的人群的在某些业务场景下的路径。

3.1presto中准备好数据

--准备数据
select 
week(cast(substr(t1.pay_time,1,10) as date)) as week_num     --周序号
,order_id                                                    --订单ID
,array_join(array_agg(distinct cate2),',') as cate  from dw.item_df t1
left join da.category t2
on t1.sku_cate = t2.cate4nmwhere site_tp = 'xxx'
and del_flag = 0
and substr(pay_time,1,10) = '2020-04-25'                     --修改时间事件范围
and country = 'xxx'
and site_id <> 'xxx'
group by 1,2

3.2利用python中mlxtend模块实现

1.首先在命令行中安装mlxtend(可以新建一个环境防止包冲突)

pip install mlxtend

2.导入模块。

#导入包(第一次运行的时候会比较慢)
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules

3.调整数据格式,调用包。

if __name__ == '__main__':#读取数据并且调整格式data_set = pd.read_excel('shiyan.xlsx').cate.str.split(',').tolist()#进行 one-hot 编码te = TransactionEncoder()te_ary = te.fit_transform(data_set)df = pd.DataFrame(te_ary, columns = te.columns_)#利用 Apriori 找出频繁项集frequent_itemsets = apriori(df, min_support = 0.1, use_colnames = True)#计算关联规则,一般只需要设置最小执行都就行rules = association_rules(frequent_itemsets, metric = 'confidence' ,min_threshold = 0.3)

4.导出excel

#导出excel
rules.to_excel(r'C:/Users/dell/Desktop/result.xlsx',encoding = 'utf-8')

b0866fb6dab80e62da82a76603eb177d.png

参数解释:

association_rules(df, metric = ‘confidence‘, min_threshold = 0.8, support_only = False):

-df:这个不用说,就是 Apriori 计算后的频繁项集。

-metric:可选值['support' , 'confidence' , 'lift' , 'leverage' , 'conviction']。里面比较常用的就是置信度和支持度。这个参数和下面的min_threshold参数配合使用

-min_threshold:参数类型是浮点型,根据 metric 不同可选值有不同的范围,

  • metric = 'support' => 取值范围 [0,1]
  • metric = 'confidence' => 取值范围 [0,1]
  • metric = 'lift' => 取值范围 [0, inf]

-support_only:默认是 False。仅计算有支持度的项集,若缺失支持度则用 NaNs 填充。

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

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

相关文章

在Oracle Coherence中分发Spring Bean

本文展示了如何通过使用Oracle Coherence中的EntryProcessor和可移植对象格式&#xff08;POF&#xff09;功能来分发Spring Bean。 Coherence通过EntryProcessor API支持无锁编程模型。 此功能通过减少网络访问并在条目上执行隐式的低级锁定来提高系统性能。 此隐式低级锁定功…

postman测试实例--断言

让我们来看看postman测试的一些例子。 其中大部分是作为内部postman片段。 大多数测试是为单行的JavaScript语句一样简单。 只要你想一个请求&#xff0c;你可以有很多的测试。注意&#xff1a;一个响应已从服务器接收后测试脚本运行。测试实例1.设置环境变量 postman.setEnvir…

python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...

单例模式单例模式(Singleton Pattern)是一种常用的软件设计模式&#xff0c;该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中&#xff0c;某个类只能出现一个实例时&#xff0c;单例对象就能派上用场。比如&#xff0c;某个服务器程序的配置信息存放在一…

android-铃声的设置与播放

在android系统中&#xff0c;不同铃声存放的铃声路径&#xff1a;/system/media/audio/ringtones 来电铃声/system/media/audio/notifications 短信通知铃声/system/media/audio/alarms 闹钟铃声铃声的设置&#xff1a;import java.io.File; import andr…

Apache Commons SCXML:有限状态机实现

本文提到有限状态机&#xff08;FSM&#xff09;&#xff0c;SCXML&#xff08;状态图可扩展标记语言&#xff09;和Apache Common的SCXML库。 本文还提供了基本的ATM有限状态机示例代码。 有限状态机&#xff1a; 您可能还记得计算机科学课程中的有限状态机。 FSM用于设计计算…

第二十章、分离应用程序逻辑并处理事件

理解委托 委托是对方法的引用。&#xff08;之所以称为委托&#xff0c;是因为一旦被调用&#xff0c;就将具体的处理“委托”给引用的方法&#xff09; 委托对象引用了方法&#xff0c;和将int赋值给int变量一样&#xff0c;是将方法引用赋给委托对象。 Processor p new Proc…

pymol怎么做底物口袋表面_怎么从文献中发掘一篇新文章?

本文来自微信公众号&#xff1a;X-MOLNews可能你的导师也曾说过这样的话——盯着Nature、Science级别的文章做&#xff0c;可能最终会中十分的文章&#xff1b;如果盯着十分的文章做&#xff0c;可能最终发出来也就五六分&#xff1b;但如果就为了发个文章混毕业&#xff0c;很…

如何分析线程转储– IBM VM

本文是我们的线程转储分析系列的第4部分&#xff0c;它将为您概述什么是IBM VM的JVM线程转储以及您将找到的不同线程和数据点。 您将看到和学习​​到&#xff0c;IBM VM Thread Dump格式是不同的&#xff0c;但是提供了更多现成的故障排除数据。 在这一点上&#xff0c;您应该…

VMware vSphere克隆虚拟机

参考资料&#xff1a;http://blog.csdn.net/shen_jz2012/article/details/484167711. 首先将你所要克隆的虚拟机关掉2. 选择你的ESXI服务器选中"配置"&#xff0c;然后选中存储器右键你的存储介质&#xff0c;比如我的是datastore1&#xff0c;选择“浏览数据存储”。…

将本地jar包倒入maven项目类库中

有两种方法&#xff1a;1.本地下载maven并配置环境变量&#xff0c;然后运行cmd控制台输入 mvn install:install-file -Dfile本地jar路径 -DgroupId -DartifactId -Dpackagingjar -Dversion -DgeneratePomtrue. 2.直接在pom.xml中对应的依赖下面添加<scope>system&l…

Spring和JSF集成:分页

处理大型数据集时&#xff0c;通常需要以分页格式显示数据。 分页是一个有趣的问题&#xff0c;因为它倾向于跨越应用程序的所有层&#xff0c;从视图层通过应用程序服务一直到对数据库的原始调用。 在获取分页数据时&#xff0c;有一些非常好的解决方案。 如果您使用的是JPA&a…

三重积分平均值_直角坐标系下的三重积分的几何可视化解释图解高等数学

12.4 直角坐标系下的三重积分三重积分假设 F(x,y,z) 为一个空间有界闭区域 D 上的函数. D 为下面立体椭球所占区域. 将空间区域分割成小长方块. 体积记为 ΔVk, 其长宽高分别为Δxk, Δyk, Δzk , 并有下列的求和式:观察下面动画, 当空间不断分割, 每个小方块的体积 ΔVk 不断变…

最短网络Agri-Net

【例4-11】、最短网络Agri-Net【问题描述】农民约翰被选为他们镇的镇长&#xff01;他其中一个竞选承诺就是在镇上建立起互联网&#xff0c;并连接到所有的农场。当然&#xff0c;他需要你的帮助。约翰已经给他的农场安排了一条高速的网络线路&#xff0c;他想把这条线路共享给…

cors-synchronous-requests-not-working-in-firefox

http://stackoverflow.com/questions/16668386/cors-synchronous-requests-not-working-in-firefox转载于:https://www.cnblogs.com/diyunpeng/p/5829594.html

硬盘接口协议

硬盘是电脑主要的存储媒介之一&#xff0c;由一个或者多个铝制或者玻璃制的碟片组成。碟片外覆盖有铁磁性材料。硬盘有固态硬盘&#xff08;SSD 盘&#xff0c;新式硬盘&#xff09;、机械硬盘&#xff08;HDD 传统硬盘&#xff09;、混合硬盘&#xff08;HHD 一块基于传统机械…

图的表示

Python 数据结构与算法——图&#xff08;Graph&#xff09; 1. 邻接矩阵 vs 邻接表&#xff08;压缩的邻接矩阵&#xff09; 邻接矩阵的缺点是&#xff1a; 空间占用与结点数的平方成正比&#xff0c;可能带来很大的浪费&#xff1b;邻接矩阵不容易增加新的结点&#xff0c;不…

在Java Web应用程序中阻止CSRF

跨站点请求伪造攻击&#xff08;CSRF&#xff09;在Web应用程序中非常常见&#xff0c;如果允许&#xff0c;可能会造成重大危害。 如果您从未听说过CSRF&#xff0c;建议您查看有关它的OWASP页面 。 幸运的是&#xff0c;阻止CSRF攻击非常简单&#xff0c;我将向您展示它们的工…

windows命令行无法启动redis_windows系统安装redis

1、下载最新redis https://github.com/MicrosoftArchive/redis/releases我选择下载msi版本的2.双击下载包安装3.设置redis环境变量&#xff0c;把redis路径配置到系统变量path值中4启动redis&#xff0c;cmd进入安装好redis文件夹 输入&#xff1a;如果redis启动出错Creating S…

SQL Server 筛选时间区间

一、SQL直接判断 select * from login where pass>2013/03/25 and pass < 2017/04/24 二、DATEDIFF() 函数返回两个日期之间的时间 --语法 DATEDIFF(datepart,startdate,enddate) --开始时间 startdate --结束时间 enddate --datepart datepart缩写年yy, yyyy季度qq, …

OpenShift Express Web管理控制台:入门

本周&#xff0c; 最新版本的OpenShift为已经很棒的PaaS Cloud提供商带来了两个非常好的功能。 首先&#xff0c;JBoss AS已从7.0升级到7.1&#xff0c;并且所有新的Express Web Management Console已作为预览发布。 在本文中&#xff0c;我们将研究如何使用此新控制台&#xf…