第11章:使用Apriori算法进行关联分析(计算频繁项集)

本文旨在介绍如何使用Apriori算法进行关联分析,寻找数据集中频繁出现的项集。通过设定最小支持度阈值(0.8),算法能够找出数据中相互关联的物品集合。Apriori原理利用了频繁项集的性质,避免了生成所有可能组合的低效过程,从而高效地确定频繁项集。代码实现进一步展示了这一过程。

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

目的:找到数据集中事务的关系,如超市中经常一起出现的物品集合,想找到支持度超过0.8的所有项集

概念:

频繁项集:指经常出现在一起的物品集合;

关联规则:指两个物品之间可能存在很强的关系,如一个人买了什么之后很大可能会买另一种东西;

支持度:数据集中包含该项集的记录所占的比例;保留满足最小支持度的项集即为频繁项集;

可信度:针对诸如{尿布}-{葡萄酒}这样的关联规则产生的,定义为支持度({尿布,葡萄酒})/支持度({尿布})

Apriori原理:

想找到支持度超过0.8的所有项集,一般做法是生成所有可能的组合,对每种组合统计其出现的频繁程度,当物品较多时,做法很慢。Apriori帮助减少可能感兴趣的项集数,原理是如果某个项集是频繁的,则它的所有子集也是频繁,但是反过来,如果一个项集是非频繁的,则它的所有超集也是非频繁的。因此该算法从最简单的一个元素开始,计算一个元素的支持度,如果支持度小于最小支持度,则去除该元素;然后将两个元素结合,计算两个元素的支持度,仍然小于最小支持度则去除,以此类推找到所有可能的大于最小支持度的元素组合。

代码:


def apriori(dataSet,minSupport=0.5):
    #创建单个元素列表
    C1=createC1(dataSet)

    #map必须转化为list才能使用
    D=list(map(set,dataSet))

    #去除支持度小于最小支持度的单个元素,返回大于支持度的单个元素列表以及所有元素的支持度
    L1,supportData=scanD(D,C1,minSupport)

    #L是一
import pandas as pd def loadData(): # 加载数据 data = pd.read_excel(';D:\;\;超市销售关联.xlsx';) # , encoding=';utf-8'; inputList = data.values.tolist() # 将表格中的 T 和 F 转换为 商品名称,A——F为商品编号 header = [';A';, ';B';, ';C';, ';D';, ';E';, ';F';, ';G';, ';H';, ';I';, ';J';, ';K';] itemList = [] for item in inputList: cur = [] for i in range(len(item)): if item[i] == ';T';: cur.append(header[i]) itemList.append(cur) return itemList # 生成频繁一项集 def create_C1(data_set): C1 = set() for t in data_set: for item in t: item_set = frozenset([item]) C1.add(item_set) return C1 # 判断是否满足apriori基本性质 def is_apriori(Ck_item, Lksub1): ";";"; 判断频繁候选k项集是否满足Apriori性质 输入: Ck_item: Ck中包含所有频繁项的候选k-项集 Lksub1: Lk-1, 一个包含所有频繁候选(k-1)-项集的集合 输出: True: 满足 False: 不满足 ";";"; for item in Ck_item: sub_Ck = Ck_item - frozenset([item]) if sub_Ck not in Lksub1: return False return True def create_Ck(Lksub1, k): ";";"; 创建Ck,包含所有频繁候选k项集 by Lk-1';s own connection operation. 输入: Lksub1: Lk-1, 包含所有频繁候选(k-1)项集 k: 频繁项集项目编号 输出: Ck: 所有频繁候选k项集 ";";"; Ck = set() len_Lksub1 = len(Lksub1) list_Lksub1 = list(Lksub1) for i in range(len_Lksub1): for j in rangeƑ, 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] # pruning if is_apriori(Ck_item, Lksub1): Ck.add(Ck_item) return Ck def generate_Lk_by_Ck(data_set, Ck, min_support, support_data): ";";"; 从Ck中删除不频繁的生成Lk. 输入: data_set: 交易数据库 Ck: 候选k项集 min_support: 最小支持度 support_data: 频繁项集+支持度组成数据字典 输出: Lk: 所有频繁项集. ";";"; Lk = set() item_count = {} for t in data_set: for item in Ck: if item.issubset(t): if item not 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
最新发布
04-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值