数据挖掘十大经典算法之apriori算法源代码Word格式.docx

上传人:b****2 文档编号:15115706 上传时间:2022-10-27 格式:DOCX 页数:15 大小:22.29KB
下载 相关 举报
数据挖掘十大经典算法之apriori算法源代码Word格式.docx_第1页
第1页 / 共15页
数据挖掘十大经典算法之apriori算法源代码Word格式.docx_第2页
第2页 / 共15页
数据挖掘十大经典算法之apriori算法源代码Word格式.docx_第3页
第3页 / 共15页
数据挖掘十大经典算法之apriori算法源代码Word格式.docx_第4页
第4页 / 共15页
数据挖掘十大经典算法之apriori算法源代码Word格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数据挖掘十大经典算法之apriori算法源代码Word格式.docx

《数据挖掘十大经典算法之apriori算法源代码Word格式.docx》由会员分享,可在线阅读,更多相关《数据挖掘十大经典算法之apriori算法源代码Word格式.docx(15页珍藏版)》请在冰豆网上搜索。

数据挖掘十大经典算法之apriori算法源代码Word格式.docx

VC界面的源代码见 

由Agrawal等人提出的Apriori是经典的关联规则和频繁项集挖掘算法,围绕着它的改进和实现有大量的文献。

该算法是挖掘产生布尔关联规则频繁项目集的经典算法,从其产生到现在对关联规则挖掘方面的研究有着很大的影响。

为了提高频繁项目的挖掘效率,Apriori算法利用了两个重要的性质,用于压缩搜索的空间。

【1】若X为频繁项目集,则X的所有子集都是频繁项目集。

【2】若X为非频繁项目集,则X的所有超集均为非频繁项目集。

Apriori算法的处理流程为:

宽度优先搜索整个项集空间,从k=0开始,迭代产生长度为k+1的候选项集的集合Ck+1。

候选项集是其所有子集都是频繁项集的项集。

C1由I0中所有的项构成,在第k层产生所有长度为k+1的项集。

这由两步完成:

第一步,Fk自连接。

将Fk中具有相同(k-1)-前缀的项集连接成长度为k的候选项集。

第二步是剪枝,如果项集的所有长度为k的子集都在Fk中,该项集才能作为候选项集被加入Ck+1中。

为了计算所有长度为k的候选项集的支持度,在数据库水平表示方式下,需要扫描数据库一遍。

在每次扫描中,对数据库中的每条交易记录,为其中所包含的所有候选k-项集的支持度计数加1。

所有频繁的k-项集被加入Fk中。

此过程直至Ck+1等于空集时结束。

算法 

Apriori

Input:

TransactionDataBase 

D,Minimumsupportthreshold 

minsup。

Output:

Frequentpattern 

L

(1) 

L1=search_frequent_1-itemsets(D);

(2) 

for(k=2;

Lk-1≠φ;

k++) 

do

(3) 

begin

(4) 

Ck=apriori-gen(Lk-1);

(5) 

forall 

transactions 

(6) 

(7) 

Ct=subset(Ck,t);

(8) 

candidatesc 

Ct 

(9) 

c.count++;

(10) 

end

(11) 

Lk 

={c 

Ck|c.count≥minsup}

(12) 

(13)Answer 

L=∪kLk;

ProcedureSearch_frequent_1-itemsets(D)

foreachitem 

ik 

ik.count++;

L1 

={ 

i.count≥minsup}

return 

L1;

Procedureapriori_gen(Lk)

for 

each 

itemset 

l1 

l2 

if 

( 

l1[1]=l2[1]) 

l1[2]=l2[2]) 

… 

l1[k-1]=l2[k-1]) 

l1[k]<

l2[k]) 

then

c= 

l2;

Is_include_infrenquent_subset(c,Lk) 

delete 

c;

else 

add 

to 

Ck+1 

;

(13) 

(14) 

ProcedureIs_include_infrenquent_subset(c,Lk)

(1)begin

foreach 

k-subset 

of 

c

retureTURE;

returnFALSE 

