Performance clojure中的有效嵌套集理解

Performance clojure中的有效嵌套集理解,performance,clojure,set,data-mining,Performance,Clojure,Set,Data Mining,我有一个100笔交易的清单,每个交易包含100项。我需要找到一起出现的最频繁的项目集。为了实现这一点,我必须做很多事情之一就是计算事务中各种项目集的数量。支持定义为包含项目集中所有项目的事务数 这是我的测试数据: (def transactions '(#{1 2 3 4} #{2 3} #{1 3 4} #{3 4 5})) (def itemsets #{#{2 3} ;

我有一个100笔交易的清单,每个交易包含100项。我需要找到一起出现的最频繁的项目集。为了实现这一点,我必须做很多事情之一就是计算事务中各种项目集的数量。支持定义为包含项目集中所有项目的事务数

这是我的测试数据:

(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))
这是最有效、最惯用的方法吗?我考虑过其他数据结构,如散列集、排序集等,但我对Clojure还是相当陌生,我不知道其中的区别


提前谢谢

我认为可能有一个很好的解决方案,将您的事务存储在由规范排序子集(如前缀树)键入的映射的形式中,可能使用优先级映射或手指树作为基础映射…抱歉,这不是一个正确的答案

我认为您当前的实现非常地道。它在实际生产数据上的性能如何?我这样问是因为坦率地说,您的生产数据的大小听起来并没有那么大,因此不需要对实现进行微观优化。毕竟,简单、直接的实现比复杂的优化实现更容易维护。
(all-frequent itemsets transactions 3) ;=> (#{3} #{3 4})