我有一个包含 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 还是很陌生,我不知道它们之间的区别。
提前致谢!