我刚刚意识到,频繁项目集的表现与每个篮子的项目数量密切相关。我运行以下代码:
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计算所有可能的组合,这可能是为什么它的运行时间与项目数量高度相关。有没有办法告诉方法限制项目数量而不是所有组合只是成对?
答案 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])
目前,算法内部没有此类过滤功能,但源代码可以修改。