Apriori算法的实现

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算法,找出频繁项集

步骤:

  1. 每个项都是候选1项集的集合C1的成员。算法扫描所有的事务,获得每个项,生成C1(见下文代码中的create_C1函数)。然后对每个项进行计数。然后根据最小支持度从C1中删除不满足的项,从而获得频繁1项集L1。
  2. 对L1的自身连接生成的集合执行剪枝策略产生候选2项集的集合C2,然后,扫描所有事务,对C2中每个项进行计数。同样的,根据最小支持度从C2中删除不满足的项,从而获得频繁2项集L2。
  3. 对L2的自身连接生成的集合执行剪枝策略产生候选3项集的集合C3,然后,扫描所有事务,对C3每个项进行计数。同样的,根据最小支持度从C3中删除不满足的项,从而获得频繁3项集L3。
  4. 以此类推,对Lk-1的自身连接生成的集合执行剪枝策略产生候选k项集Ck,然后,扫描所有事务,对Ck中的每个项进行计数。然后根据最小支持度从Ck中删除不满足的项,从而获得频繁k项集。

 

 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

你可能感兴趣的:(算法,数据挖掘)