当前位置:   article > 正文

数据仓库与数据挖掘——Apriori算法_apriori算法流程图

apriori算法流程图

一、基本介绍

        Apriori算法是经典的挖掘频繁项目集和关联规则的数据挖掘算法。当定义问题时,通常会使用先验知识或者假设,这被称作"一个先验"。算法使用频繁项目集的先验性质,即频繁项目集的所有非空子集也一定是频繁的。Apriori算法使用一种称为逐层搜索的迭代方法,其中k项集用于探索(k+1)项集。首先通过扫描数据库,累计每个项的计数,并收集满足最小支持度的项,找出频繁1项集的集合。该集合记为L1。然后,使用L1找出频繁2项集的集合L2,使用L2找出L3……如此下去,直到不能再找到频繁k项集。每找出一个Lk需要一次数据库的完整扫描。Apriori算法利用频繁项目集的先验性质来压缩搜索空间。

二、核心思想

项目空间集理论:

        定理1:若项目集X是频繁项目集,则它的所有非空子集都是频繁项目集。

        定理2:如项目集X是非频繁项目集,则它的所有超集都是非频繁项目集。

三、原理演示

        红色部分为不小于最小支持度的项,被添加到频繁项目集中;

        黄色部分为小于最小支持度的项,它及它的超集不会添加到频繁项目集中;

        蓝色部分为最大频繁项目集,本身是频繁项集,且其中任何一项的超集都是非频繁的。

四、算法流程图

五、关键源码展示

1、导入数据

2、数据预处理

3、生成候选/频繁项目集

4、关联规则生成

六、完整代码与数据集

