【问题标题】:Efficient nested set comprehension in clojureclojure 中的高效嵌套集合理解
【发布时间】: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


【解决方案1】:

我认为可能有一个很好的解决方案,涉及以由规范排序子集键控的映射映射的形式存储您的事务,例如前缀树,可能使用优先级映射或手指树作为基础映射。 ..对不起,这不是一个正确的答案!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    相关资源
    最近更新 更多