1、_一、实验目的与要求掌握关联规则和序列模式的基本原理,在此基础上针对给定的数据集,基于C语言编程实现关联规则挖掘算法和序列模式挖掘算法。二、实验内容1令supmin = 30%, 如频繁1项集L1= I1:4, I2:5,I3:4, I4:4, I6:3,请写出其他所有频繁项集。Transaction-idItems boughtt1I1、I2、I3t2I1、I4t3I4、I5t4I1、I2、I4t5I1、I2、I6、I4、I3t6I2、I6、I3t7I2、I3、I62基于C语言编程实现Apriori算法;3. 基于Weka进行数据的准备、预处理及关联规则与序列模式的挖掘三、实验步骤(操作界面
2、截图或程序清单)1. 令supmin = 30%, 如频繁1项集L1= I1:4, I2:5,I3:4, I4:4, I6:3,请写出其他所有频繁项集。Transaction-idItems boughtt1I1、I2、I3t2I1、I4t3I4、I5t4I1、I2、I4t5I1、I2、I6、I4、I3t6I2、I6、I3t7I2、I3、I6解:7*30%=2.1,则最小支持度等于3.频繁2项集:(1)连接得:C2=I1,I2,I1,I3,I1,I4,I1,I6,I2,I3,I2,I4,I2,I6,I3,I4,I3,I6,I4,I6(2)删除得:L2=I1,I2,I1,I4,I2,I3 ,I2
3、,I6,I3,I6频繁3项集:(1)连接得:C3=I1,I2,I4,I2,I3,I6(2)删除得:L3=I2,I3,I62. 基于C语言编程实现Apriori算法代码如下:#includetypedef struct int item100; /数据项 D_Node; /数据库Dtypedef struct int item100; /数据项,用item0保存支持度 C_Node; /候选集typedef struct int item100; /数据项,用item0保存支持度 L_Node;/频繁集C_Node C100100;L_Node L100100;D_Node D100;int m
4、in_supp; /最小支持度void InPut() int i,j,n,n1; printf(请输入最小支持度:); scanf(%d,&min_supp); printf(请输入交易集的大小:); scanf(%d,&D0.item0); n=D0.item0; for(i=1;i=n;i+) /for1 printf(请输入交易%d中记录的个数(n):,i); scanf(%d,&n1); Di.item0=n1; for(j=1;j=n1;j+) /for2 printf(请输入交易%d中记录项,直接输入数字:,i); scanf(%d,&Di.itemj); /for2 /for1
5、 /end of InPutvoid C1() /功能:扫描数据集D生成1项候选集C1 /输入:数据集D /输出1项候选集C1 /初始条件 数据集D 非空 int i,j,k; int no=1,temp=0; C10.item0=0; /1 项集的个数,在本算法中,用Cnk.item0来保存候选集Cn的第k项的支持度 if(D0.item0!=0) C11.item1=D1.item1; for(i=1;i=D0.item0;i+) /for1 for(j=1;j=Di.item0;j+) /for2 temp=1; for(k=1;k=no;k+) /for3 if(C1k.item1=D
6、i.itemj) C1k.item0+; /支持度加1 temp=0; / /if /end for3 if(temp)/生成新的项集 C1+no.item1=Di.itemj; C1no.item0=1; /end for2 / end for1 C10.item0=no;/数据项的个数 /end of C1()void Cn( int n) /用频繁集Ln-1为基础,通过连接得到n项候选集Cn int i,j,k,p,q,s,t,num; int no=0,temp=0,count; Cn0.item0=0; /初始化/printf(in Cn(%d) n=%d/n,n,n);/print
7、f(in Cn(%d) C%d0.item0=%d/n,n,n,Cn0.item0);num=Ln-10.item0; /num是Ln-1项集的数据个数 for(i=1;i=num;i+) for(j=i+1;j2)/if 1 for(k=1;kn-1;k+) /for3 if(Ln-1i.itemk!=Ln-1j.itemk) temp=0; break; /if 1 /end for3 /end if1 if(temp=1)/满足联结条件 / printf(in if 2 no=%d/n,no); no+; for(p=1;p=n-1;p+) Cnno.itemp=Ln-1i.itemp;
8、 Cnno.itemp=Ln-1j.itemp-1; Cnno.item0=0; for(q=1;q=D0.item0;q+) /for5 测试其支持度 count=0; /count用来记数,当所测试的项存在时,count加1,当count=n时,则子集存在 for(s=1;Cnno.items!=0;s+) /for6 for(t=1;t=Dq.item0;t+) /for7 if(Cnno.items=Dq.itemt) count+=1; break; /end for7 /end for 6 if(count=n) Cnno.item0+=1;/子集存在,第no项的支持度加1 /en
9、d for5 Cn0.item0+=1; /end if2 /end for2/end of Cn()void L1() int i,j,k; j=0; L10.item0=0; /printf(C10.item0=%d/n,C10.item0); for(i=1;i=min_supp) j+=1; for(k=1;k=1;k+) L1j.itemk=C1i.itemk; L1j.item0=C1i.item0; / printf(L1%d.item1=%d ,j,L1j.item1); 测试功能时加的 / printf( -%d/n,L1j.item0); /end for1 L10.ite
10、m0=j;/end of L1()void Ln(int n) int i,j,k; Cn(n); j=0; Ln0.item0=0; / printf(in Ln(%d) C%d0.item0=%d/n,n,n,Cn0.item0); for(i=1;i=min_supp) j+=1; for(k=1;k=n;k+) Lnj.itemk=Cni.itemk; Lnj.item0=Cni.item0; /end if /end for1 Ln0.item0=j; /保存数据的个数/end of Ln(int n) void OutPut(int n) int i,j,k; printf(频繁项
11、目集L%d如下:n,n); k=Ln0.item0; if(k!=0) for(i=1;i=k;i+) printf(); for(j=1;j=n;j+) printf( I%d ,Lni.itemj); printf(t支持度:%dn,Lni.item0); /for else printf(项目集为空n); int main() int i; int n=1; InPut(); C1();/初始化,生成1项候选集C1 L1();/得到1项频繁集L1 while(Ln0.item0!=0) n+=1; Ln(n); for(i=1;i=n;i+) OutPut(i); char ch; scanf(%d,&i); 四、实验结果与分析1.略2.实验截图如下:Welcome ToDownload !欢迎您的下载,资料仅供参考!精品资料