数据挖掘算法 apriori算法

来源:互联网 发布:数据库系统组成 编辑:程序博客网 时间:2024/05/01 22:19
//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;elsereturn 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]));elsec[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");}




1 0
原创粉丝点击