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支持无锁编程模型。 此功能通过减少网络访问并在条目上执行隐式的低级锁定来提高系统性能。 此隐式低级锁定功…

Apache Commons SCXML:有限状态机实现

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

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;选择“浏览数据存储”。…

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…

OpenShift Express Web管理控制台:入门

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

女士细线毛衣起多少针_从起针到缝合,教你织毛衣的各种要点(详细教程)

新手学织毛衣看过来&#xff0c;7大编织要点帮你解决织好一件毛衣的基础问题&#xff0c;满满的干货&#xff0c;每点都值得学习!一、起针二、棒针符号三、如何织小样四、依据小样推算针数收挂肩的推算五、斜肩针数的推算开前、后领的位置与针数六、袖山的推算七、如何上袖子一…

Jelastic Java云端平台

谁在Jelastic背后&#xff1f; 那是我的第一个问题&#xff0c;因此我浏览了Jelastic网站。 回答此问题的最佳方法是查看“ Jelastic团队”部分。 创始人&#xff0c;顾问&#xff0c;特殊合作伙伴构成了一支真正的专业团队。 作为特殊的合作伙伴&#xff0c;您会发现MySQL&am…

请先设置tkk_搅拌站水泥罐仓顶除尘器设置及调整

搅拌站水泥罐仓顶除尘器采用脉冲喷吹清灰系统&#xff0c;除尘器本体结构&#xff0c;采用标准模板焊接&#xff0c;整体结构&#xff0c;强度牢靠&#xff0c;组装维修方便&#xff0c;脉冲清灰采用时序控制器MCY系列 控制阀门KEK系列&#xff0c;喷吹清灰频率及喷吹间隔可手…

并发–执行程序和Spring集成

基于线程池/执行器的实现 比原始线程版本更好的方法是基于线程池的线程池&#xff0c;其中基于运行任务的系统定义了适当的线程池大小– CPU数量/&#xff08;任务的1-Blocking Coefficient&#xff09;。 Venkat Subramaniams书中有更多详细信息&#xff1a; 首先&#xff0c…

后面的参数_英特尔I系列CPU大家都知道,后面的参数你有没有了解过

嗨&#xff01;大家好&#xff0c;我是伟仔&#xff0c;今天主要是和大家聊下CPU。大多数人买笔记本或台式电脑对CPU的要求就知道I5或者I7之类的。像是I7一定比I5要好&#xff0c;I3很LOU这样的&#xff0c;当然这样子的观点是不正确的&#xff0c;今天我会告诉大家&#xff0c…

移动端

http://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html 移动端手淘使用方案 移动端px自动转换rem插件 CSSREM Flexible 转载于:https://www.cnblogs.com/yuruiweb/p/6723580.html

OutOfMemoryError:Java堆空间–分析和解决方法

java.lang.OutOfMemoryError&#xff1a;Java堆问题是在支持或开发复杂的Java EE应用程序时可能会遇到的最复杂的问题之一。 这篇简短的文章将为您提供此JVM HotSpot OutOfMemoryError错误消息的描述&#xff0c;以及在解决该问题之前应如何解决此问题。 有关如何确定要处理的O…

Google AppEngine:任务队列API

任务队列 com.google.appengine.api.taskqueue 使用任务队列&#xff0c;用户可以发起一个请求&#xff0c;以使应用程序执行此请求之外的工作。 它们是进行后台工作的强大工具。 此外&#xff0c;您可以将工作组织成小的离散单元&#xff08;任务&#xff09;。 然后&#xf…

NetBeans 7.2 beta:更快,更有用

NetBeans 7.2的beta版本引起了极大的兴奋。 在本文中&#xff0c;我将简要介绍一下此版本令人兴奋的原因&#xff08;包括更好的性能&#xff0c;提供更多的提示以及集成FindBugs&#xff09;。 NetBeans 7.2 beta在典型的下载捆绑软件中可用&#xff0c;从较小的Java SE&#…

WPF DevExpress 设置雷达图Radar样式

DevExpress中定义的ChartControl很不错&#xff0c;很多项目直接使用这种控件。 本节讲述雷达图的样式设置 <Grid><Grid.Resources><DataTemplate x:Key"LabelItemDataTemplate" DataType"dxc:SeriesLabelItem"><Border CornerRadius…

mxnet系列教程之1-第一个例子

第一个例子当然是mnist的例子 假设已经成功安装了mxnet 例子的代码如下&#xff1a; cd mxnet/example/image-classification python train_mnist.py这样就会运行下去 train_mnist.py的代码为 """ Train mnist, see more explanation at http://mxnet.io/tutori…

mysql数据存在就更新_Mysql:如果数据存在则更新,不存在则插入

mysql语法支持如果数据存在则更新&#xff0c;不存在则插入&#xff0c;首先判断数据存在还是不存在的那个字段要设置成unique索引&#xff0c;例如表tb_addrbook如下&#xff1a;索引&#xff1a;语句1:不存在插入INSERT INTO tb_addrbook(num,name,mobile) VALUE(1001,小李,1…

【Hadoop】Hadoop MR 自定义分组 Partition机制

1、概念 2、Hadoop默认分组机制--所有的Key分到一个组&#xff0c;一个Reduce任务处理 3、代码示例 FlowBean package com.ares.hadoop.mr.flowgroup;import java.io.DataInput; import java.io.DataOutput; import java.io.IOException;import org.apache.hadoop.io.WritableC…