一种基于邻接表的最大频繁项集挖掘方法与流程

文档序号:17721897发布日期:2019-05-22 02:13阅读:336来源:国知局

最大频繁项集挖掘是许多数据挖掘应用中的重要问题,本发明涉及基于邻接表的最大频繁项集挖掘技术,在研究最大频繁项集挖掘的过程中,考虑到应用邻接表作为数据存储载体进行数据储存以备后面的最大频繁项集挖掘。该技术可以应用在很多领域,包括卫生保健领域、教育领域、制造领域等等,还可以用在日常的客户关系挖掘管理、诈骗入侵分析以及网购购物分析等多个方面,具有非常大的应用范围和市场潜力。



背景技术:

数据挖掘是从大量的数据中提取潜在,未知以及不易被人直观发现,且最终可以表示为可理解的知识的过程。关联规则挖掘就是数据挖掘研究的重要内容之一,旨在发掘数据中组成数据集的不同项之间的内在关联关系。它由两部分组成,第一部分挖掘所有项的最大频繁项集,第二部分用最大频繁项集产生所有满足给的最小置信度的关联规则,其中最重要的是最大频繁项的挖掘,它决定规则挖掘的整体性能。其在个性化推荐系统、风险分析、医疗以及食品安全等领域有广泛的应用前景。

在最大频繁项集挖掘算法中,最著名的便是apriori算法。该算法虽然思路和结构简单,没有复杂的推导,在频繁项集挖掘的过程中,以递归统计为基础不断修剪生成频繁项集,另外利用本身性质而产生候选集的方法在许多情况下缩小了检查的候选规模,使算法效率有一定的提高。但在产生最大频繁项集的过程中,需要产生、处理和保存大量的候选集和多次扫描数据库,占用大量的内存空间和系统时间,难以适应海量和稠密数据的挖掘。

针对apriori算法的缺陷,有学者提出了基于频繁模式树(fp-tree)产生最大频繁项集的fp-growth算法。该算法将事务数据集压缩到fp-tree中,用fp-tree映射存储项目的关联信息,最后对该树多次递归遍历产生最大频繁项集。该算法不需要产生大量的候选项,仅需要遍历数据库两次生成fp-tree,对fp-tree进行递归挖掘便可产生最大频繁项集,减少了数据库的遍历次数。但它需要创建一个包含所有数据集项的fp-tree,需要占用大量内存,内存消耗与fp-tree宽度和深度成比例。深度一般是单个事务所有项目数量的最大值,如果数据库中的频繁1-项集数量很大,且内存不能装载所有项目在fp-tree的映射信息,该算法将不能有效的工作。并且两次扫描数据库,生成和多次递归fp-tree也使得该算法的空间和时间性能不高。

本发明提出了一种基于邻接表最大频繁项集挖掘方法,同时借助了邻接表和哈希表结合的存储方式,以减少数据库的扫描次数和遍历的空间规模,并可以尽早修剪掉小于支持度阈值的项集,避免生成较长最大频繁项集的所有非空子集。该方法充分利用建立的邻接表,只需对原数据库扫描一次,具有时间复杂度低,消耗内存等优点。



技术实现要素:

要解决的技术问题

为了解决在最大频繁项集挖掘过程中,需要产生、处理和保存大量的候选集和多次扫描数据库,占用大量的内存空间和系统时间,难以适应海量和稠密数据的挖掘。本发明提出一种基于邻接表的最大频繁项集挖掘方法。

技术方案

一种基于邻接表的最大频繁项集挖掘方法,其特征在于步骤如下:

步骤1:扫描数据库生成邻接表

首先定义邻接表的图的存储结构hashmap<node_list,edge>,设置node_list为存储头结点,edge为存储邻接点的信息,边节点edge的结构包括3个变量,一个是边的一个顶点的位置node,另一个是边的另一顶点的位置node,还有一个为边上的权值,即项的频繁度cost;然后对数据文件进行处理,先要存储文件路径并进行文件读取,在读取过程中需要对数据进行处理,要将每行数据去除空格后分割存入数组,通过调用邻接表的存储函数,将数组作为参数传入邻接表;最后在一次读取链接表中的项xi,判断其中的顶点项是否含有xi,若xi∈node_list,则继续判断node[]中除去项xi后的其余各项xj≠i是否已存在于edge中,如果已经存在,则边的权值cost自增1,否则cost值设置为1,并将xj≠i添加到edge中;若则直接将xi添加到node_list中;

步骤2:挖掘最大频繁项集

首先,遍历邻接表的各顶点项ai和对应邻接点项{xi|xi∈edgei},如果xi的权值cost即频繁度数,满足cost≥min_sup,则取ai∪xi形成2-项频繁项集,否则剪去xi,其中min_sup为最小支持度阈值;然后根据初始得到的2-项频繁项集去置换顶点项aj,即如果满足取该邻接点集合对应的头顶点aj,令ai∪xi∪aj便得到更高一维的频繁项集;以此类推,利用k-项频繁项集去置换顶点项,取并集形成k+1项频繁项集,直到置换不出顶点,该方法结束,得到所有的最大频繁项集。

有益效果

本发明提出的一种基于邻接表的最大频繁项集挖掘方法,借助了邻接表和哈希表结合的存储方式,以减少数据库的扫描次数和遍历的空间规模,并可以尽早修剪掉小于支持度阈值的项集,避免生成较长最大频繁项集的所有非空子集。该方法充分利用建立的邻接表,只需对原数据库扫描一次,具有时间复杂度低,消耗内存等优点。

