热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关联规则算法——Apriori算法解析及Python实现

文章目录关联规则挖掘过程Apriori算法1.Apriori算法的基本思想2.Apriori算法产生频繁项集的过程3.Apriori算法的主要步骤4.举例及代码实现关联规则挖掘过程

文章目录

  • 关联规则挖掘过程
  • Apriori算法
    • 1. Apriori算法的基本思想
    • 2. Apriori算法产生频繁项集的过程
    • 3. Apriori算法的主要步骤
    • 4. 举例及代码实现
关联规则挖掘过程

关联规则挖掘问题可以分解为以下两个子问题

  1. 找频繁项集
    找出事务集T中所有大于或等于用户指定最小支持度的项集,即频繁项集。(项集的支持度可简单用包含该项集的事务数来表示)
  2. 利用频繁项集生成所需要的关联规则
    对每一频繁项集A,找到A的所有非空子集a,如果support(A) / support(a) >= min_confidence,则a=>(A-a)称为强关联规则。
Apriori算法

通过对数据库的多次扫描来计算项集的支持度,并发现所有的频繁项集从而生成关联规则。

1. Apriori算法的基本思想

对数据集进行多次扫描,第一次扫描得到频繁1-项集的集合L1,第k次扫描首先利用第k-1次扫描的结果Lk-1产生候选k-项集Ck,在扫描过程中计算Ck的支持度,在扫描结束后计算频繁k-项集Lk,算法当候选k-项集的集合Ck为空的时候结束。

2. Apriori算法产生频繁项集的过程

(1)连接步
(2)剪枝步

3. Apriori算法的主要步骤

(1) 扫描全部数据,产生候选1-项集的集合C1
(2) 根据最小支持度,由候选1-项集的集合C1产生频繁1-项集的集合L1
(3) 对k>1,重复步骤(4)(5)(6)
(4) 由Lk执行连接和剪枝操作,产生候选(k+1)-项集Ck+1
(5) 根据最小支持度,由候选(k+1)-项集的集合Ck+1产生频繁(k+1)-项集的集合Lk+1
(6) 若L不为空集,则k = k+1,跳往步骤(4),否则跳往步骤(7)
(7) 根据最小置信度,由频繁项集产生强关联规则

4. 举例及代码实现

举例
《关联规则算法——Apriori算法解析及Python实现》
实现

def load_data_set():
""" 加载事务集 """
data_set = [['l1','l2','l5'],
['l2','l4'],
['l2','l3'],
['l1','l2','l4'],
['l1','l3'],
['l2','l3'],
['l1','l3'],
['l1','l2','l3','l5'],
['l1','l2','l3']]
# data_set = [['l1', 'l2'], ['l1', 'l3', 'l4', 'l5'], ['l2', 'l3', 'l4', 'l6'],
# ['l1', 'l2', 'l3', 'l4'], ['l1', 'l2', 'l3','l6']]
return data_set
def create_C1(data_set):
""" 遍历事务集获得候选1-项集C1 """
C1 = set() # 集合对象
for t in data_set:
for item in t:
# 将事务集中的每个项集的项转换为不可变的集合
item_set = frozenset([item])
# print(item_set)
C1.add(item_set)
return C1
def is_apriori(Ck_item,Lksub1):
""" 对候选k-项集Ck中的每个项进行剪枝判断 """
for item in Ck_item:
sub_Ck = Ck_item - frozenset([item])
if sub_Ck not in Lksub1: # 候选k-项集中的项的子集中存在于非频繁k-1 -项集中
return False # 则该项在非频繁k-项集中
return True
def create_Ck(Lksub1,k):
""" 通过Lk-1的连接运算构建候选k-项集Ck,k应该大于2 Lksub1:Lk-1,频繁k-1 -项集 """
Ck = set() list_Lksub1 = list(Lksub1)
for i in range(len(Lksub1)):
for j in range(1,len(Lksub1)):
l1 = list(list_Lksub1[i])
l2 = list(list_Lksub1[j])
l1.sort()
l2.sort()
if l1[0:k-2] == l2[0:k-2]: # 排序后做连接运算
Ck_item = list_Lksub1[i] | list_Lksub1[j]
if is_apriori(Ck_item,Lksub1): # 判断是否应该剪枝,是则不加入频繁k-项集
Ck.add(Ck_item)
return Ck
def generate_Lk_by_Ck(data_set,Ck,min_support,support_data):
""" 在Ck中执行删除操作,生成频繁k-项集Lk support_data: 频繁k-项集对应的支持度 """
Lk = set()
item_count = { }
for t in data_set:
for item in Ck: # 对Ck中的每个项计算支持度计数
if item.issubset(t):
if item in item_count:
item_count[item] += 1
else:
item_count[item] = 1
t_num = float(len(data_set))
for item in item_count: # 计算每个项的支持度
if(item_count[item]/t_num >= min_support): # 和最小支持度进行比较判断是否为频繁项
Lk.add(item)
support_data[item] = item_count[item] / t_num
return Lk
def generate_L(data_set,min_support):
""" 计算所有的频繁项集 """
support_data = { }
C1 = create_C1(data_set)
L1 = generate_Lk_by_Ck(data_set,C1,min_support,support_data) # 单独计算C1和L1
Lksub1 = L1.copy()
L = []
L.append(Lksub1)
i = 2
while(True): # 计算Ck
Ci = create_Ck(Lksub1,i)
Li = generate_Lk_by_Ck(data_set,Ci,min_support,support_data)
if len(Li) == 0: # 当Li为空集时退出循环
break;
Lksub1 = Li.copy()
L.append(Lksub1)
i+=1
return L,support_data
def generate_big_rules(L,support_data,min_conf):
""" 找出满足最小置信度的频繁项集 """
big_rules_list = [] # 强关联规则的列表
sub_set_list = [] # 子集列表
for i in range(0,len(L)): # 对于每个频繁项要产生其非空子集并计算置信度,大于最小置信度则将该强关联规则加入强关联规则的列表中

for freq_set in L[i]: # 频繁1项集里没有强关联
for sub_set in sub_set_list: # 频繁项集的子集一定也是频繁项集
if(sub_set.issubset(freq_set)): # 遍历生成频繁项集freq_set的每个子集
conf = support_data[freq_set] / support_data[sub_set]
big_rule = (sub_set,freq_set - sub_set,conf)
if conf >= min_conf and big_rule not in big_rules_list:
big_rules_list.append(big_rule)
sub_set_list.append(freq_set) # 频繁项集本身也是其子集
return big_rules_list
if __name__ == "__main__":
data_set = load_data_set()
L,support_data = generate_L(data_set,min_support=2/9)
big_rules_list = generate_big_rules(L,support_data,min_conf=0.7)
# 输出
for Lk in L:
print("="*50)
print("frequent " + str(len(list(Lk)[0])) + "-itemsets\tsupport")
print("="*50)
for freq_set in Lk:
print(freq_set,support_data[freq_set])
print("Big Rules:")
for item in big_rules_list:
print(item[0],"==>",item[1]," conf:",item[2])

运行结果

《关联规则算法——Apriori算法解析及Python实现》

实现参考:Apriori算法介绍(Python实现)


推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了多因子选股模型在实际中的构建步骤,包括风险源分析、因子筛选和体系构建,并进行了模拟实证回测。在风险源分析中,从宏观、行业、公司和特殊因素四个角度分析了影响资产价格的因素。具体包括宏观经济运行和宏经济政策对证券市场的影响,以及行业类型、行业生命周期和行业政策对股票价格的影响。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
author-avatar
何其何从丶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有