(6)end

在主程序中,第一步首先扫描整个交易数据库D,统计每个项目(item)的支持数,计算其支持度,将支持度大于等于最小支持度minsup的项目构成的集合放入到L1 

中;

从第2步到第11步,用k-1频繁项目集构成的Lk-1生成候选集的集合Ck,以便从中生成Lk,其中apriori_gen函数(第4步)用来从Lk-1中生成Ck,然后对数据库进行扫描(第5步),对于数据库中的每一个交易,subset函数用来发现此交易包含的所有候选集(第7步),并为这些候选集的计数器加1(第8-9步)。

最后满足minsup的候选集被放入到Lk中。

apriori_gen过程完成两种操作:

并(join)和剪枝(prune)。

在并运算步骤中,Lk-1 

与Lk-1 

进行并运算生成潜在的候选集(2-7步),条件l1[k-1]<

l2[k-1]保证不会有重复的候选集生成(第5步)。

在剪枝步骤中(8-10步),利用性质2.1,删除那些存在子集不是频繁项目集的候选集,测试子集是否为频繁项目集由过程Is_include_infrenquent_subset完成。

为了清楚的阐述Apriori算法的挖掘过程,现举例如下:

【例1】设事务数据库D如表2.1所示,D中包含4个事务,即|D|=4,最小支持数mincount=2,即最小支持度minsup=2/4=50%。

挖掘频繁项目集的具体过程如下所述:

C1={{A},{B},{C},{D},{F}},第一次循环产生L1={{A},{B},{C},{F}},由Apriori_gen(L1)生成C2,扫描数据库,计算C2中每个候选集得到L2。

依此循环,得到L3。

整个挖掘过程如图2.1所示。

表1 

事务数据库D

Tid

事务

100

200

300

400

B,C,F

A,C,D

B,F

A,B,C,F

图1Apriori算法的执行过程

在找到了事务数据库中的所有频繁项集后,利用这些频繁项集可以产生关联规则,产生关联规则的步骤如下:

对于每个频繁项目集l,产生l的所有非空子集。

对于l的每个非空子集m,如果support(l)/support(m)≥minconf,则输出规则“m 

(l-m)”。

例如,在上例中产生的频繁项目集l={B,C,F},l的非空子集有{B,C}、{B,F}、{C,F}、{B}、{C}和{F},则运用上述产生关联规则的方法可以得到以下关联规则:

confidence=(2/4)/(4/4)=1

confidence=(2/4)/(3/4)=0.667

confidence=(2/4)/(2/4)=1

confidence=(2/4)/(3/4)=0.667

源代码 

apriori.c

//////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////

#include<

stdio.h>

typedef 

struct 

{

intitem[100];

//数据项

}D_Node;

//数据库D

//数据项,用item[0]保存支持度

}C_Node;

//候选集

}L_Node;

//频繁集

C_NodeC[100][100];

L_NodeL[100][100];

D_NodeD[100];

intmin_supp;

//最小支持度

void 

InPut()

inti,j,n,n1;

printf("

请输入最小支持度:

"

);

scanf("

%d"

&

min_supp);

请输入交易集的大小"

D[0].item[0]);

n=D[0].item[0];

for(i=1;

i<

=n;

i++) 

//for1

请输入交易[%d]中记录的个数(n)"

i);

n1);

D[i].item[0]=n1;

for(j=1;

j<

=n1;

j++) 

//for2

请输入交易[%d]中记录项,直接输入数字:

D[i].item[j]);

}//for2

}//endofInPut

C1()

//功能:

扫描数据集D生成1项候选集C1

//输入:

数据集D

//输出1项候选集C1

//初始条件数据集D非空

inti,j,k;

intno=1,temp=0;

C[1][0].item[0]=0;

//1项集的个数,在本算法中,用C[n][k].item[0]来保存候选集Cn的第k项的支持度

if(D[0].item[0]!

=0)

C[1][1].item[1]=D[1].item[1];

}

=D[0].item[0];

//for1 

=D[i].item[0];

//for2 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1