我已经实现了apriori算法来挖掘频繁项集,它对样本数据的工作性能很好,但是当我尝试对http://fimi.ua.ac.be/data/retail.dat上的零售数据集执行它时,它大约是3mb的数据,有88k个事务和1600个唯一项,大约需要29个小时我已经搜索了导致性能下降的原因,发现生成候选项集的算法要花很多时间。有谁能帮助我提高性能,或者这是一个正常的算法行为。

最佳答案

你在使用什么算法,你的阈值是多少?
如果有满足最低支持的n1项集,Apriori(和许多其他人)必须考虑n*(n-1)/22项集这当然会变得相当昂贵。在apriori中,2项集通常是最大和最昂贵的步骤(取决于您的设置,3项集可能更糟,但通常您不会走那么远…)
根据您的数据特征,eclat可能会表现得更好,也可能更差。FP-growth非常聪明,但似乎很难正确有效地实现。
也存在各种各样的变型,有些是概率性的,并且可能更快。
但实际上,实现和数据集/参数设置很重要。在同一组数据上,一种方法可能比另一种更好;而且实现可能很容易有10倍的性能差异。特别是对于apriori来说,很多人不完全理解所使用的修剪技巧,最终做了太多的工作。
对于您的示例数据集(不幸的是,如果没有一个解释数字的字典,这是完全没有帮助的),my apriori在一个低端atom cpu上大约1分钟就完成了,minsupport=1000。找到的4个项目集是:

32, 38, 39, 48: 1236
32, 39, 41, 48: 1646
36, 38, 39, 48: 1080
38, 39, 41, 48: 1991
38, 39, 48, 110: 1031
38, 39, 48, 170: 1193

但如前所述,参数与apriori有很大关系。apriori在事务数量上具有很好的伸缩性(可能超过了主内存的容量),但是它有大量的候选对象,因此需要将minsupport设置得足够高。
MinSupport=1000时:
1-frequentItemsets (56)
2-frequentItemsets (49)
3-frequentItemsets (24)
4-frequentItemsets (6)
APRIORI runtime: 55401 ms

最小支持=500:
1-frequentItemsets (185)
2-frequentItemsets (191)
3-frequentItemsets (79)
4-frequentItemsets (13)
5-frequentItemsets (0)
APRIORI runtime: 136594 ms

如你所见,运行时间增加了一倍多。原因是1项集增长了,产生了更多的2项集候选者。在3个和4个项目集上,差别不再那么大了。但总的来说,在一个真正低端的CPU上运行2分钟还不错。
将最小支持减少到250:
1-frequentItemsets (587)
2-frequentItemsets (640)
3-frequentItemsets (273)
4-frequentItemsets (54)
5-frequentItemsets (4)
APRIORI runtime: 954984 ms

现在运行时开始爆炸。差不多16分钟就能找到5件套:
32, 38, 39, 41, 48: 448
36, 38, 39, 41, 48: 334
38, 39, 41, 48, 110: 346
38, 39, 41, 48, 170: 413

如您所见,38, 39, 41, 484-itemset在这个数据集中起着关键作用(但我们在第一次运行中已经发现了这一点)。我们现在也可以给信心,这将是涉及5个项目的最有信心的规则:大约涉及前四个事务的交易也涉及到项目38, 39, 41, 48 -> 32。但是考虑到这个数据集的数字的含义是未知的,我们不知道这个规则在实践中是否真正有趣,或者只是一个玩具练习。
转到minSupport=100,运行时将进一步增长:
1-frequentItemsets (1857)
2-frequentItemsets (2785)
3-frequentItemsets (1475)
4-frequentItemsets (306)
5-frequentItemsets (28)
6-frequentItemsets (0)
APRIORI runtime: 8256507 ms

也就是说,超过两个小时。大部分时间都花在了2个项目上:有170万名候选人,其中2785人是常客。对于这3个项目集,人们可以粗略估计,只有大约1000名候选人,但不再有数百万人。我有一些计划,通过根据候选数目在两个码路之间切换来进一步改进实现。('''更新:''通过更简单的修改,我将运行时进一步减少了20倍因此,是的,“实现很重要”,它可以很容易地将因子设置为100到1000或更高-例如,当APRIORI修剪没有完全实现时)
如果我有时间阅读eclat算法并重新实现它,我可以用结果更新它。我相信这里会更快,FP增长也会更快。

10-06 05:04