📄 频繁2-项集及数量关系.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 + -