⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 频繁2-项集及数量关系.txt

📁 这是一个关于apriori算法的改进程序
💻 TXT
字号:
//用数组的方式,结合数学期望,来考虑数量问题
#include <stdio.h>
#include <iostream.h>

#define item_num 5          //商品item的种类数
#define cus_num 9          //顾客customer的记录数
#define minsup 2     //最小支持度计数 

void main()
{
	int i,j,l,k;
	int count,amount1,amount2;

      //amount[item_num][cus_num]数组表示顾客customer购买某一种类商品item的单位商品数量
//	int amount[item_num][cus_num]={{1,1,0,2,2,1,2,2,0,2,0,0,2,2,2},{1,2,2,0,2,0,0,2,2,2,0,2,0,0,0},{0,0,2,2,2,0,2,0,0,0,1,0,0,0,1},{0,2,0,0,0,1,0,0,0,1,1,1,0,2,2},{1,0,0,0,1,1,1,0,2,2,1,2,2,0,2}}; 
//	int amount[item_num][cus_num]={{1,1,0,2,2,1,2,2,0,2},{1,2,2,0,2,0,0,2,2,2},{0,0,2,2,2,0,2,0,0,0},{0,2,0,0,0,1,0,0,0,1},{1,0,0,0,1,1,1,0,2,2}}; 
//	int amount[item_num][cus_num]={{1,1,0,2,2},{1,2,2,0,2},{0,0,2,2,2},{0,2,0,0,0},{1,0,0,0,1}};
//	int amount[item_num][cus_num]={{1,1,3,2,2,1,2,2,3,2},{1,0,2,3,2,0,0,2,2,2},{3,3,2,2,2,0,2,0,0,0},{0,2,0,3,0,1,0,0,0,1},{1,3,3,0,1,1,1,3,2,2}}; 
//	int amount[item_num][cus_num]={{1,0,0,1,1,0,1,1,1},{1,1,1,1,0,1,0,1,1},{0,0,1,0,1,1,1,1,1},{0,1,0,1,0,0,0,0,0},{1,0,0,0,0,0,0,1,0}}; 
	int amount[item_num][cus_num]={{3,0,0,3,4,0,3,4,3},
                               {3,2,3,3,0,4,0,4,3},
                               {0,0,3,0,4,4,3,4,3},
                               {0,2,0,2,0,0,0,0,0},
                               {2,0,0,0,0,0,0,3,0}}; 

	int frequent_1_item[item_num]; //记录下频繁1-项集
	int sup1[item_num];
	int frequent_1_item_sum=0;             
	//?????????有问题:应该定义为动态变量,以动态地存储值	

	int frequent_2_item[10][2];   //记录下频繁2-项集
	int sup2[10];                 //关联规则的支持度
	double conf1[10],conf2[10];   //正向关联规则和反向关联规则的置信度
	double frequent_2_item_amount[10][2];
//	int frequent_2_item_amount[10][2];
	int frequent_2_item_sum=0; 
	double aveQ1[10],aveQ2[10],Q1[10],Q2[10],Q[10];
	//?????????有问题:10应该定义为动态变量,以动态地存储值		
    
	//输出数据库中的数据
	cout<<"     ";
	for(i=0;i<item_num;i++)
	{
		cout<<" "<<"I"<<i+1;
	}
	cout<<endl;
	for(j=0;j<cus_num;j++)              
	{
		cout<<"cus"<<j+1<<"  ";
		for(i=0;i<item_num;i++)
		{	
			cout<<amount[i][j]<<"  ";
			if(i==item_num-1)
				cout<<endl;
		}
	}
    cout<<endl;
	cout<<"The minimum support is "<<minsup<<endl<<endl;


	//求频繁1-项集
    k=0;
	l=0;
	for(i=0;i<item_num;i++)
	{
		count=0;
		for(j=0;j<cus_num;j++)
		{
			if(amount[i][j]!=0)
			{
				count++;
			}
		}
		cout<<"The support of I"<<i+1<<" is:"<<count<<endl;//输出各项的支持度计数
		sup1[l]=count;
		l++;
		if(count>=minsup)
		{
			//记下该频繁项,以便利用所有的频繁1-项集的连接运算求候选2-项集
			frequent_1_item[k]=i+1;
			k++;
		}
		frequent_1_item_sum=k;//保留k的值,并记下频繁1-项集的总数
	}
	cout<<endl;

	//输出频繁1-项集
	cout<<"The frequent 1-item is:"<<endl;
	for(i=0;i<frequent_1_item_sum;i++)
	{
		cout<<"I"<<frequent_1_item[i]<<endl;
	}
	cout<<endl<<endl;


	//求频繁2-项集
    k=0;
	for(i=0;i<frequent_1_item_sum;i++)
	{
		for(j=i+1;j<frequent_1_item_sum;j++)     //两个for循环意在选出任意两项频繁1-项集
		{
			int m=frequent_1_item[i]-1;          //-1是因为数组从0开始计起(下同)
			int n=frequent_1_item[j]-1;          
			int count=0;
			amount1=0;
			amount2=0;
			for(l=0;l<cus_num;l++)
			{
				if(amount[m][l]!=0 && amount[n][l]!=0)
				{
					count++;
					amount1=amount1+amount[m][l];
					amount2=amount2+amount[n][l];
				}
			}
//			cout<<i<<"  "<<j<<endl;
			cout<<"The support of I"<<frequent_1_item[i]<<" and "
				<<"I"<<frequent_1_item[j]<<" is:"<<count<<endl;
			if(count>=minsup)
			{
				//记下该频繁项,以便利用所有的频繁2-项集的连接运算求候选3-项集
				frequent_2_item[k][0]=frequent_1_item[i];
				frequent_2_item[k][1]=frequent_1_item[j];
				k++;
				sup2[k-1]=count;
				frequent_2_item_amount[k-1][0]=amount1;
				frequent_2_item_amount[k-1][1]=amount2;

			}
			frequent_2_item_sum=k;//保留k的值,并记下频繁2-项集的总数
		}
	}
	cout<<endl;
	cout<<"The sum of frequent_2_item is : "<<frequent_2_item_sum<<endl<<endl;
    
	//输出频繁2-项集
	cout<<"The frequent 2_item is:"<<endl;
	for(i=0;i<frequent_2_item_sum;i++)
	{
		cout<<"I"<<frequent_2_item[i][0]
			<<" and I"<<frequent_2_item[i][1]<<endl;

	}
	cout<<endl<<endl;
	
	//考虑频繁2-项集的具体的数量值,以确定准确的数量关系
	cout<<"下面讨论频繁2-项集的具体的数量值"<<endl;
	cout<<"Ii—>Ij   sup     conf      ave_Ij    Ij的数量值"<<endl;//正向关联规则
	for(i=0;i<frequent_2_item_sum;i++)
	{
		conf1[i]=((double)sup2[i])/sup1[frequent_2_item[i][0]-1];
		aveQ2[i]=frequent_2_item_amount[i][1]/sup2[i];
		Q1[i]=sup2[i]*conf1[i]*aveQ2[i];
		cout<<"I"<<frequent_2_item[i][0]<<" and "
			<<"I"<<frequent_2_item[i][1]<<": ";
		cout<<sup2[i]<<"    ";
		cout<<conf1[i]<<"     ";		
		cout<<aveQ2[i]<<"      ";
		cout<<Q1[i]<<endl;
	}
	cout<<endl;

	cout<<"Ij—>Ii   sup     conf      ave_Ii    Ii的数量值"<<endl;//反向关联规则
	for(i=0;i<frequent_2_item_sum;i++)
	{
		conf2[i]=((double)sup2[i])/sup1[frequent_2_item[i][1]-1];
		aveQ1[i]=frequent_2_item_amount[i][0]/sup2[i];
		Q2[i]=sup2[i]*conf2[i]*aveQ1[i];
		cout<<"I"<<frequent_2_item[i][0]<<" and "
			<<"I"<<frequent_2_item[i][1]<<": ";
		cout<<sup2[i]<<"    ";
		cout<<conf2[i]<<"     ";
		cout<<aveQ1[i]<<"      ";
		cout<<Q2[i]<<endl;
	}	
	cout<<endl;

	cout<<"Ii and Ij sup  ave_Ii  ave_Ij     Q"<<endl;//综合考虑
	for(i=0;i<frequent_2_item_sum;i++)
	{
		conf1[i]=((double)sup2[i])/sup1[frequent_2_item[i][0]-1];
		conf2[i]=((double)sup2[i])/sup1[frequent_2_item[i][1]-1];
		aveQ1[i]=frequent_2_item_amount[i][0]/sup2[i];
		aveQ2[i]=frequent_2_item_amount[i][1]/sup2[i];
		Q1[i]=sup2[i]*conf1[i]*aveQ2[i];
		Q2[i]=sup2[i]*conf2[i]*aveQ1[i];
		Q[i]=Q1[i]+Q2[i];
		cout<<"I"<<frequent_2_item[i][0]<<" and "
			<<"I"<<frequent_2_item[i][1]<<": ";
		cout<<sup2[i]<<"    ";
		cout<<aveQ1[i]<<"     ";
		cout<<aveQ2[i]<<"    ";
		cout<<Q[i]<<endl;
	}
	cout<<endl<<endl;
	
	cout<<"Ii and Ij的数量关系"<<endl;//输出
	for(i=0;i<frequent_2_item_sum;i++)
	{
		if(Q1[i]>=8)
		{
			cout<<"I"<<frequent_2_item[i][0]<<"+"
				<<frequent_2_item_amount[i][1]/sup2[i]<<"*"<<"I"<<frequent_2_item[i][1]<<endl;
		}
	}
	cout<<endl;
	for(i=0;i<frequent_2_item_sum;i++)
	{
		if(Q2[i]>=8)
		{
			cout<<frequent_2_item_amount[i][0]/sup2[i]<<"*"<<"I"<<frequent_2_item[i][0]<<"+"
				<<"I"<<frequent_2_item[i][1]<<endl;
		}
	}
	cout<<endl;
	for(i=0;i<frequent_2_item_sum;i++)
	{
		if(Q[i]>=16)
		{
			cout<<frequent_2_item_amount[i][0]/sup2[i]<<"*"<<"I"<<frequent_2_item[i][0]<<"+"
			<<frequent_2_item_amount[i][1]/sup2[i]<<"*"<<"I"<<frequent_2_item[i][1]<<endl;
		}
	}	
	cout<<endl;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -