在原有程序的基础上,把读文件操作加上。
//支持度不小于2,置信度不小于0.8
#include "stdio.h"
#include "iostream.h"
#include "string.h"
//定义全局变量
char curL1[20][2];//实现出现的一维子集
int countL1[10];//找到各一维频繁子集出现的次数。
char curL2[20][3]; //出现的二维子集
int countL2[10]; //各二维频繁子集出现的次数
char curL3[20][4]; //出现的三维子集
int countL3[10]; //各三维频繁子集出现的次数
char cur[50][4];//临时二维数组,用于保存中间产生的变量
//定义int SizeStr(char* m) 得到字符串的长度。实现代码如下:
int SizeStr(char* m)
{
int i=0;
while(*(m+i)!=0)
{
i++;
}
return i;
}
//比较两个字符串,如果相等返回true,否则返回false
bool OpD(char* x,char* y)
{
int i=0;
if(SizeStr(x)==SizeStr(y))
{
while(*(x+i)==*(y+i))
{
i++;
if(*(x+i)==0 && *(y+i)==0)
return true;
}
}
return false;
}
//通过void LoadItemL1(char **p) 得到所有1元的字串和各自出现的次数
void LoadItemL1(char **p)//p二维指针保存二维样本数组
{
int i,j,n=0,k=0;
char ch;
char* s;
int f;
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;
//将样本数组中的数值提取出来,保存在cur[n][0]中,相当于把所有样本保存成一列;
for(i=0;i<10;i++)
{
for(j=0;j<4;j++)
{
ch=*(*(p+i)+j);
if(ch==0)
break;
cur[n][0]=ch;
//printf("%c",cur[n][0]);
n++;
}
}
// printf("\n");
curL1[0][0]=cur[0][0];
curL1[0][1]=cur[0][1];
k=0;
//放篮子:将cur[n][0]中数据不重复的放入curL1中
for(i=0;i<50;i++)
{
if(cur[i]==0)
break;
s=cur[i];
f=1;
for(j=0;j<=k;j++)
{
if(OpD(s,curL1[j]))//与已经放入curL1集合的字符做比较
{
f=0;
break;
}
}
if(f==1)
{
++k;
curL1[k][0]=cur[i][0];
curL1[k][1]=cur[i][1];
}
}
//for(i=0;i<=k;i++)
//{
// printf("%c",curL1[i][0]);
//}
//printf("\n");
//curL1[]已经把数提取出来,根据curL1[]值查找cur[n][],对比,计数(就是支持度)
for(i=0;i<20;i++)
{
for(j=0;j<50;j++)
{
char* m;
m=curL1[i];
if(*m==0)
break;
if(OpD(m,cur[j]))
countL1[i]++;
}
}
printf("L1: \n ");
printf("项集 支持度计数\n");
for(i=0;i<10;i++)
{
if(curL1[i]==0)
break;
if(countL1[i]>=2)
printf("{I%s}: %d\n",curL1[i],countL1[i]);
}
}
//通过void SubItem2(char **p) 得到所有的2元子串
void SubItem2(char **p)
{
int i,j,k,n=0;
char* s;
memset(cur,0,sizeof(cur));
for(i=0;i<20;i++)
{
curL2[i][0]=0;
curL2[i][1]=0;
curL2[i][2]=0;
}
for(i=0;i<10;i++)
countL2[i]=0;
for(k=0;k<10;k++)
{
s=*(p+k);
if(SizeStr(s)<2)
continue;//如果字符串长度小于2,跳出本次循环
//每个事务的ID都进行组合,例如1,2,5可以形成:12(cur[0]),15(cur[1]),25(cur[2])
//提取二元,就需要二层循环,三元,则三层循环
for(i=0;i<SizeStr(s);i++)
{
for(j=i+1;j<SizeStr(s);j++)
{
if(*(s+j)==0)
break;
*(cur[n]+0)=*(s+i);
*(cur[n]+1)=*(s+j);
*(cur[n]+2)=0;
*(cur[n]+3)=0;
//printf("%c%c\n",*(cur[n]+0),*(cur[n]+1));
n++;
}
}
}
//结果得到的cur[][]数组是排列组合项,里面有很多重复项
}
//通过void LoadItemL2(char **p) 得到各个2元频繁子串出现的次数
void LoadItemL2(char **p)
{
int k,i,j;
char* s;
int f;
SubItem2(p);
//curL2就相当于一个篮子(集合),先把12组合放进去
curL2[0][0]=cur[0][0];
curL2[0][1]=cur[0][1];
curL2[0][2]=cur[0][2];
k=0;
for(i=0;i<50;i++)
{
if(cur[i]==0)
break;
s=cur[i];
f=1;
for(j=0;j<=k;j++)
{
if(OpD(s,curL2[j]))
{
f=0;
break;
}
}
if(f==1)
{
++k;
curL2[k][0]=cur[i][0];
curL2[k][1]=cur[i][1];
curL2[k][2]=cur[i][2];
}
} //将cur[][]精简就得到curL2[][],里面没有重复的二元元素
for(i=0;i<20;i++)
{
for(j=0;j<50;j++)
{
s=curL2[i];
if(*s==0)
break;
if(OpD(s,cur[j]))
countL2[i]++;
}
}
printf("L2: \n");
printf("项集 支持度计数\n");
for(i=0;i<10;i++)
{
if(curL2[i]==0)
break;
if(countL2[i]>=2)
printf("{I%c,I%c}: %d\n",curL2[i][0],curL2[i][1],countL2[i]);
}
}
//通过定义void SubItem3(char **p) 得到所有3元的子串
void SubItem3(char **p)
{
char *s;
int i,j,h,m;
int n=0;
memset(cur,0,sizeof(cur));
for(j=0;j<20;j++)
{
curL3[j][0]=0;
curL3[j][1]=0;
curL3[j][2]=0;
curL3[j][3]=0;
}
for(i=0;i<10;i++)
countL3[i]=0;
for(m=0;m<10;m++)
{
s=*(p+m);
if(SizeStr(s)<3)
continue;
for(i=0;i<SizeStr(s);i++)
{
for(j=i+1;j<SizeStr(s);j++)
{
for(h=j+1;h<SizeStr(s);h++)
{
if(*(s+h)==0)
break;
*(cur[n]+0)=*(s+i);
*(cur[n]+1)=*(s+j);
*(cur[n]+2)=*(s+h);
*(cur[n]+3)=0;
n++;
}
}
}
}
}
//⑨同样我们要得到得到各个3元频繁子串出现的次数
void LoadItemL3(char** p)
{
int k,i,j;
char* s;
int f;
SubItem3(p);
curL3[0][0]=cur[0][0];
curL3[0][1]=cur[0][1];
curL3[0][2]=cur[0][2];
curL3[0][3]=cur[0][3];
k=0;
for(i=0;i<50;i++)
{
if(cur[i]==0)
break;
s=cur[i];
f=1;
for(j=0;j<=k;j++)
{
if(OpD(s,curL3[j]))
{
f=0;
break;
}
}
if(f==1)
{
++k;
curL3[k][0]=cur[i][0];
curL3[k][1]=cur[i][1];
curL3[k][2]=cur[i][2];
curL3[k][3]=cur[i][3];
}
}
for(i=0;i<20;i++)
for(j=0;j<50;j++)
{
s=curL3[i];
if(*s==0)
break;
if(OpD(s,cur[j]))
countL3[i]++;
}
printf("L3: \n");
printf("项集 支持度计数\n");
for(i=0;i<10;i++)
{
if(curL3[i]==0)
break;
if(countL3[i]>=2)
printf("{I%c,I%c,I%c}: %d\n",curL3[i][0],curL3[i][1],curL3[i][2],countL3[i]);
}
}
//⑩定义void LoadItemL4(char** p) 得到各个3元子串出现的次数
void LoadItemL4(char** p)
{
int i;
char* s;
int j=0;
for(i=0;i<10;i++)
{
s=*(p+i);
if(SizeStr(s)==4)
j++;
}
printf("四维子集出现的次数: %d\n",j);
printf("没有四维的频繁子集,算法结束! \n");
}
//11通过void Support(char* w,int g) 得到关联规则,并输出结果
void Support(char* w,int g)
{
printf("Support\n");
int i,j,k,n=0;
char* s;
float c=0.8,d=0;
memset(cur,0,sizeof(cur));
s=w;
for(i=0;i<SizeStr(s);i++)
{
*(cur[n]+0)=*(s+i);//cur[0][0]=1;cur[1][0]=2;cur[2][0]=5;
*(cur[n]+1)=0;
*(cur[n]+2)=0;
*(cur[n]+3)=0;
n++;
}
for(i=0;i<SizeStr(s);i++)
{
for(j=i+1;j<SizeStr(s);j++)
{
if(*(s+j)==0)
break;
*(cur[n]+0)=*(s+i);//cur[3][0]=1;cur[3][1]=2;cur[4][0]=1;cur[4][1]=5;cur[5][0]=2;cur[5][1]=5;
*(cur[n]+1)=*(s+j);
*(cur[n]+2)=0;
*(cur[n]+3)=0;
n++;
}
}
for(i=0;i<10;i++)
{
if(SizeStr(cur[i])==1)//字符串长度为1
{
for(j=0;j<10;j++)
{
if(OpD(cur[i],curL1[j]))
{
d=countL3[g]/(float)countL1[j];
//if(d>=c)
printf("{I%s}: %f\n",curL1[i],d);
//break;
}
}
}
if(SizeStr(cur[i])==2)//字符串长度为2
{
for(j=0;j<10;j++)
{
if(OpD(cur[i],curL2[j]))
{
d=countL3[g]/(float)countL2[j];
if(d>=c)
printf("{I%c,I%c}: %f \n",curL2[j][0],curL2[j][1],d);
break;
}
}
}
}
}
//12最后通过main函数完成整过程序
int main()
{
int i=0,j=0,k;
char buf[10][6];//保存样本
char* p[10];//等价于buf[10][6],自己换成了数组指针的形式
FILE* fp=fopen("data.txt","r");
memset(buf,0,sizeof(buf));//申请内存空间
char ch;
if(feof(fp))
return 0;
while(!feof(fp))
{
ch=fgetc(fp);
if(ch==' ')
{
continue;
}
if(ch=='\n')
{
i++;j=0;
}
else
{
buf[i][j]=ch;j++;
}
}
/* buf[0][0]='1';
buf[0][1]='2';
buf[0][2]='5';
buf[1][0]='1';
buf[1][1]='2';
buf[2][0]='2';
buf[2][1]='4';
buf[3][0]='1';
buf[3][1]='2';
buf[3][2]='4';
buf[4][0]='1';
buf[4][1]='3';
buf[5][0]='1';
buf[5][1]='2';
buf[5][2]='3';
buf[5][3]='5';
buf[6][0]='1';
buf[6][1]='2';
buf[6][2]='3';
buf[7][0]='2';
buf[7][1]='5';
buf[8][0]='2';
buf[8][1]='3';
buf[8][2]='4';
buf[9][0]='3';
buf[9][1]='4';
*/
for(k=0;k<10;k++)
{
*(p+k)=buf[k];
}
LoadItemL1(p);
LoadItemL2(p);
LoadItemL3(p);
LoadItemL4(p);
printf("产生关联规则: \n");
printf("非空子集: 置信度:\n");
for(i=0;i<10;i++)
{
//printf("{%c,%c,%c}: %d\n",curL3[i][0],curL3[i][1],curL3[i][2],countL3[i]);
//printf("%s\n",curL3[i]);
if(curL3[i]!=0 && countL3[i]>=2)
Support(curL3[i],i);
}
return 0;
}