关于《Python数据挖掘入门与实践》中Apriori算法代码的改进建议
在学习《Python数据挖掘入门与实践》一书中Apriori算法章节时,读者发现书中提供的代码在生成包含两项的频繁项集时存在重复计数的可能性。 原始代码片段尝试从只包含一项的频繁项集 (k=1) 扩展到包含两项 (k=2) 的频繁项集。 核心问题在于,对于包含多个频繁1-项集的用户评论,相同的2-项集会被多次计数。
原始代码片段(略去部分无关代码):
def find_frequent_itemsets(favorable_reviews_by_users, k_1_itemsets, min_support): counts = defaultdict(int) # ... (循环遍历用户和k-1项集) ... for other_reviewed_movie in reviews - itemset: current_superset = itemset | frozenset((other_reviewed_movie,)) counts[current_superset] += 1 # ... (返回满足最小支持度的频繁项集) ...
问题在于current_superset的生成方式。例如,如果用户评论包含{a, b},当itemset为{a}时,会生成{a, b};当itemset为{b}时,会生成{b, a}。由于frozenset({a, b})和frozenset({b, a})是相等的,导致重复计数。
改进方案:
为了避免重复计数,可以对current_superset进行规范化处理,例如将其元素排序后转换为元组作为字典的键。 这确保了即使顺序不同,相同的项集也只会被计数一次。
改进后的代码片段:
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,)) # 规范化处理:将集合元素排序后转换为元组 sorted_superset = tuple(sorted(list(current_superset))) counts[sorted_superset] += 1 return dict([(itemset, frequency) for itemset, frequency in counts.items() if frequency >= min_support])
这个改进后的版本通过tuple(sorted(list(current_superset)))将frozenset转换为一个有序的元组,从而避免了重复计数的问题。 这保证了相同的频繁项集,无论其元素顺序如何,都只会被计数一次,从而提高了Apriori算法的准确性。 需要注意的是,这仅仅是针对k=2的情况的改进,对于更高阶的频繁项集生成,需要进一步的算法优化。
以上就是《Python数据挖掘入门与实践》Apriori算法代码中,频繁项集计数是否存在重复问题?的详细内容,更多请关注知识资源分享宝库其它相关文章!
版权声明
本站内容来源于互联网搬运,
仅限用于小范围内传播学习,请在下载后24小时内删除,
如果有侵权内容、不妥之处,请第一时间联系我们删除。敬请谅解!
E-mail:dpw1001@163.com
发表评论