1.相关概念

支持率: 一个项集III在事务集合Γ={T1,T2,…,Tn}\Gamma=\begin{Bmatrix}T_1,T_2,\ldots,T_n\end{Bmatrix}Γ={T1​,T2​,…,Tn​​}中包含子集III的事务占全体事务的比例称之为支持率。

事务序号 项集
1 {A,B,E}
2 {D,E,F}
3 {A,C,D,E}
4 {D,E,F}
5 {C,E,F}

在上述事务集合中,项集{A,E}的支持率是2/5=0.4,项集{E,F}的支持率是3/5=0.6。

频繁项集挖掘: 给定一个事务的集合Γ={T1,T2,…,Tn}\Gamma=\begin{Bmatrix}T_1,T_2,\ldots,T_n\end{Bmatrix}Γ={T1​,T2​,…,Tn​​},其中每个事务TiT_iTi​是项集总空间UUU的一个子集,从Γ\GammaΓ中找到所有项集III,其中III满足支持率不低于预先设定的最小支持率。例如,上述事务集合中,若设定minsup=0.5,项集{E,F}和{D,E}都是频繁项集。

向下闭包性: 频繁项集的子集一定是频繁项集。下图是频繁项集的搜索树,能很好的观察到向下闭包性

这条性质非常重要,因为它的逆否命题为:若子集不是频繁的,那么超集一定不是频繁的。据此,在频繁项集的搜索过程中,可以直接丢弃非频繁的子集,那么它的所有超集都不会被搜索到,这叫搜索树的剪枝。Apriori算法采用了向下闭包性,极大的提高了挖掘效率。

2.Apriori

简述: 挖掘频繁项集在逻辑上就是搜索一颗枚举树并计算结点支持率的过程。在不知道Apriori算法的情况下,我们应该自然而然地想到暴力算法:穷举所有非空子集(2n−12^n-12n−1个),挨个计算子集的支持率看是否小于最小支持率。然而,暴力算法效率很低。不过,Apriori算法利用了向下闭包性,在逻辑上对枚举树进行了剪枝操作,当n很大时极大的减少了搜索的子集个数,提高了效率。

算法过程: 首先,生成长度为k的候选项集(k从1开始),计算它们的支持率;然后,根据支持率生成长度为k的频繁项集,这个时候非频繁的k项集被抛弃了;之后,用k频繁项集生成长度为(k+1)的候选项集,再计算它们的支持率。如此重复上述过程直到不存在更大的频繁项集为止。

用图解的方法描述一下算法过程:

事务序号 项集
1 {A,B,E}
2 {D,E,F}
3 {A,C,D,E}
4 {D,E,F}
5 {C,E,F}

记FkF_kFk​为k频繁项集,CkC_kCk​为k候选项集,OUTOUTOUT为所有频繁项集的集合,Apriori算法描述如下:

Apriori算法是一个迭代的过程,看上去很简单,但是注意到每次迭代中有两个重要的步骤:超集生成和支持率计数。超集生成是指通过k阶频繁项集生成无重复的k+1阶候选项集,支持率计数是计算候选项集在给定事务集合上的支持率。这两个步骤是Apriori算法的难点,因为它们都是时间复杂度比较高的操作。Apriori算法的高效率不仅仅来源于剪枝操作,还源于高效的超集生成算法和支持率计数算法。

3. 代码实现

生成候选集: 当k>1时,若k频繁项集中两项有交集的话,那么交集元素一定是k-1个,那么两者求并集可以生成k+1阶候选集;没有交集,什么也不做。当k=1时,直接两两求并集。平均时间复杂度是O(mn2)O(mn^2)O(mn2),n是频繁项集的总数,m是频繁项集的长度。如下代码所示:

#生成候选集
def produce_Candinate(F,k):n =len(F)#候选集开始为空C=[]#频繁项集长度为1时,两两求并集if (k-1)==0:for i in range(0,n-1):for j in range(i+1,n):tmp = set(F[i])|set(F[j])C.append(list(tmp))#否则,两两连接else:for i in range(0,n-1):for j in range(i+1,n):#如果两个集合没有交集,不能做连接操作if len(set(F[i])&set(F[j])) ==0:continue#求并集tmp = set(F[i]) | set(F[j])if list(tmp) not in C:C.append(list(tmp))return  C

支持率计算: 候选项逐个和事务求交集得到的长度和候选项的长度相同认为包含于事务中。时间复杂为O(n∗m∗t)O(n*m*t)O(n∗m∗t),m为候选项集的数目,n为事务的数目,t为候选项集的长度。

#计算支持率
def support(item,T):n=len(T)l=len(item)count=0for x in T:if  len(set(x)&set(item)) == l:count=count+1return  1.0*count/n

Apriori代码示例:

#Apriori算法挖掘频繁项集
def frencunt_item_minning(T,minsup):k=1#结果集out=[]#生成1候选集C=[]for x in T:C=list(set(x)|set(C))#生成1频繁项集F=[]for i in C:if support(list(i),T) >= minsup:F.append([i])#迭代while (len(F)>0):out.append(F)#生成k+1候选集C=produce_Candinate(F,k)#生成k+1频繁项集F=[]for i in C:if support(i,T) >=minsup:F.append(i)k=k+1return outT=[['A','B','E'],['D','E','F'],['A','C','D','E'],['D','E','F'],['C','E','F']]
out =frencunt_item_minning(T,0.3)
print('频繁项集')
for i in out:print(i)

