数据挖掘算法 apriori算法

//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");
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值