Apriori使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集。 首先,通过扫描数据库,累计每个项的计数,并收集满足最小支持度的项,找出频繁1项集的集合。该集合记作L1。然后,L1用于找频繁2项集的集合L2,L2用于找L3,如此下去直到不能再找到频繁k项集。找每个Lk需要一次数据库全扫描。
Apriori定律1 :如果某商品组合小于最小支持度,则就将它舍去,它的超集必然不是频繁项集。
Apriori定律2 :如果一个集合是频繁项集,即这个商品组合支持度大于最小支持度,则它的所有子集都是频繁
数据库有5个事务。设min_sup=60%,min_conf=80%
TID |
购买的商品 |
T100 |
{M,O,N,K,E,Y} |
T200 |
{D,O,N,K,E,Y} |
T300 |
{M,A,K,E} |
T400 |
{M,U,C,K,Y} |
T500 |
{C,O,O,K,I,E} |
在程序中,使用Apriori算法,找出频繁项集
步骤:
vc代码:
#include
#include
#include
#define D 5 /*D数事务的个数*/
#define MinSupCount 3 /*最小事务支持度数*/
void main()
{
char a[5][6] = {
{ 'M','O','N','K','E','Y' },
{ 'D','O','N','K','E','Y' },
{ 'M','A','K','E' },
{ 'M','U','C','K','Y'},
{ 'C','O','O','K','I','E' }
};
char b[20], d[100], t, b2[100][10], b21[100][10];//b用来保存数据库中的元素
int i, j, k, x = 0, flag = 1, c[20] = { 0 }, x1 = 0, i1 = 0, j1, counter = 0, c1[100] = { 0 }, flag1 = 1, j2, u = 0, c2[100] = { 0 }, n[20], v = 1;
int count[100], temp;
for (i = 0; i= MinSupCount)
{
d[x1] = b[k];
count[x1] = c[k];
x1++;//L1中元素的个数
}
}
//数组D即为L1
/*对选出的项集中的元素进行排序*/
for (i = 0; id[j + 1])
{
t = d[j]; d[j] = d[j + 1]; d[j + 1] = t;
temp = count[j]; count[j] = count[j + 1]; count[j + 1] = temp;
}
}
}
/*打印出L1*/
printf("L1 elements are:\n");
for (i = 0; ia[i][k + 1])
{
t = a[i][k];
a[i][k] = a[i][k + 1];
a[i][k + 1] = t;
}
}
}
}
/*把L1中的每一个元素都放在b2[i][0]中*/
j1 = x1;//j1初始设置为L1中元素的个数。
for (i = 0; i= MinSupCount)
{
if (v == 1)
{
printf("L%d elements are:\n", k);
v = 0;
}
printf("{");
for (j = 0; j