【发布时间】:2013-09-19 00:06:03
【问题描述】:
我有一个包含 100 个交易的列表,每个交易包含 100 个项目。我需要找到一起出现的最频繁的项目集。为了实现这一点,我必须做很多事情之一是计算交易中各种项目集的support。支持定义为包含项目集中所有项目的事务数。
这是我的测试数据:
(def transactions '(#{1 2 3 4}
#{2 3}
#{1 3 4}
#{3 4 5}))
(def itemsets #{#{2 3} ; Support should be 2
#{3 4} ; Support should be 3
#{5} ; Support should be 1
#{3}}) ; Support should be 4
这是我最初尝试实现一个返回所有频繁项集列表的函数:
(defn support [itemset data]
(count (filter #(subset? itemset %1) data)))
(defn all-frequent [itemsets transactions min-support]
(filter #(<= min-support (support %1 transactions)) itemsets))
并调用我的常用函数:
(all-frequent itemsets transactions 3) ;=> (#{3} #{3 4})
这是最有效和最惯用的方法吗?我考虑过其他数据结构,如 hash-set、sorted-set 等,但我对 Clojure 还是很陌生,我不知道它们之间的区别。
提前致谢!
【问题讨论】:
-
我认为您当前的实现非常地道。它在实际生产数据上的表现如何?我问是因为坦率地说,您的生产数据的大小听起来并没有那么大,以至于需要对实施进行微优化。毕竟,一个简单、直接的实现比一个复杂的优化实现更容易维护。
标签: performance clojure set data-mining