1

我有一个包含 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))

并调用我的常用函数:

(all-frequent itemsets transactions 3) ;=> (#{3} #{3 4})

这是最有效和最惯用的方法吗?我考虑过其他数据结构,如哈希集、排序集等,但我在 Clojure 还是很陌生,我不知道它们之间的区别。

提前致谢!

4

1 回答 1

0

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

于 2013-09-19T01:01:24.300 回答