//关联规则算法



#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 = 2;
	pi[0].affairs.commodity[0]='a';
	pi[0].affairs.commodity[1]='b';
	pi[0].affairs.commodity[2]='c';
	pi[0].support=2;

	pi[1].affairs.commodity[0]='a';
	pi[1].affairs.commodity[1]='b';
	pi[1].affairs.commodity[2]='e';
	pi[1].support=2;

	
}
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)//a字符串中是否存在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 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];
	}

	return c;
}
int subset_number=0;
void Get_Subset(ITEMSETS &it,char (*a)[10])
{
	int i=0;
	int len = strlen(it.affairs.commodity);
	//printf("len=%d\n",len);
	char c_a[5][10]={"\0","\0","\0","\0","\0"};
	for(i=0;i<len;i++)
	{
	//	c_a[i][0]=it.affairs.commodity[i];
	//	c_a[i][1]='\0';
		a[i][0]=it.affairs.commodity[i];
		a[i][1]='\0';
	//	printf("%s\n",a[i]);
	}
	
	char c_b[5][10]={"\0","\0","\0","\0","\0"};
	for(int j=0;j<len;j++)
	{
		for(int k=j+1;k<len;k++)
		{
			//strcat(c_b[i],c_a[j]);
		//	strcat(c_b[i],c_a[k]);
			strcat(a[i],a[j]);
			strcat(a[i],a[k]);
			//printf("%s\n",a[i]);
			i++;
		}
	}
	
	subset_number=i;
}
void Get_Subset_times(PAFFAIRS &pa,char (*a)[10],double *b)
{
	printf("	子集出现次数:\n");
	for(int i=0;i<subset_number;i++)
	{
		for(int j=0;j<AFFAIRS_NUMBER;j++)
		{
			if(find_string(pa[j].commodity,a[i]))
				b[i]++;
		}
		printf("	%s=%.0f\n",a[i],b[i]);
	}
}
void Cal_Confidence(PAFFAIRS &pa,PITEMSETS &pi)
{
	
	for(int i=0;i<item_number;i++)
	{
		printf("\n\n	频繁项目集%s:\n",pi[i].affairs.commodity);
		char a[10][10]={"\0","\0","\0","\0","\0","\0","\0","\0","\0","\0"};//用来保存所有子集
		double b[10]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};//用来保存所有子集在事务数据库中出现的次数
		Get_Subset(pi[i],a);
		Get_Subset_times(pa,a,b);
		printf("	关联规则和置信度为下:\n");
		for(int j=0;j<3;j++)
		{
			for(int k=3;k<subset_number;k++)
			{
				if(find_string(a[k],a[j]));
				else
				{
				printf("		%s=>%s,confidence=%.0f%\n",a[j],a[k],(2.0/b[j]*100));
				printf("		%s=>%s,confidence=%.0f%\n",a[k],a[j],(2.0/b[k]*100));
				}
			}
		}
	}
}
void main()
{
	PAFFAIRS pa;
	PITEMSETS pi;
	Init_Affairs(pa);
	printf("\n\n关联规则算法\n   事务数据库:\n");
	show_affairs(pa);
	Init_Itemsets(pi);//直接初始apriori算法得到的频繁项集
	printf("   3频繁项集:\n");
	show_items(pi);
	Cal_Confidence(pa,pi);

}

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