1、完整代码

  1. import itertools
  2. def loadData():
  3. try:
  4. with open("Apriori.txt", "r") as f:
  5. data = []
  6. for line in f:
  7. data.append(line.strip().split(','))
  8. return data
  9. except Exception as e:
  10. print(e)
  11. # 利用set的性质将交易记录中的元素去重,从而得到构成交易记录的元素集合
  12. def data_index(data_set):
  13. items = set(itertools.chain(*data_set))
  14. # 建立字符串与编号之间的相互映射
  15. str_index = {}
  16. index_str = {}
  17. # 打印元素与编号的对应关系,后续操作对元素编号进行处理
  18. print("------------------------------元素编号------------------------------")
  19. for index, item in enumerate(items):
  20. print(index, '->', item)
  21. str_index[item] = index
  22. index_str[index] = item
  23. # 原字符串转换为index
  24. for i in range(len(data_set)):
  25. for j in range(len(data_set[i])):
  26. data_set[i][j] = str_index[data_set[i][j]]
  27. return data_set, index_str
  28. # 根据支持数筛选频繁项目集
  29. def Ck_Lk(data_set, Ck, min_support):
  30. global item
  31. support = {}
  32. # 用数据集的每一行跟候选项目集的每个项对比,若该项目集是其中的子集,则自增1,否则为0
  33. for row in data_set:
  34. for item in Ck:
  35. # 判断集合item是否为集合row的子集
  36. if item.issubset(row):
  37. # key -- 字典中要查找的键
  38. # value -- 可选,如果指定键的值不存在时,返回该默认值
  39. support[item] = support.get(item, 0) + 1
  40. # k-频繁项目集输出
  41. print('L{}:{}'.format(len(item), support))
  42. # 计算频率需要用到长度
  43. length = len(data_set)
  44. Lk = {}
  45. for key, value in support.items():
  46. sup = value / length
  47. # 频率大于最小支持度才能进入频繁项目集
  48. if sup >= min_support:
  49. Lk[key] = sup
  50. return Lk
  51. def Lk_Ck_plus1(Lk):
  52. Lk_list = list(Lk)
  53. # 保存组合后的k+1项集
  54. Ck_plus1 = set()
  55. Lk_size = len(Lk)
  56. if Lk_size > 1:
  57. # 获取频繁项集的长度
  58. k = len(Lk_list[0])
  59. for i, j in itertools.combinations(range(Lk_size), 2):
  60. t = Lk_list[i] | Lk_list[j]
  61. if len(t) == k + 1:
  62. Ck_plus1.add(t)
  63. return Ck_plus1
  64. def get_all_L(data_set, min_support):
  65. print("---------------------------候选项目集生成----------------------------")
  66. # 首先创建候选1项集
  67. # 把data_set中的元素(已转化为index)去重
  68. items = set(itertools.chain(*data_set))
  69. # 用frozenset把项集装进新列表里
  70. C1 = [frozenset(i) for i in enumerate(items)]
  71. # 从1-候选项集目到1-频繁项目集(第一次生成频繁项目集不需要对元素进行两两组合)
  72. L1 = Ck_Lk(data_set, Ck=C1, min_support=min_support)
  73. L = L1
  74. Lk = L1
  75. while len(Lk) > 0:
  76. lk_key_list = list(Lk.keys())
  77. # k-频繁项目集 到 k+1-候选项目集 进行了两两组合
  78. Ck_plus1 = Lk_Ck_plus1(lk_key_list)
  79. # k-候选项目集 到 k-频繁项目集
  80. Lk = Ck_Lk(data_set, Ck_plus1, min_support)
  81. if len(Lk) > 0:
  82. # 把字典Lk的键值对更新到L
  83. L.update(Lk)
  84. else:
  85. break
  86. return L
  87. # 关联规则左侧表达式
  88. def rules_from_item(item):
  89. left = []
  90. for i in range(1, len(item)):
  91. left.extend(itertools.combinations(item, i))
  92. # difference()方法返回集合的差集
  93. ans = [(frozenset(i), frozenset(item.difference(i))) for i in left]
  94. return ans
  95. # 保存所有候选的关联规则
  96. def rules_from_L(L, min_confidence):
  97. rules = []
  98. for Lk in L:
  99. # 首先频繁项目集长度需要大于1才能生成关联规则
  100. if len(Lk) > 1:
  101. # 在列表末尾一次性追加另一个序列中的多个值
  102. rules.extend(rules_from_item(Lk))
  103. result = []
  104. for left, right in rules:
  105. # left和right都是frozenset类型,二者可以取并集(分子 Ik),然后L里去查询支持度
  106. support = L[left | right]
  107. # 置信度公式
  108. confidence = support / L[left]
  109. if confidence >= min_confidence:
  110. result.append({"left": left, "right": right, "support": support, "confidence": confidence})
  111. return result
  112. # 关联规则的左表达式和右表达式获取
  113. def return_str(index_str, result):
  114. for item in result:
  115. true_left = []
  116. true_right = []
  117. left = list(item['left'])
  118. for tem in left:
  119. true_left.append(index_str[tem])
  120. right = list(item['right'])
  121. for tem in right:
  122. true_right.append(index_str[tem])
  123. item['left'] = frozenset(true_left)
  124. item['right'] = frozenset(true_right)
  125. return result
  126. # 打印集合
  127. def print_frozenset(fs):
  128. ans = ''
  129. for i in fs:
  130. ans += i
  131. return ans
  132. def main():
  133. # 加载数据
  134. data_set = loadData()
  135. # 设置参数
  136. min_support = 0.5
  137. min_confidence = 0.5
  138. print("-------------------------导入事务数据库数据--------------------------")
  139. for i in range(0, len(data_set)):
  140. print(data_set[i])
  141. # 把数据转为数字(便于计算)
  142. data_set, index_str = data_index(data_set)
  143. # 生成频繁项目集
  144. L = get_all_L(data_set, min_support=min_support)
  145. # 生成关联规则
  146. result = rules_from_L(L, min_confidence=min_confidence)
  147. result = return_str(index_str, result)
  148. print("-----------------------------关联规则生成------------------------------")
  149. print("\t\t", " min_support:", min_support, "\t\t\t\t", "min_confidence:", min_confidence)
  150. print("---------------------------------------------------------------------")
  151. print("", "No.", "\t\t", "Lk", "\t", "Xm-1", "\t\t", "Confidence", "\t", "Support", "\t\t", "Rule")
  152. index = 1
  153. for item in result:
  154. print("", str(index).zfill(3), "\t\t", print_frozenset(item["left"] | item["right"]), "\t ",
  155. print_frozenset(item["left"]), "\t\t ",
  156. round(item["confidence"] * 100), "%\t\t ",
  157. round(item["support"] * 100), "%\t\t ",
  158. print_frozenset(item["left"]), "->", print_frozenset(item["right"]))
  159. index += 1
  160. if __name__ == "__main__":
  161. main()

2、数据集

  1. a,c,d,e,f,g
  2. a,b,c,d,e,h
  3. a,b,c,d,e,f,g,h
  4. a,b,c,g,h
  5. a,b,c,d,g,h
  6. a,b,c,d,e,f,g,h
  7. a,b,c,d,e,f,g
  8. a,b,c,e,g,h
  9. a,b,c,d,e,f,h
  10. c,d,e,f,g,h
  11. a,b,c,d,g,h
  12. a,c,d,e,f,g,h
  13. a,b,c,e,f,g,h
  14. b,c,e,f,g,h
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/571481
推荐阅读
相关标签
  

闽ICP备14008679号