这是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} 当 项目集== 它计数{A,B}。 当 项目集==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
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
中的所有密钥都需要排序。