Apriori算法在用Python ch4



这是Apriori算法的一部分。我们想从一个项目频繁项目集中获得两个项目频繁项集。书中的代码如下所示:

from collections import defaultdict
def find_frequent_itemsets(favorable_reviews_by_users, k_1_itemsets, min_support):
counts = defaultdict(int)
for user, reviews in favorable_reviews_by_users.items():
for itemset in k_1_itemsets:
if itemset.issubset(reviews):
for other_reviewed_movie in reviews - itemset:
current_superset = itemset | frozenset((other_reviewed_movie,))
counts[current_superset] += 1
return dict([(itemset, frequency) for itemset, frequency in counts.items() if frequency >= min_support])

我对此感到困惑:重复计数。例如,对于某个特定用户,集合{A,B}{B,A}

for itemset in k_1_itemsets:
if itemset.issubset(reviews):
for other_reviewed_movie in reviews - itemset:
current_superset = itemset | frozenset((other_reviewed_movie,))
counts[current_superset] += 1

项目集==

它计数{A,B}

项目集==B

它计数{B,A}

那么代码是错的吗?

frozenset以及任何set都是无序和散列的,包括在字典中用作关键字或通常用于比较时。打印它可能会产生误导,因为订单有点随机,并且可以随机以不同的方式打印出来。

AB = frozenset(["xyz"]) | frozenset(["abc"])
BA = frozenset(["abc"]) | frozenset(["xyz"])
print(AB == BA)
> True
dct = {}
dct[AB] = "AB"
dct[BA] = "BA"
print(dct)
> {frozenset({'xyz', 'abc'}): 'BA'}

在原始算法中,所有集合都需要排序,这意味着事务列表(在这种情况下为reviews(以及counts中的所有密钥都需要排序。

相关内容

  • 没有找到相关文章

最新更新