数据挖掘Apriori算法报告Word格式文档下载.docx
《数据挖掘Apriori算法报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据挖掘Apriori算法报告Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
(1)L1=find_frequent_1-itemsets(D);
//挖掘频繁1-项集,比较容易
(2)for(k=2;
Lk-1≠Φ;
k++){
(3)Ck=apriori_gen(Lk-1,min_sup);
//调用apriori_gen方法生成候选频繁k-项集
(4)foreachtransactiont∈D{
//扫描事务数据库D
(5)Ct=subset(Ck,t);
(6)foreachcandidatec∈Ct
(7)c.count++;
//
统计候选频繁k-项集的计数
(8)}
(9)Lk={c∈Ck|c.count≥min_sup}//满足最小支持度的k-项集即为频繁k-项集
(10)}
(11)returnL=∪kLk;
//合并频繁k-项集(k>
0)
三.关联算法的C++简单实现
(1)算法数据:
对给定数据集用Apriori算法进行挖掘,找出其中的频繁集并生成关联规则。
对下面数据集进行挖掘:
I1I2I5
I1I2
I2I4
I1I2I4
I1I3
I1I2I3I5
I1I2I3
I2I5
I2I3I4
I3I4
对于数据集,取最小支持度minsup=2,最小置信度minconf=0.8。
(2)算法步骤:
①首先单趟扫描数据集,计算各个一项集的支持度,根据给定的最小支持度闵值,得到一项频繁集L1。
②然后通过连接运算,得到二项候选集,对每个候选集再次扫描数据集,得出每个候选集的支持度,再与最小支持度比较。
得到二项频繁集L2。
③如此进行下去,直到不能连接产生新的候选集为止。
④对于找到的所有频繁集,用规则提取算法进行关联规则的提取。
(3)C++算法的简单实现
①首先要在工程名文件夹里自己定义date.txt文档存放数据,然后在main函数中用FILE*fp=fopen("
date.txt"
"
r"
);
将数据导入算法。
②定义intcountL1[10];
找到各一维频繁子集出现的次数。
定义charcurL1[20][2];
实现出现的一维子集。
由于给出的数据最多有4个数,所以同样的我们要定义到4维来放数据。
intcountL2[10];
//各二维频繁子集出现的次数
charcurL2[20][3];
//出现的二维子集
intcountL3[10];
//各三维频繁子集出现的次数
charcurL3[20][4];
//出现的三维子集
charcur[50][4];
③定义intSizeStr(char*m)得到字符串的长度。
实现代码如下:
intSizeStr(char*m)
{
inti=0;
while(*(m+i)!
=0)
{
i++;
}
returni;
}
④比较两个字符串,如果相等返回true,否则返回false
boolOpD(char*x,char*y)
if(SizeStr(x)==SizeStr(y))
while(*(x+i)==*(y+i))
{
i++;
if(*(x+i)==0&
&
*(y+i)==0)
returntrue;
}
returnfalse;
⑤通过voidLoadItemL1(char**p)得到所有1元的字串和各自出现的次数
voidLoadItemL1(char**p)
inti,j,n=0,k=0;
charch;
char*s;
intf;
memset(cur,0,sizeof(cur));
for(i=0;
i<
20;
i++)
curL1[i][0]=0;
curL1[i][1]=0;
for(j=0;
j<
10;
j++)
countL1[j]=0;
for(j=0;
4;
ch=*(*(p+i)+j);
if(ch==0)
break;
cur[n][0]=ch;
n++;
curL1[0][0]=cur[0][0];
curL1[0][1]=cur[0][1];
k=0;
50;
if(cur[i]==0)
break;
s=cur[i];
f=1;
=k;
if(OpD(s,curL1[j]))
{
f=0;
}
if(f==1)
++k;
curL1[k][0]=cur[i][0];
curL1[k][1]=cur[i][1];
char*m;
m=curL1[i];
if(*m==0)
if(OpD(m,cur[j]))
countL1[i]++;
printf("
L1:
\n"
项集支持度计数\n"
if(curL1[i]==0)
if(countL1[i]>
=2)
printf("
{I%s}:
%d\n"
curL1[i],countL1[i]);
⑥通过voidSubItem2(char**p)得到所有的2元子串
voidSubItem2(char**p)
inti,j,k,n=0;
curL2[i][0]=0;
curL2[i][1]=0;
curL2[i][2]=0;
countL2[i]=0;
for(k=0;
k<
k++)
s=*(p+k);
if(SizeStr(s)<
2)
continue;
for(i=0;
SizeStr(s);
for(j=i+1;
if(*(s+j)==0)
break;
*(cur[n]+0)=*(s+i);
*(cur[n]+1)=*(s+j);
*(cur[n]+2)=0;
*(cur[n]+3)=0;
n++;
⑦通过voidLoadItemL2(char**p)得到各个2元频繁子串出现的次数
voidLoadItemL2(char**p)
intk,i,j;
SubItem2(p);
curL2[0][0]=cur[0][0];
curL2[0][1]=cur[0][1];
curL2[0][2]=cur[0][2];
if(OpD(s,curL2[j]))
curL2[k][0]=cur[i][0];
curL2[k][1]=cur[i][1];
curL2[k][2]=cur[i][2];
s=curL2[i];
if(*s==0)
if(OpD(s,cur[j]))
countL2[i]++;
L2:
\n"
if(curL2[i]==0)
if(countL2[i]>
{I%c,I%c}:
curL2[i][0],curL2[i][1],countL2[i]);
⑧通过定义voidSubItem3(char**p)得到所有3元的子串
voidSubItem3(char**p)
char*s;
inti,j,h,m;
intn=0;
curL3[j][0]=0;
curL3[j][1]=0;
curL3[j][2]=0;
curL3[j][3]=0;
countL3[i]=0;
for(m=0;
m<
m++)
s=*(p+m);
3)
for(h=j+1;
h<
h++)
{
if(*(s+h)==0)
break;
*(cur[n]+0)=*(s+i);
*(cur[n]+1)=*(s+j);