Orange3 Frequent Itemsets性能

时间:2018-04-23 14:34:25

标签: orange

我刚刚意识到,频繁项目集的表现与每个篮子的项目数量密切相关。我运行以下代码:

import datetime
from datetime import datetime
from orangecontrib.associate.fpgrowth import * 
%%time
T = [[1,3, 4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]]    
itemsets = frequent_itemsets(T, 1)
a=list(itemsets)

随着我增加T中项目的数量,运行时间增加如下:

Item    running time
21        3.39s
22        9.14s
23        15.8s 
24        37.4s
25        1.2 min
26        10 min
27        35 min
28        95 min

对于31个项目集,它花费了10个小时而没有返回任何结果。我想知道是否有合理的时间运行超过31项?在这种情况下,我只需要成对项目集(A - > B),而我的理解是frequent_itemsets计算所有可能的组合,这可能是为什么它的运行时间与项目数量高度相关。有没有办法告诉方法限制项目数量而不是所有组合只是成对?

2 个答案:

答案 0 :(得分:2)

您可以使用其他允许指定项目集约束的软件,例如长度限制。例如,您可以考虑SPMF数据挖掘库(披露:我是创始人),它为项目集和模式挖掘提供了大约120种算法。它将允许您使用FPGrowth与长度约束。因此,您可以仅使用2个项目或3个项目挖掘模式。您还可以尝试其他功能,例如挖掘关联规则。该软件适用于文本文件,可以为命令行调用,速度非常快。

答案 1 :(得分:1)

21个项目的单个交易的数据库产生2097151个项目集。

>>> T = [list(range(21))]
>>> len(list(frequent_itemsets(T, 1)))
2097151

也许不是将绝对支持设置为单个事务(1),而是选择支持为例如所有交易的5%(.05)。 您还应该将返回的项目集限制为恰好包含两个项目(先行和后续关联规则发现的后续项目),但运行时仍然很高,正如您所理解的那样,纯粹的组合学。

len([itemset
     for itemset, support in frequent_itemsets(T, 1)
     if len(itemset) == 2])

目前,算法内部没有此类过滤功能,但源代码可以修改。