数据挖掘算法 apriori算法
//Apriori算法#include "stdio.h"#include "string.h"#define AFFAIRS_NUMBER 9 //事务数#define COMMODITY_NUMBER 5//商品数 商品 a b c d e#define ITEMSETS_NUMBER10//项集数typedef struct{int number;//事务中
·
//Apriori算法
#include "stdio.h"
#include "string.h"
#define AFFAIRS_NUMBER 9 //事务数
#define COMMODITY_NUMBER 5//商品数 商品 a b c d e
#define ITEMSETS_NUMBER 10//项集数
typedef struct
{
int number;//事务中的商品数
char commodity[COMMODITY_NUMBER];
}AFFAIRS,PAFFAIRS[AFFAIRS_NUMBER];
typedef struct
{
AFFAIRS affairs; //
int support;//支持度
}ITEMSETS,PITEMSETS[ITEMSETS_NUMBER];
int item_number;
void Init_Affairs(PAFFAIRS &pa)
{
pa[0].number=3;
pa[0].commodity[0]='a';
pa[0].commodity[1]='b';
pa[0].commodity[2]='e';
pa[1].number=2;
pa[1].commodity[0]='b';
pa[1].commodity[1]='d';
pa[2].number=2;
pa[2].commodity[0]='b';
pa[2].commodity[1]='c';
pa[3].number=3;
pa[3].commodity[0]='a';
pa[3].commodity[1]='b';
pa[3].commodity[2]='d';
pa[4].number=2;
pa[4].commodity[0]='a';
pa[4].commodity[1]='c';
pa[5].number=2;
pa[5].commodity[0]='b';
pa[5].commodity[1]='c';
pa[6].number=2;
pa[6].commodity[0]='a';
pa[6].commodity[1]='c';
pa[7].number=4;
pa[7].commodity[0]='a';
pa[7].commodity[1]='b';
pa[7].commodity[2]='c';
pa[7].commodity[3]='e';
pa[8].number=3;
pa[8].commodity[0]='a';
pa[8].commodity[1]='b';
pa[8].commodity[2]='c';
for(int i=0;i<AFFAIRS_NUMBER;i++)
{
pa[i].commodity[pa[i].number]='\0';
}
}
void Init_Itemsets(PITEMSETS &pi)
{
item_number = 5;
for(int i=0;i<item_number;i++)
{
pi[i].affairs.commodity[0]=97+i;
pi[i].affairs.commodity[1]='\0';
pi[i].support=0;
}
}
bool find_char(char *a,char b)
{
int alen = strlen(a);
for(int i=0;i<alen;i++)
{
if(a[i]==b)
return true;
}
return false;
}
bool find_string(char *a,char *b)
{
int blen =strlen(b);
int alen= strlen(a);
int count=0;
for(int i=0;i<blen;i++)
{
if(find_char(a,b[i]))
count++;
}
if(count==blen)
return true;
else
return false;
}
void Cal_Support(PAFFAIRS &pa,PITEMSETS &pi)
{
for(int i=0;i<item_number;i++)
{
for(int j=0;j<AFFAIRS_NUMBER;j++)
{
if(find_string(pa[j].commodity,pi[i].affairs.commodity))
{
pi[i].support++;
}
}
}
}
void show_affairs(PAFFAIRS pa)//显示所有事务
{
for(int j=0;j<9;j++)
{
pa[j].commodity[pa[j].number]='\0';
printf(" 事务%d:%s\n",j+1,pa[j].commodity);
}
}
void show_items(PITEMSETS &pi)//显示所有项集
{
for(int i=0;i<item_number;i++)
{
printf(" 项集:%s:",pi[i].affairs.commodity);
printf(" 支持度:%d\n",pi[i].support);
}
}
char * string_string(char *a,char *b)//得到两个字符串的所有部分
{
char c[20]="\0";
int alen = strlen(a);
int blen = strlen(b);
strcpy(c,a);
for(int i=0;i<blen;i++)
{
if(find_char(a,b[i]));
else
c[alen++]=b[i];
}
char temp;
for(int j=0;j<alen;j++)//排序
{
for(int k=j;k<alen;k++)
{
if(c[j]>c[k])
{
temp=c[j];
c[j]=c[k];
c[k]=temp;
}
}
}
return c;
}
bool find_string(PITEMSETS &pi,char *a,int m)
{
for(int n=0;n<m;n++)
{
if(strcmp(pi[n].affairs.commodity,a)==0)
return true;
}
return false;
}
void get(PITEMSETS &pi)//得到新的项集
{
PITEMSETS pit;
0a[10][100]={"\0","\0","\0","\0","\0","\0","\0","\0","\0","\0"};
int k=0;
for(int i=0;i<5;i++)
{
for(int j=i+1;j<5;j++)
{
strcpy(a[k],string_string(pi[i].affairs.commodity,pi[j].affairs.commodity));
//strcat(a[k],pi[i].affairs.commodity);
//strcat(a[k],pi[j].affairs.commodity);
k++;
}
}
item_number = 0;
for(int m=0;m<k;m++)
{
if(!find_string(pi,a[m],m))
{
strcpy(pi[item_number].affairs.commodity,a[m]);
pi[item_number].support=0;
item_number++;
}
}
}
void Eliminate_items(PITEMSETS &pi)//消除支持都小于2的项目集
{
int count=0;//记录消除的项目集个数
for(int i=0;i<item_number-count;i++)
{
//printf(&qf(&q%d,%d\n",i,pi[i].support);
while(pi[i].support<2&&i<item_number-count)
{
count=count+1;
// printf("%d\n",count);
for(int j=i;j<item_number-count;j++)
{
strcpy(pi[j].affairs.commodity,pi[j+1].affairs.commodity);
pi[j].support=pi[j+1].support;
}
}
}
item_number=item_number-count;
}
void main()
{
printf("\n\nApriori算法:\n");
PAFFAIRS pa;
PITEMSETS pi;
Init_Affairs(pa);//初始化事务
show_affairs(pa);//显示所有所有事务
printf("注:abcde分别代表:商品1,商品2等。\n");
Init_Itemsets(pi);//初始化项集
Cal_Support(pa,pi);//计算各项集支持度
printf("\n候选1项集:\n");
show_items(pi);//显示项集
printf("\n&5Cn&B);
printf("消除支持都小于2,");
printf("频繁1项集:\n");
Eliminate_items(pi);
show_items(pi);
printf("\n");
printf("候选2项集:\n");
get(pi);//得到新项集
Cal_Support(pa,pi);
show_items(pi);
printf("\n");
printf("消除支持都小于2的:\n");
Eliminate_items(pi);
show_items(pi);
printf("\n");
printf("3频繁项集,并消除支持都小于2的:\n");
get(pi);
Cal_Support(pa,pi);
Eliminate_items(pi);
show_items(pi);
printf("\n\n\n");
}
推荐内容
点击阅读全文
更多推荐
所有评论(0)