python 频繁项集_频繁项集算法Eclat
Equivalence Class Transformation(Eclat)是频繁项挖掘和关联性分析的另外一种常用的算法,与Apriori和FP-growth不同的是,Eclat采用垂直数据格式。所谓的垂直数据格式,就是从对原有数据进行倒排。
Apriori算法和FP-Growth算法都是从TID项集格式(即{TID:itemset})的事务集中挖掘频繁模式,其中TID是事务标识符,而itemset是事务TID中购买的商品。Eclat使用用项-TID集格式(即{item:TID_set})表示,其中item是项的名称,而TID_set是包含item的事务的标识符集合。倒排索引并不是为了快速查找或搜索,而是进行数据统计。
Eclat算法原理
Eclat算法是一种深度优先算法,采用垂直数据表示形式在概念格理论的基础上利用基于前缀的等价关系将搜索空间(概念格)划分为较小的子空间(子概念格)。
垂直数据表示(倒排)
对于一般的检索方式我们是通过ID去寻找事务Item,这种数据格式称为水平数据格式。但是如果我们反过来,我们通过事务Item去寻找ID,这种水平格式称为垂直数据格式。把水平数据格式转为垂直数据格式的过程称为倒排。用熟悉的数据举个例子:
水平数据格式:
TID
Items in transaction
001
r,z,h,j,p
002
z,y,x,w,v,u,t,s
003
z
004
r,x,n,o,s
005
y,r,x,z,q,t,p
006
y,z,x,e,q,s,t,m
垂直数据格式:
Item
TID
z
{001,002,003,005,006}
x
{002,004,005,006}
y
{002,005,006}
r
{001,004,005}
…
…
垂直数据格式就是便利所有的Item并让其作为键,然后将包含该Item的ID作为值。倒排的代码如下先遍历一遍数据,得到倒排的数据。然后遍历倒排后的数据筛选出频繁项。
支持度计数(频繁项集)
使用倒排的好处在哪里呢?仔细看图就会发现,倒排后的数据频繁项直接可以通过Item对应多少个元素看出来。比如假设支持度为3,那么{z}, {x}, {y}, {r}它们都是频繁项。正是由于这种直接的数据表示形式,使得Eclat挖掘频繁项集更容易理解一些。频繁项获取的流程为:假设k代表每个频繁项内的元素数目,初始值为1,首先对k=1的频繁项取交集得到k+1的频繁项;然后对k+1的频繁集取交集得到k+2的频繁项,以此类推直到只有一个集合为止或者交集全为空。继续使用上面的数据举例,对上述数据取交集得到k+2的频繁项为如图所示。假如我们设最小支持度为3,那么{z,x}, {z,y}, {x,y}为频繁项。
Item
TID
z,x
{002,005,006
z,y
{002,005,006}
z,r
{001,005}
x,y
{002,005,006}
x,r
{004,005}
y,r
{005}
Eclat的优缺点
优点:采用了与传统挖掘算法不同的垂直数据库结构,由于这样只要扫描两次数据库,大大减少了挖掘规则所需要的时间,从而提高了挖掘关联规则的效率。
缺点:该算法没有对产生的候选集进行删减操作,若项目出现的频率非常高,,频繁项集庞大, 进行交集操作时会消耗系统大量的内存, 影响算法的效率。
Eclat算法实现
Eclat算法流程:
通过扫描一次数据集,把水平格式的数据转换成垂直格式;
项集的支持度计数简单地等于项集的TID集的长度;
从k=1开始,可以根据先验性质,使用频繁k项集来构造候选(k+1)项集;
通过取频繁k项集的TID集的交,计算对应的(k+1)项集的TID集。
重复该过程,每次k增加1,直到不能再找到频繁项集或候选项集。
示例代码:
def eclat(prefix, items, min_support, freq_items):
while items:
# 初始遍历单个的元素是否是频繁
key, item = items.pop()
key_support = len(item)
if key_support >= min_support:
# print frozenset(sorted(prefix+[key]))
freq_items[frozenset(sorted(prefix + [key]))] = key_support
suffix = [] # 存储当前长度的项集
for other_key, other_item in items:
new_item = item & other_item # 求和其他集合求交集
if len(new_item) >= min_support:
suffix.append((other_key, new_item))
eclat(prefix + [key], sorted(suffix, key=lambda item: len(item[1]), reverse=True), min_support, freq_items)
return freq_items
def eclat_zc(data_set, min_support=1):
"""
Eclat方法
:param data_set:
:param min_support:
:return:
"""
# 将数据倒排
data = {}
trans_num = 0
for trans in data_set:
trans_num += 1
for item in trans:
if item not in data:
data[item] = set()
data[item].add(trans_num)
freq_items = {}
freq_items = eclat([], sorted(data.items(), key=lambda item: len(item[1]), reverse=True), min_support, freq_items)
return freq_items
if __name__ == '__main__':
data_set = [['A', 'B', 'D', 'H'], ['A', 'B', 'E', 'I'], ['A', 'B', 'E', 'J'], ['A', 'C', 'F', 'G']]
freq_items = eclat_zc(data_set, 2)
print(freq_items)
参考链接:
python 频繁项集_频繁项集算法Eclat相关推荐
- python批量打印复印_惠普集群打印 小规模灵活批量打印方案
在我们的日常工作中有一种叫"小批量打印",例如操作手册.广告宣传等. 惠普解决方案集群打印技术集计算机.网络和分布技术于一身,将多台惠普激光打印机组成一台虚拟超高速打印机,打印速度 ...
- python如何让程序暂停_王者荣耀集祝福linkedin雄攻略
王者荣耀集祝福linkedin雄攻略,荣耀仍然为高低功组合合的率2是分7速双离,变化动力而且也没什么. 本儿这款了血也算产品是下,集祝台打的MV平专属造领先基于长安,能模开启对符的智轻人合年欧尚了绝长 ...
- 机器人鸣人是哪一集_火影忍者596集剧情介绍番外篇九尾抢夺指令_鸣人VS机器人版鸣人...
亲爱的火影迷们,没想到火影忍者本周竟然更新了两集,终于可以一饱眼福了,在火影忍者596集中,不仅是晓,就连大蛇丸都加入了九尾的抢夺中,袭击木叶,看鸣人等木叶的伙伴们如何迎敌,下面本网为您介绍一下火影忍 ...
- java求sum的前n项和_【LeetCode-面试算法经典-Java实现】【015-3 Sum(三个数的和)】...
原题 Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all ...
- python多目标优化_多目标优化算法(四)NSGA3(NSGAIII)论文复现以及matlab和python的代码...
前言:最近太忙,这个系列已经很久没有更新了,本次就更新一个Deb大神的NSGA2的"升级版"算法NSGA3.因为multi-objective optimization已经被做烂了 ...
- python 深度 视差 计算_开源双目视觉BM算法-Matlab/Python/Javascript
更新:应朋友要求,增加了一个Python版本的BM算法和Javascript版本 Python版本BMgithub.com JAVASCRIPT版本BMgithub.com 整理以前的代码,找到了 ...
- python猴子选大王_“猴子选大王” 算法 python实现
今天来实现一个约瑟夫环算法,下面是一道新浪的面试题: m只猴子围坐成一个圈,按顺时针方向从1到m编号.然后从1号猴子开始沿顺时针方向从1开始报数,报到n的猴子出局,再从刚出局猴子的下一个位置重新开始报 ...
- 数据结构与算法python语言描述答案_《数据结构与算法Python语言描述》习题第二章第一题(python版)...
1 #!/usr/bin/env python 2 #-*- coding:utf-8 -*- 3 4 """ 5 定义一个表示时间的类Time6 a)Time(hour ...
- python声纹识别_声纹识别算法、资源与应用(二)
<声纹识别·资源篇> 1. Kaldi 最流行的语音技术研究平台,没有之一.代码运行鲁棒性强.架构良好,便于算法修改.定制.如果你是高校科研人员,工程实现能力有限,那么没关系,你只要懂点S ...
最新文章
- Ubuntu 系统自带的截图工具screenshot
- ADT启动SDK Manager时一闪而过
- 2021年春季学期-信号与系统-第十三次作业参考答案-第十小题
- 嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误
- 《Serverless 架构》序言
- ModuleNotFoundError: No module named 'cv2' (安装cv2)
- 调用打码平台api获取验证码 (C#版)
- python如何防止代码查重_怎样避免论文代码查重
- 新一代数据仓库:Snowflake 弹性数仓介绍
- python爬取ajax_Python爬虫如-何爬取ajax网页之爬取雪球网文章
- 阳春三月,正是樱花绽放时,借此机会给午饭献上鲜艳艳的视觉盛宴!
- 安卓入门教程(十五)- Fragment,Service,WAMP下载
- 1949. 坚定的友谊
- 【Bugfix系列】/usr/bin/ld: cannot find -lxxx 的解决办法
- 机器学习_决策树与信息熵
- ch552开发环境配置
- win10中找不到www服务器,Windows10 cs搜不到局域网的两种解决方法
- 人工智能导论(7)——人工神经网络(Machine Learning)
- 遗传算法matlab_史上最强的MATLAB自学网站,你收藏了吗???
- 还是觉得WinXP中Luna的Theme是经典啊!用了Royal不多会儿就疲劳了!
热门文章
- 益书一世界——志愿者活动
- c/c++ backtrace打印函数调用栈
- rviz无法显示地图error:no map receive
- TinyXML2使用总结
- 编写一个简单的考试程序,在控制台完成出题、答题的交互。试题(Question)分为单选(SingleChoice)和多选( MultiChoice)两种。
- 网站收到信息系统安全等级保护限期整改通知书解决办法
- 我也说说蜗居里的几个人物,郭海藻很强,晚上和宋在床上打情骂俏,白天又说爱小贝,而且爱的死去活来。...
- 760. Find Anagram Mappings (leetcode)
- 埃博拉与现代微生物战争
- 妈妈生日快乐 ^_^