1、 一、实验目的与要求 掌握关联规则和序列模式的基本原理,在此基础上针对给定的数据集,基于C语言编程实现关联规则挖掘算法和序列模式挖掘算法。 二、实验内容 1.令supmin = 30%, 如频繁1项集L1={ {I1}:4, {I2}:5,{I3}:4, {I4}:4, {I6}:3},请写出其他所有频繁项集。 Transaction-id Items bough
2、t t1 I1、I2、I3 t2 I1、I4 t3 I4、I5 t4 I1、I2、I4 t5 I1、I2、I6、I4、I3 t6 I2、I6、I3 t7 I2、I3、I6 2.基于C语言编程实现Apriori算法; 3. 基于Weka进行数据的准备、预处理及关联规则与序列模式的挖掘 三、实验步骤(操作界面截图或程序清单) 1. 令supmin = 30%, 如频繁1项集L1={ {I1}:4, {I2}:5,{I3}:4, {I4}:4, {I6}:3},请写出其他所有频繁项集。 Transaction-id Items bought t1 I1、
3、I2、I3 t2 I1、I4 t3 I4、I5 t4 I1、I2、I4 t5 I1、I2、I6、I4、I3 t6 I2、I6、I3 t7 I2、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,I6}, {I3,I6}} 频繁3项集: (1)连接得:C3=
4、{{I1,I2,I4},{I2,I3,I6}}
(2)删除得:L3={{I2,I3,I6}}
2. 基于C语言编程实现Apriori算法
代码如下:
#include
5、L_Node;//频繁集 C_Node C[100][100]; L_Node L[100][100]; D_Node D[100]; int min_supp; //最小支持度 void InPut(){ int i,j,n,n1; printf("请输入最小支持度:"); scanf("%d",&min_supp); printf("请输入交易集的大小:"); scanf("%d",&D[0].item[0]); n=D[0].item[0]; for(i=1;i<=n;i++) //for1 {
6、 printf("请输入交易[%d]中记录的个数(n):",i); scanf("%d",&n1); D[i].item[0]=n1; for(j=1;j<=n1;j++) //for2 { printf("请输入交易[%d]中记录项,直接输入数字:",i); scanf("%d",&D[i].item[j]); }//for2 } /
7、/for1 }//end of InPut void C1() { //功能:扫描数据集D生成1项候选集C1 //输入:数据集D //输出1项候选集C1 //初始条件 数据集D 非空 int i,j,k; int no=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];
8、 } for(i=1;i<=D[0].item[0];i++) //for1 { for(j=1;j<=D[i].item[0];j++) //for2 { temp=1; for(k=1;k<=no;k++) //for3 { if(C[1][k].item[1]==D[i].item[j]) { C[1][
9、k].item[0]++; //支持度加1 temp=0; // } //if }//end for3 if(temp)//生成新的项集 { C[1][++no].item[1]=D[i].item[j]; C[1][no
10、].item[0]=1; } }//end for2 } // end for1 C[1][0].item[0]=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; C[n][0].item[0]=0; //初始化 //printf("in
11、 Cn(%d) n=%d/n",n,n); //printf("in Cn(%d) C[%d][0].item[0]=%d/n",n,n,C[n][0].item[0]); num=L[n-1][0].item[0]; //num是Ln-1项集的数据个数 for(i=1;i<=num;i++) for(j=i+1;j<=num;j++) //for2 { temp=1; //测试是否满足联结条件 if(n>2)//if 1 {
12、 for(k=1;k 13、 {
// printf("in if 2 no=%d/n",no);
no++;
for(p=1;p<=n-1;p++)
C[n][no].item[p]=L[n-1][i].item[p];
C[n][no].item[p]=L[n-1][j].item[p-1];
C[n][no].it 14、em[0]=0;
for(q=1;q<=D[0].item[0];q++) //for5 测试其支持度
{
count=0; //count用来记数,当所测试的项存在时,count加1,当count=n时,则子集存在
for(s=1;C[n][no].item[s]!=0;s++) //for6
{
15、 for(t=1;t<=D[q].item[0];t++) //for7
{
if(C[n][no].item[s]==D[q].item[t])
{ count+=1;
break;
}
}//end for7
}//end 16、 for 6
if(count==n) C[n][no].item[0]+=1;//子集存在,第no项的支持度加1
}//end for5
C[n][0].item[0]+=1;
}//end if2
}//end for2
}//end of Cn()
void L1()
{
17、
int i,j,k;
j=0;
L[1][0].item[0]=0;
//printf("C[1][0].item[0]=%d/n",C[1][0].item[0]);
for(i=1;i<=C[1][0].item[0];i++)
{
if(C[1][i].item[0]>=min_supp)
{
j+=1;
for(k=1;k<=1;k++)
L[1][j].item[k]=C[1][i].item[k];
L[1][j 18、].item[0]=C[1][i].item[0];
// printf("L[1][%d].item[1]=%d ",j,L[1][j].item[1]); 测试功能时加的
// printf(" -------------%d/n",L[1][j].item[0]);
}
}//end for1
L[1][0].item[0]=j;
}//end of L1()
void Ln(int n)
{
int i,j,k;
Cn(n);
j=0;
L[n][0].item[0]=0;
19、 // printf("in Ln(%d) C[%d][0].item[0]=%d/n",n,n,C[n][0].item[0]);
for(i=1;i<=C[n][0].item[0];i++) //for 1
{
if(C[n][i].item[0]>=min_supp)
{
j+=1;
for(k=1;k<=n;k++)
L[n][j].item[k]=C[n][i].item[k];
L[n][j].item[0]=C[n][i].item[0];
20、 } //end if
}//end for1
L[n][0].item[0]=j; //保存数据的个数
}//end of Ln(int n)
void OutPut(int n)
{
int i,j,k;
printf("频繁项目集L%d如下:\n",n);
k=L[n][0].item[0];
if(k!=0)
{
for(i=1;i<=k;i++)
{
printf("{");
21、 for(j=1;j<=n;j++)
printf(" I%d ",L[n][i].item[j]);
printf("}\t支持度:%d\n",L[n][i].item[0]);
}//for
}
else
printf("项目集为空\n");
}
int main()
{
int i;
int n=1;
InPut();
C1();//初始化,生成1项候选集C1
L1();//得到1项频繁集L1
while(L[n][0].item[0]!=0)
{
n+=1;
Ln(n);
}
for(i=1;i<=n;i++)
OutPut(i);
char ch;
scanf("%d",&i);
}
四、实验结果与分析
1.略
2.实验截图如下:
Welcome To
Download !!!
欢迎您的下载,资料仅供参考!
精品资料






