关联规则和序列模式实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++)