本发明基于邻接表的最大频繁项集挖掘方法,该方法只需遍历数据库一次,大大减少了i/o操作,同时对邻接表的存储采用哈希表,提升了数据遍历的速率。虽然该方法对邻接表的存储需要增加额外的存储空间,但不需要频繁的操作数据库和进行递归挖掘,也不需要产生和存储大量的候选集,以及建立顶头表和大量复杂的排序操作。在很大程度降低了算法的时间消耗和空间消耗,尤其在处理稠密数据集,该方法表现出高效的性能。

具体实施方式

现结合实施例对本发明作进一步描述:

本发明基于邻接表的最大频繁项集挖掘方法,将每项事务集视为完全图,各项出现的频繁次数视为图中相邻节点的权重。该方法主要包括两个核心步骤:首先遍历数据库,将每项事务集中的各项依次存入带权的邻接表中,随着数据库中每项事务集的并入,邻接表不断增长,直至数据库中所有事务项扫描完毕,该邻接表已保存了所有事务项的关联信息,然后对邻接表进行挖掘。首先按照设置的最小支持度,取邻接表中的顶点项与相邻项形成2-项频繁项集,然后遍历邻接表,以2-项频繁项集为基础不断进行置换对应的顶点项,再进行合并形成更高维的频繁项集,直至没有可以合并的顶点项该方法结束。

步骤1:扫描数据库生成邻接表

数据库中每一条事务集中的项是相互关联的,组成一个完全图,即每对不同的项之间有一条边相连,边即表示关联关系,边的权重为频繁度。相互关联的两项,每关联一次其边的权值加1,所有的事务集合并后,便形成一个带权无向图。

本发明采用邻接表实现对图的存储,因为构造n个顶点和e条边的无向图,邻接矩阵的时间复杂度为o(n*n+e*n),其中邻接矩阵初始化消耗的时间为o(n*n)。而构造邻接表的时间复杂度为o(n+e),相对邻接矩阵,采用邻接表,方法在空间和时间整体性能上比较高。该方法只需遍历数据库一次,也不需要大量的排序和内存单元移动,便可生成最终的邻接表。该邻接表可以映射数据库中所有项的关联信息,顶点到每个邻接点的权重保存了相应的最大频繁度计数。

遍历数据库生成邻接表方法描述如下:

该部分主要负责在遍历整个数据库获取所有数据并将其存入新建立的邻接表以备后面最大频繁项集的数据挖掘。首先先定义邻接表的图的存储结构hashmap<node_list,edge>,设置node_list为存储头结点,edge为存储邻接点的信息,边节点edge的结构包括3个变量,一个是边的另一顶点的位置node,另一个是边的另一顶点的位置node,还有一个为边上的权值,即项的频繁度cost。然后对数据文件进行处理,先要存储文件路径并进行文件读取,在读取过程中需要对数据进行处理,要将每行数据去除空格后分割存入数组,通过调用邻接表的存储函数,将数组作为参数传入邻接表。最后在一次读取链接表中的项xi,判断其中的顶点项是否含有xi,若xi∈node_list,则继续判断node[]中除去项xi后的其余各项xj≠i是否已存在于edge中,如果已经存在,则边的权值cost自增1,否则cost值设置为1,并将xj≠i添加到edge中。若则直接将xi添加到node_list中。

步骤2:最大频繁项集挖掘

在经过一次遍历数据库后得到的邻接表,保存了所有事物项集的频繁信息和关联信息。在进行最大频繁项集挖掘时,充分利用该邻接和频繁项集的两个性质,即如果x是频繁项集,则x的任意非空子集都是频繁项集;如果x是非频繁项集,则x的任意超集都是非频繁相集。首先,遍历邻接表的各顶点项ai和对应邻接点项{xi|xi∈edgei},如果xi的权值cost即频繁度数,满足cost≥min_sup,则取ai∪xi形成2-项频繁项集,否则剪去xi。然后根据初始得到的2-项频繁项集去置换顶点项aj,即如果满足取该邻接点集合对应的头顶点aj,令ai∪xi∪aj便得到更高一维的频繁项集。以此类推,利用k-项频繁项集去置换顶点项,取并集形成k+1项频繁项集,直到置换不出顶点,该方法结束,可以得到所有的最大频繁项集。

方法描述如下:

(1)用集合hashmap<node_list,int>frequent存储最大频繁项集,min_sup为最小支持度阈值,graphedge为遍历数据库各项目集后产生的邻接表。

(2)setfrequent(min_sup);//遍历邻接表,根据最小支持度阈值获取2-项频繁项集,并剪去小于最小支持度阈值的项,以便在获取多维频繁项集时减少遍历个数。

foreach{ai|ai∈node_list}do//自顶向下依次获取顶点项ai。

{for(从左到右依次遍历顶点项ai对应的邻接点xi∈edge)

if邻接点项xi的cost<min_sup,则从邻接表中删除该顶点对应的xi项

将ai∪xi添加到frequent中,直到ai的所有邻接点xi遍历完。ai∪xi与xi∪ai是相同的集合,frequent中只存一份

}//endoffor

//当graphedge中的所有顶点项集ai遍历完,2-项频繁项集则全部找出

}//endofforeach

(4)getpattern(frequent)//以开始挖掘的2-项频繁项集为基础,置换多维频繁项集。

foreach{ii|ii∈frequent}do//依次取frequent集合中已存在的频繁项集

for(自顶向下依次遍历邻接表graphedge中所有的顶点以及所有顶点的邻接点)

ifii∈edge,取该邻接点的顶点ai

将ai∪ii存入frequent中,直到frequent中的频繁项集遍历完,并更新frequent重复步骤(4),直到再找不到ii∈edge,则成功找出所有的频繁项集,程序结束。

}endoffor

}endofforeach

实施例:

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1