对FPgrowth算法的一种改进算法Word下载.docx
- 文档编号:17895840
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:6
- 大小:17.80KB
对FPgrowth算法的一种改进算法Word下载.docx
《对FPgrowth算法的一种改进算法Word下载.docx》由会员分享,可在线阅读,更多相关《对FPgrowth算法的一种改进算法Word下载.docx(6页珍藏版)》请在冰豆网上搜索。
FP-growth算法开辟了有效挖掘频繁模式的新途径。
然而,它的时间和空间效率还不足够高,仍可以进一步改进,本文提出一种称为NFP-growth算法的新方法。
1NFP-growth算法的设计与实现
1.1对FP-Tree头表结点数据结构的改进
在FP-Tree算法中,当每次要插入一个新的树节点时,需要在FP-tree中找与头表有相同的item_name的项,必须回到头表中,一个一个找出最后一个同名节点的node_link域后,再将新节点加入。
这种做法每次有一个新的树节点出现时就必须从头表第一个开始找,直到找出最后一个,数据量大时效率明显不佳。
要解决这个问题,可以考虑在头表节点中加上一个tail域,用来记录每一项的当前最后一个结点,这样当加入一个新节点时就不需要循序地一个一个找到最后一个node_link,而可以直接将新增加的项放到tail域中即可。
项目头表中增加了tail域后,headertable的数据结构变化如图1所示。
Item_name:
countTail_linkNode_link
图1数据结构变化
定义如下:
HTable:
Typedefstruct
{
intitem_name;
unsignedintcount;
//项目所出现的次数
structnode*node_link,//指向头表中相同项目的node_link的下一个节点
structnode,tail_link//记录头表中相同项目的node—link的最后一个节点所在位置
}//HTable;
算法的变化:
只要在FP-growth算法中有关建立头表链接部分加入下边程序即可:
if(headertable.tail=nul1)
headertable.node-link=新增节点;
headertable.tail-link=新增节点;
}
else
{headertable.Node-link所指node->
next=新增节点;
headertable.Tail-link=新增节点;
1.2对频繁模式树构造的改进
NFP-growth算法与原始FP-growth算法具有相似的算法流程结构,不同之处在于改进了结点结构,引进了标记位,在挖掘频繁模式时不生成条件FP-树,而且在对标记位进行计数时,不再采用原来的递归的、效率低的方法,而是引用了数组指针的概念。
(1)NFP-growth算法改进的节点数据结构。
Typedefstructfptnode{
Structfptnode*link;
//*link是指向具有相同item的节点的指针;
Structfptnode*Parent;
//*Parent是指向父节点的指针或左子女的指针;
intnode_name;
//node_name是存放item值(项目名)的数据;
intnode_count;
//node_count是记录item在事务对象中出现的计数;
intnode_mark:
//node_mark用来标识当前节点是否是需要处理的节点;
intnum//num用来标识一次回溯路径中item出现的次数;
}FPTNODE;
(2)NFP-growth算法中生成NFP-树的NFP-树的算法描述。
算法:
NFP-树构造
输入:
事务数据库D,最小支持度min_sup
输出:
FP-树
方法:
①扫描数据库D得到频繁项1-项集,按照支持度从大到小排列,得到频繁项目序列L;
②创建NFP-Tree:
For数据库中的每个事务tdo
将NFP-Tree中的current指针初始化,使其指向根节点T;
将事务t中的满足最小支持度计数要求的项按支持度从大到小放到队列Q中:
For队列Q中的每一个项Ido
NFP_tree_insert(I);
//在current指针所指节点的子女中插入I
③按层次遍历整棵NFP-tree,把每个节点C及其父节点P的指针作为一个队列元素放入队列Q中:
④For队列Q中每个元素qdo
q.c^node_parent:
=q.p;
//翻转父节点指针
函数():
FunctionNFP-tree_insert(ID)//在NFP-Tree中插入一个值为ID的节点
Ifcurrent指针指向的节点没有子女节点then
新建一个值为ID的NFP-tree节点node,current.node_parent=node;
修改current指针,使其指向新节点node;
Elseifcurrent指针指向节点的子女节点中有值为ID的节点then
该子女的节点的node_count值增加为1并修改current指针指向它;
Else
新建一个值为ID的NFP_tree节点的node;
在该节点子女的node_link链上添加node并使其count值为1;
修改curent指针,使其指向新节点node;
(3)调用NFP-growth算法对生成的NFP-树进行频繁模式挖掘。
Mine_NFP-tree操作如下:
Proceduremine_NFP-tree(Tree,α)
{
for指针数组的item_Point[n]的每一项,在Tree的项头表中
{
while(item_point[n]!
=null)
Ifmarkofitem_point[n]is0
Item_point[n]=item_point[n]->
link;
elsedo
产生一个模式β=item_point∪item_point[n],其支持度:
support=item_point[n].supprot;
构造β的条件NFP-树(Mark_tree):
①回溯β的前缀路径,设置num的值。
后缀节点的nmu=count;
回溯节点的num值为其孩子节点的num之和
②在回溯的前缀路径中,判断具有相同item的所有节点的num之和NUM,并与最小支持度比较。
If(NUM>
=support)setthemarksoftheseitemstol:
elsesetthemarksoftheseitemsto0
item-point[n]=item-point[n]->
link;
Iftree含单个路径Pandmarkislthen
for路径P中每个mark值为1节点的每个组合(记作β)
产生模式β∪item_point,其支持度support=β中节点的最小支持度
}
End
2NFP-growth算法与FP-growth算法性能测试
2.1实验环境与实验数据源
本实验是在一台CPU为P4,内存为256M,硬盘80G的兼容机上完成的,程序采用javascript编制。
该数据集包含2000个事务,10个属性,是一个关联度一般的数据集,原始数据集大小约为148K。
2.2实验结果
实验结果见表1和图2(图2是表1的图形表示)
表1FP-growth和NFP-growth执行效率比较
支持度频繁项目数FP-growth执行时间(s)NFP-growth执行时间(s)耗费时间比例
100175623.1242.2011.42:
1
3005000.8450.7351.57:
5001100.6810.6231.03:
100060.4890.4600.96:
3结束语
通过对表1和图2的分析可以看出,随着支持度不断
减小,频繁项目数不断增加,NFP-growth算法的执行效率比FP-growth算法大得更多,可见NFP-growth算法的性能优于FP-growth算法。
图2FP-growth和NFP-growth执行效率比较的图形表示
参考文献:
[1]毛国君,段立娟.数据挖掘原理与算法[M].北京:
清华大学出版社,2005.
[2]维普资讯[EB/OL].
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPgrowth 算法 一种 改进