关联规则和序列模式实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实验目的与要求

掌握关联规则和序列模式的基本原理,在此基础上针对给定的数据集,基于C语言编程实现关联规则挖掘算法和序列模式挖掘算法。

二、实验内容

1.令sup min = 30%, 如频繁1项集L1={ {I1}:4, {I2}:5,{I3}:4, {I4}:4, {I6}:3},请写出其他所有频繁项集。

Transaction-id Items bought

t1I1、I2、I3

t2I1、I4

t3I4、I5

t4I1、I2、I4

t5I1、I2、I6、I4、I3

t6I2、I6、I3

t7I2、I3、I6

2.基于C语言编程实现Apriori算法;

3. 基于Weka进行数据的准备、预处理及关联规则与序列模式的挖掘

三、实验步骤(操作界面截图或程序清单)

1.令sup min = 30%, 如频繁1项集L1={ {I1}:4, {I2}:5,{I3}:4, {I4}:4, {I6}:3},请写出其他所有频繁项集。

Transaction-id Items bought

t1I1、I2、I3

t2I1、I4

t3I4、I5

t4I1、I2、I4

t5I1、I2、I6、I4、I3

t6I2、I6、I3

t7I2、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={{I1,I2,I4},{I2,I3,I6}}

(2)删除得:L3={{I2,I3,I6}}

2.基于C语言编程实现Apriori算法

代码如下:

#include

typedef struct {

int item[100]; //数据项

} D_Node; //数据库D

typedef struct {

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

} C_Node; //候选集

typedef struct {

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

} 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

{

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

} //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];

}

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][k].item[0]++; //支持度加1

temp=0; //

} //if

}//end for3

if(temp)//生成新的项集

{

C[1][++no].item[1]=D[i].item[j];

C[1][no].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 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++)

相关文档
最新文档