上一节我们给出了频繁项集的生成过程以及策略。简单的可以分为三个步骤:
- 由k-项集根据最小支持度过滤出k-频繁项集。
- 由k-频繁项集生成(k+1)-项集,可以称为候选项集。
- 然后重复第1步。
这集主要讨论从k-候选集生成k-频繁项集的过程。
从k-候选集生成k-频繁项集的过程其实很简单,就是计算该k-候选项集的支持度是否大于等于最小支持度minsup。
所以,最重要的一件事情就是计算k-候选项集的支持度。
sup = (X∪Y)∙count/n, 其中n是总的事务,(X∪Y)∙count是指所有的事务中包含(X∪Y)项集的数量。
首先定义项的对象,为了方便,所有的代码都用Groovy编写:
然后定义事务对象,每个事务对象都可以简单的看成是一个项的集合:
然后我们有一个事务集合,和若干候选项集,看看怎么以最简单的方式计算项集的支持度。
那么,很容易得到事务的总数n
假设有一个2-候选项集
我们要用最直接的方式计算其支持度
我们知道,Java API的List的containsAll(Collection c)的方法实现是遍历c的所有的元素,然后调用List的contains方法。我们假设每个事务的平均项集长度为m,总的事务数量为n,那么我们要判断一个k-候选项集是否为频繁项集的最坏时间复杂度为O(nmk)。
实际上,在创建事务的时候,我们就知道每个Item属于哪些Transaction。假如我们在创建Transaction的时候保留
该信息,那么后面计算支持度的方法就简单得多。
我们在Item对象中保留该Item属于哪些Transaction
Transaction的构造方法如下
那么我们计算candidateItems=[xgang, xming]所属于的事务数量的方法就是求两个Item的transactionNames集合的交集的size。
ArrayList API retainAll的最关键代码是
所以retainAll的最坏情况是两个List没有交集,时间复杂度为O(n*n),所以计算一个k-候选项集的支持度的最坏时间复杂度为O(n*n),其中n是事务总数。