结果为:

这里的实现代码,生成超集和支持率计数的效率都比较低。有很多方法可以优化Apriori,在此不再讨论。(例如,使用枚举树为数据结构。)

Apriori算法详解相关推荐

  1. Apriori算法详解之【一、相关概念和核心步骤】

    感谢红兰整理的PPT,简单易懂,现在将其中精彩之处整理,与大家分享. 一.Apriori算法简介:  Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测 ...

  2. Apriori算法详解与实现

    Apriori算法详解与实现 一.摘要 二.绪论 三.算法介绍 1.项目 2.项集 3.项集的支持度 4.关联规则 5.关联规则的置信度 6.频繁k项集 7.算法流程 四.代码实现 五.引用 一.摘要 ...

  3. 关联性挖掘--Apriori算法详解

      首先,要感谢谭武和张朋博同学的PPT,怀念以前一起学习数据挖掘十大算法的时光! 1.关联挖掘例子 啤酒和尿布的故事:   在一家超市中,人们发现了一个特别有趣的现象:尿布与啤酒这两种风马牛不相及的 ...

  4. 【大数据算法】:apriori算法详解,非常清晰

    如果看懂了apriori算法的直接看下面的过程, 从第k-1层推到第k层的时候的过程就是扩大-连接-剪支的过程,明白了这个了就好写了 1. 扫描数据库,生成候选1项集和频繁1项集. 2. 从2项集开始 ...

  5. Apriori算法详解及手写案例

    大家好,我是W 在数据挖掘中有一种关联分析算法叫做Apriori算法,大家可能都听说过啤酒尿布的故事,购买尿布的爸爸很可能会再去购买一份啤酒来犒劳自己,在大数据的背景下已经无法使用人工的方法去发现海量 ...

  6. 数据挖掘|关联规则Apriori算法详解及其在中医医案中的应用

    本文简单介绍传统数据挖掘关联规则算法中的Apriori算法,以及在挖掘中医医案辨证规律中的应用.并简单分析传统算法缺点,提出简要的改进思路. 文章目录 一.关联规则简介 二.Apriori算法简介 三 ...

  7. 【机器学习】关联分析Apriori算法详解以及代码实现

    Apriori算法以及统计学基础 什么是关联分析 简单的统计学基础 Apriori输出频繁集 从频繁项集中挖掘关联规则 什么是关联分析 从大规模数据集中寻找物品间的隐含关系被称作关联分析.而寻找物品的 ...

  8. ipriori weka java_weka apriori算法详解以及参数详解

    一.Apriori算法参数含义 本次共进行了9组实验,使用了weka安装目录data文件夹下的contact-lenses.arff数据. ToolsàArffViewer,打开contact-len ...

  9. 【数据挖掘】:FP增长算法详解

    FP-growth算法,fpgrowth算法详解 使用FP-growth算法来高效发现频繁项集 前言 你用过搜索引擎挥发现这样一个功能:输入一个单词或者单词的一部分,搜索引擎酒会自动补全查询词项,用户 ...

最新文章

  1. 6、Cocos2dx 3.0游戏开发的基本概念找个小三场比赛
  2. netty系列之:channelHandlerContext详解
  3. vue中使用swiper,vue-awesome-swiper
  4. YbtOJ#20089-[NOIP2020模拟赛B组Day10]平衡的树【贪心】
  5. 工业交换机的性能优势有哪些?
  6. elk logstach收集交换机日志
  7. 小米2S稳定版 教你如何一键ROOT
  8. 最大报销额(01背包)
  9. 六年级计算机课件,六年级信息技术上册课件.ppt
  10. 2020年度CSDN博客之星评选——【Mr.郑先生_】感谢各位朋友的支持与陪伴!
  11. 熵(entropy):宇宙的终极规则
  12. 主机win7和虚拟机xp之间的文件传输
  13. Elasticsearch 7.X-8.0 AggregationBuliders 相关聚合函数(一)计数指标-百分位数
  14. Perma.cc停止学术链接腐烂
  15. 提高ubuntu下访问github的速度
  16. 云游戏的2022:破局、新生、元宇宙
  17. 学术会议html模板,关于学术研讨会邀请函的模板
  18. 你好,C++(6)2.3 C++兵器谱
  19. 功能强大的微信商城系统,欢迎体验
  20. operator=函数.

热门文章

  1. 大数据是把双刃剑,关键看怎么用
  2. mysql中查询遇到longtext类型,查询效率很低。
  3. 点赞!远赴丹麦求学的中国人,自研电阻焊与铆接仿真软件25年风靡全球
  4. QT Creater 使用
  5. ios uiview 如何刷新_ios app应用版本如何更新
  6. 怎样才能拍出漂亮的照片?
  7. RSS阅读器BT sync
  8. 2018国税 计算机相关,国税面试 | 2018年3月15日国税系统面试真题解析
  9. 大数据云计算——shell组件
  10. 笔经-腾讯2018暑期实习生-数据分析岗笔试经历