关于Apriori算法

时间:2013-09-01 13:39:19

标签: algorithm apriori

我正在尝试找到给定数据的频繁项目集。在这种情况下,如果一个年龄段的人结婚与否,这是一个关于汽车数量的简单例子。

1项目集和2项目集的集合如下:

---Freq. 1-itemsets---> 9 times!
[
(1) [age:[20,24]]
(2) [age:[25,29]]
(1) [age:[30,34]]
(1) [age:[35,39]]
(2) [married:[no]]
(3) [married:[yes]]
(1) [num_cars:[0,0]]
(2) [num_cars:[1,1]]
(2) [num_cars:[2,2]]
]

---Freq. 2-itemsets---> 14 times!
[
(1) [age:[20,24],married:[no]]
(1) [age:[20,24],num_cars:[1,1]]
(1) [age:[25,29],married:[no]]
(1) [age:[25,29],married:[yes]]
(1) [age:[25,29],num_cars:[0,0]]
(1) [age:[25,29],num_cars:[1,1]]
(1) [age:[30,34],married:[yes]]
(1) [age:[30,34],num_cars:[2,2]]
(1) [age:[35,39],married:[yes]]
(1) [age:[35,39],num_cars:[2,2]]
(1) [married:[no],num_cars:[0,0]]
(1) [married:[no],num_cars:[1,1]]
(1) [married:[yes],num_cars:[1,1]]
(2) [married:[yes],num_cars:[2,2]]
]

(不要关心括号中的数字,它只是这个项目集的频繁; 鉴于此示例中的min_support为0.1)

现在我想获得频率。来自频率的3个项目集。 2,项目集。 在这种情况下,我可以结合两个频率。 2个项目集,其中交集有一个元素。现在我必须检查这个组合的所有子集(大小为2)是否是freq中的元素。 2项集。

如果我这样做,我会得到以下内容:

---Freq. 3-itemsets---> 6 times!
[
(1) [age:[20,24],married:[no],num_cars:[1,1]]
(1) [age:[25,29],married:[no],num_cars:[0,0]]
(0) [age:[25,29],married:[no],num_cars:[1,1]]
(1) [age:[25,29],married:[yes],num_cars:[1,1]]
(1) [age:[30,34],married:[yes],num_cars:[2,2]]
(1) [age:[35,39],married:[yes],num_cars:[2,2]]
]

但是现在,正如你所看到的,我得到了一个频率。 3项集,频繁为0.因此它不应该在频率集中。 3项集。

如果我让这个例子从例如Weka(http://www.cs.waikato.ac.nz/ml/weka/),所述项目集不会出现在结果中。

但我可以通过组合生成它 {年龄:[25,29],结婚:[no]}和{已婚:[no],num_cars:[1,1]}。

所以我的问题是:

我是否在生成频繁项目集时犯了错误(我的程序在上面构建了这个项目集),或者如果子集是freq的元素,我是否只是首先过滤生成的候选项。 2项目集,之后如果频繁超过0 ???

我希望我能清楚地解释我的问题......

感谢您的帮助!!

1 个答案:

答案 0 :(得分:0)

对于基数k的项目集是频繁的,有必要但不足以所有(k-1)元素子集是频繁的。通过组合(k-1)元素项集并检查子集来生成候选k元素项集之后,您需要再次扫描数据并丢弃不是真正频繁的候选项。