Orange3 频繁项集性能

Orange3 Frequent Itemsets performance

我刚刚意识到频繁项集的性能与每个篮子的项目数密切相关。我运行下面的代码:

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 计算所有可能的组合,这可能就是 运行ning 时间与项目数量高度相关的原因.有什么方法可以告诉方法限制数字项的计数,而不是成对的所有组合?

包含 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])

目前,算法内部没有这样的过滤可用,但源代码可以修改。

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