当前位置:   article > 正文

机器学习算法之Apriori算法(python实现)_apriori算法python代码

apriori算法python代码

        Apriori算法是一种经典的关联规则挖掘算法,用于从大规模数据集中发现频繁项集及其关联规则。
        Apriori算法基于以下两个重要概念:支持度(support)和置信度(confidence)。

        支持度衡量一个项集在数据集中出现的频率,定义为包含该项集的事务数目与总事务数的比例。置信度衡量关联规则的可靠性,定义为规则的支持度与规则左侧项集的支持度的比值。

        Apriori算法的主要思想是利用频繁项集的性质,通过逐层搜索的方式发现频繁项集。算法的过程如下:

        1.初始扫描:计算单个项的支持度,筛选出满足最小支持度阈值的项集作为一阶频繁项集。
        2.迭代生成:根据当前的k-1阶频繁项集,生成候选k阶项集。
        3.连接:将k-1阶频繁项集两两连接生成候选k阶项集。
        4. 剪枝:对候选k阶项集进行剪枝操作,删除包含非频繁子项集的项集。
        5.频繁项集计数:对候选k阶项集进行扫描,计算每个项集的支持度。
        6.停止条件:如果没有发现新的频繁项集,或者已达到预定的阶数,则停止迭代。

        Apriori算法通过逐层搜索的方式逐渐生成更高阶的频繁项集,直到不能再生成新的频繁项集为止。最后,基于频繁项集,可以计算关联规则的置信度。

        本次算法代码中我选用的是一组购物商品数据,通过Apriori算法来找出这些商品中有哪些商品之间存在关联。

56b674301ba24677a6e023227ddfe961.png

        具体的python代码如下:

  1. # 数据集为一组购物篮数据
  2. dataset = {
  3. '1': {'面包', '黄油', '尿布', '啤酒'},
  4. '2': {'咖啡', '糖', '小甜饼', '鲑鱼', '啤酒'},
  5. '3': {'面包', '黄油', '咖啡', '尿布', '啤酒', '鸡蛋'},
  6. '4': {'面包', '黄油', '鲑鱼', '鸡'},
  7. '5': {'鸡蛋', '面包', '黄油'},
  8. '6': {'鲑鱼', '尿布', '啤酒'},
  9. '7': {'面包', '茶', '糖鸡蛋'},
  10. '8': {'咖啡', '糖', '鸡', '鸡蛋'},
  11. '9': {'面包', '尿布', '啤酒', '盐'},
  12. '10': {'茶', '鸡蛋', '小甜饼', '尿布', '啤酒'}
  13. }
  14. support = 4 # 设置最小支持度计数 = 4
  15. k = 0 # k表示当前为频繁k项集
  16. goods = set() # 用集合goods保存所有的商品
  17. for i in dataset:
  18. for item in dataset[i]:
  19. goods.add(item)
  20. frequent = list() # 用列表frequent保存每一次的频繁项集
  21. appear = list() # 用列表appear记录频繁项集中每项出现的次数
  22. # 求频繁1项集
  23. k += 1
  24. for item in goods:
  25. times = 0 # 用times记录每个商品出现在购物篮数据的次数
  26. for i in dataset:
  27. if item in dataset[i]:
  28. times += 1
  29. if times >= support: # 若次数大于最小支持度计数,则添加到频繁1项集中
  30. appear.append(times)
  31. temp = set()
  32. temp.add(item)
  33. frequent.append(temp)
  34. last = frequent # 用列表last记录上一次迭代的频繁项集
  35. frequent = list()
  36. appear = list()
  37. # 求频繁2项集,即频繁1项集中的数据两两求并集,若该并集出现在购物篮数据中的次数
  38. # 大于最小支持度计数,则添加到频繁2项集中
  39. k += 1
  40. for i in range(0, len(last) - 1):
  41. for j in range(i + 1, len(last)):
  42. times = 0
  43. temp = last[i] | last[j]
  44. for item in dataset:
  45. if temp & dataset[item] == temp:
  46. times += 1
  47. if times >= support:
  48. appear.append(times)
  49. frequent.append(temp)
  50. last = frequent # 用列表last记录上一次迭代的频繁项集
  51. appear2 = appear # 用列表last记录上一次迭代的频繁项集中每项出现的次数
  52. # 求之后每次迭代后的频繁项集,以频繁3项集为例,频繁2项集中的数据两两求并集
  53. # 若该并集刚好包含3个商品且出现在购物篮数据中的次数大于最小支持度计数,则添加到频繁3项集中
  54. while (True):
  55. if len(frequent) <= 1:
  56. break
  57. frequent = list()
  58. appear = list()
  59. k += 1
  60. for i in range(0, len(last) - 1):
  61. for j in range(i + 1, len(last)):
  62. times = 0
  63. temp = last[i] | last[j]
  64. if last[i] & last[j] != set() and len(temp) == k:
  65. for item in dataset:
  66. if temp & dataset[item] == temp:
  67. times += 1
  68. if times >= support and temp not in frequent: # 由于频繁项集用列表保存,因此此处需要进行去重
  69. appear.append(times)
  70. frequent.append(temp)
  71. if len(frequent) >= 1:
  72. last = frequent
  73. appear2 = appear
  74. print('\n关联规则\t\t 支持度计数')
  75. for i in range(0, len(last)):
  76. print(last[i], '\t', appear2[i])
  77. print()
  78. # 计算每个关联规则的置信度
  79. print('X\t\t Y\t 置信度')
  80. result = set()
  81. for i in range(0, len(last)):
  82. for item in last[i]:
  83. temp = set()
  84. for j in last[i]:
  85. temp.add(j)
  86. temp.discard(item)
  87. times = 0
  88. for item2 in dataset:
  89. if temp & dataset[item2] == temp:
  90. times += 1
  91. print(temp, '\t', item, '\t', appear2[i] / times)

        代码运行结果如下:

49bf91faaa8544028f38d10c5aced76c.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/356799
推荐阅读
相关标签
  

闽ICP备14008679号