【频繁模式挖掘】Apriori算法(附Python实现)

本文详细介绍了如何使用Apriori算法进行数据挖掘,包括关联规则的定义、Apriori算法的工作原理,以及如何在Python中实现和测试算法性能。通过实例展示了算法的执行过程和对不同数据集的响应情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验内容简介

该实验主要使用频繁模式关联规则进行数据挖掘,使用Apriori算法和Python语言来编写和设计程序,然后用不同规模的数据集来检验效果,最后分析和探讨实验结果,看其是否达到了理想的效果。

image-20240406095635642

二、算法说明

关联规则是形如 X→Y 的蕴涵表达式,其中 X 和 Y 是不相交的项集,即 X∩Y=∅。关联规则的强度可以用它的支持度(support)和置信度(confidence)来度量。计算公式如下:

支持度:support(A=>B) = P(A∪B),表示 A 和 B 同时出现的概率。

置信度:confidence(A=>B)=support(A∪B) / support(A),表示 A 和 B 同时出现的概率占 A 出现概率的比值。

强关联规则是指达到了最小支持度和最小置信度的关联规则。

Apriori算法作为频繁模式和关联规则中的第一个也是最经典的算法,直至现在它也仍然流行。它利用逐层搜索的迭代方法找出数据库中项集的关系,以形成规则,其过程由连接(类矩阵运算)与剪枝(去掉那些没必要的中间结果)组成。该算法中项集的概念即为项的集合。包含 K 个项的集合为 k 项集。项集出现的频率是包含项集的事务数,称为项集的频率。如果某项集满足最小支持度,则称它为频繁项集

三、算法分析与设计

了解完算法的基本原理后,现在开始真正实现该算法。首先需要读取最小支持度,读取数据集。这里的数据集可大可小,我用Python中的字典来表示数据集,既方便又不容易出错。然后是频繁模式的存储,这里使用列表,前面k个元素表示具体的事务,最后一个元素表示前面元素的组合在数据集中出现的错误。

运用面向对象的思想,把Apriori算法封装成一个类。首先写构造函数进行初始化:

def __init__(self, support: float, data: dict):
    """
        初始化
        :param support: 支持度
        :param data: 数据集
        """
    self.support = support
    self.data = data
    self.FirstList = []  # 第一轮扫描后的频繁模式
    self.FinalList = []  # 最后的频繁模式
    self.FinalList_noValue = []  # 最后的频繁模式(不包括频率)
    self.allList = []  # 所有的频繁模式

自定义几个列表(存放频繁模式)、初始化支持度和数据集。

接着进行第一轮扫描,把出现次数达到最小支持度要求的1项集先提取出来。具体方式就是通过遍历数据集一个一个找。然后建立一个字典,把每一项的名字作为关键字,再把这一项出现的次数作为值。

def findFirst(self):
    dict = {
   }
    for value in self.data.values():
    for i in value:
    if i in dict.keys():
    dict[i] += 1
    else:
    dict[i] = 1
    for key, value in dict.items():
    if value >= self.support * len(self.data):
    self.FirstList.append(key)
    # 进行后面的扫描
    self.findMore()

接着进行后续的扫描,后续的扫描的过程大体上相同,于是在findMore函数中就可以使用递归,简化代码。基本思路是将上一次遍历的k-1项集来合成k项集,这里使用集合的并运算,同时控制长度,符合要求后转换成列表进行排序(不排序的话内部会呈乱序排列,因为集合没有顺序),然后再转换成元组(元组才能通过哈希作为字典的关键字)返回。接着跟第一次扫描的思路大体相同,挨个遍历,获得频繁项集。不停地递归下去,直到下一个返回的列表为空,这时这一次获得的就是最大频繁项集。

def findMore(self, k=2):
    """
    进行第二次至第k次扫描
    """
    # 具体代码实现较长,详见附录

最后得到结果后当然要进行输出,这里也把输出结果简单地封装了一下。主要输出结果有最大频繁项集和支持度最高的频繁项集。

def __str__(self):
    # 输出运算符重载,也就是输出最终信息
    if self.allList:  # 验证是否为空
    self.allList.sort(key=
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪个编程语言更好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值