小编今天学习了Apriori算法,用于生成频繁项集,感觉好厉害。 ——参考 Robert Layton的 数据挖掘
所以小编特此记录加深印象。所以代码 仅仅放上核心。
Apriori算法可以说是经典的亲和性分析算法。它只从数据集中频繁出现的商品中选取共同出现的商品组成频繁项集(frequent itemset),避免了上述复杂度呈指数级增长的问题。一旦找到频繁项集,生成关联规则就很容易了。
挖掘亲和性分析所用的关联规则之前,我们先用Apriori算法生成频繁项集。接着,通过检测48 第 4 章 用亲和性分析方法推荐电影频繁项集中前提和结论的组合,生成关联规则(例如,如果用户喜欢电影X,那么他很可能喜欢电影Y)。
第一个阶段,需要为Apriori算法指定一个项集要成为频繁项集所需的最小支持度。任何小于最小支持度的项集将不再考虑。如果最小支持度值过小,Apriori算法要检测大量的项集,会拖慢的运行速度;最小支持度值过大的话,则只有很少的频繁项集。找出频繁项集后,
在第二个阶段,根据置信度选取关联规则。可以设定最小置信度,返回一部分规则,或者返回所有规则,让用户自己选。本章,我们设定最小置信度,只返回高于它的规则。置信度过低将会导致规则支持度高,正确率低;置信度过高,导致正确率高,但是返回的规则少。
小编在看时,碰到了frozenset,查了查用法:附上菜鸟教程
frozenset() 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
里面得参数是;
iterable -- 可迭代的对象,比如列表、字典、元组等等。
https://www.runoob.com/python/python-func-frozenset.html
代码巧妙得利用了 集合 得特性,集合运算速度快,并且有自动去重得功能。
# 选择训练集200 ratings = all_ratings[all_ratings[‘UserID‘].isin(range(200))] # 选出喜欢的数据 favorable_ratings = ratings[ratings[‘Favorable‘]] # 将数记录成 一个用户对应多部 喜欢的电影 favorable_reviews_by_users = dict((k, frozenset(v.values)) for k, v in favorable_ratings.groupby("UserID")["MovieID"]) # print(favorable_reviews_by_users) len(favorable_reviews_by_users) # 得到最后训练集的人数 199 # 生成一个电影有多少人喜欢 num_favorable_by_movie = ratings[["MovieID", "Favorable"]].groupby("MovieID").sum() # print(num_favorable_by_movie) num_favorable_by_movie.sort_values("Favorable", ascending=False)[:5] 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.keys(): 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]) import sys frequent_itemsets = {} min_support = 50 # print(type(frequent_itemsets)) dict # k=1 frequent_itemsets[1] = dict((frozenset((movie_id,)), row["Favorable"]) for movie_id, row in num_favorable_by_movie.iterrows() if row["Favorable"] > min_support) # print(frequent_itemsets) # exit() print("There are {} movies with more than {} favorable reviews".format(len(frequent_itemsets[1]), min_support)) sys.stdout.flush()# 通过循环,求出了所有情况 for k in range(2, 20): # k代表每个数据集中 值得推荐电影总共得个数,看看结果就懂了 # 得到结果 cur_frequent_itemsets = find_frequent_itemsets(favorable_reviews_by_users, frequent_itemsets[k-1], min_support) if len(cur_frequent_itemsets) == 0: print("Did not find any frequent itemsets of length {}".format(k)) sys.stdout.flush() break else: print("I found {} frequent itemsets of length {}".format(len(cur_frequent_itemsets), k)) #print(cur_frequent_itemsets) sys.stdout.flush() frequent_itemsets[k] = cur_frequent_itemsets # 去除个数为1 的,这样的数据没办法推荐 del frequent_itemsets[1] print(frequent_itemsets[9])
There are 20 movies with more than 50 favorable reviews I found 145 frequent itemsets of length 2 I found 508 frequent itemsets of length 3 I found 989 frequent itemsets of length 4 I found 1146 frequent itemsets of length 5 I found 811 frequent itemsets of length 6 I found 338 frequent itemsets of length 7 I found 73 frequent itemsets of length 8 I found 5 frequent itemsets of length 9 Did not find any frequent itemsets of length 10 {frozenset({260, 356, 2571, 2028, 1196, 1198, 593, 1210, 858}): 72, frozenset({260, 356, 296, 2571, 1198, 47, 527, 593, 318}): 72, frozenset({260, 296, 2571, 2028, 1196, 1198, 593, 1210, 858}): 72, frozenset({260, 356, 296, 2571, 1198, 527, 593, 858, 318}): 81, frozenset({260, 356, 296, 2571, 1196, 593, 1210, 858, 318}): 72}--------------------------上面得到了频繁项集,下面来生成规则。规则由前提和结论组成。
# 现在创建一个列表, candidate_rules = [] for itemset_length, itemset_counts in frequent_itemsets.items(): for itemset in itemset_counts.keys(): for conclusion in itemset: premise = itemset - set((conclusion,)) # 减号为集合itemset除去conclusion之后得 candidate_rules.append((premise, conclusion)) print("There are {} candidate rules".format(len(candidate_rules)))
创建规则成功,只是conclusion只有一个电影推荐。
原文地址:https://www.cnblogs.com/a-runner/p/12283952.html