【机器学习】关联规则与Apriori算法

关联规则

  日常事务中,我们留意到事务中有些项目往往同时发生,于是开始挖掘这些项目之间的关联。要确定哪些事务项目有关联,我们需要给出合理的关联规则和算法。
  关联规则中重要的概念有支持度和置信度。如果事务项目或者事务项目集合A发生了, 导致事务项目或者事务项目集合B发生,那么认为A->B。假设事务数量为M,事务项目或者事务项目集合发生次数为k,那么支持度为 support=kM 。假设事务项目或者事务项目集 AB 出现次数为 N1 ,B出现次数为 N2 ,那么置信度为 confidence=N2N1 。如果支持度太小,说明该项事务项目出现次数太少,发生的情况有极大地偶然性,不具有统计研究价值;如果置信度太小,说明A和B之间并没有什么关联。只有支持度和置信度都大于给定的标准,才能说明A-> AB 存在关联。
  关联规则的计算瓶颈主要在寻找支持度符合条件的事务项目集。计算支持度完成后,我们已经获取了所有满足支持度事务项目集出现的次数,因此置信度计算非常简单。符合支持度条件的事务项目集合称为频繁集。频繁集的一个重要特征是:频繁集的所有非空子集都是频繁集

Apriori算法

  Apriori算法是找到所有的频繁集的简单算法。频繁集需要按照统一规则排序以便进行比较。我们用归纳描述所有频繁集的特征:
  

  • 只含有一个元素的事务项目集合,如果出现次数大于阈值,则是一元频繁集
  • 设N元素事务项目集合是N元频繁集,那么其N-1元子集全部是N-1元频繁集。
  • 如果N元频繁集存在且有序,其子集N-1元频繁有序集中必有两个集合,只有最后一位不同,且两个集合的并集为该N元频繁集。因此找到N-1元频繁集之后,可以通过任意两个只有最后一位不同的N-1元频繁集的求并操作,来找到所有的N元候选频繁集。

找到所有的一元频繁集之后,我们从N=2开始构建频繁集,2元频繁候选集由一元频繁集组合构成,然后遍历所有事务,判断2元候选频繁集的支持度是否满足阈值,构建2元频繁集;然后用2元频繁集组合构建3元候选频繁集,判断3元候选集的所有2元子集是否频繁集,然后遍历所有事务计算支持度,找到3元频繁集;依次递推,可以保证N元频繁集的所有非空子集都是频繁集。
  举例如下。设事务T为:
1,2,3
1,2,4
1,3,4,6
1,2,3,5
1,3,5
2,4,5
1,2,3,4,6
  一共7组事务,支持度设为最少出现3次,置信度设为5/7。其中1元频繁集为1:6,2:5,3:5,4:4,5:3,冒号后面的数字表示出现次数。用1元频繁集构建2元频繁集为12,13,14,15,23,24,25,34,35,45,其中满足支持度为12:4,13:5,14:3,23:3,24:3。现在构建3元频繁集,其中12、13、14,以及23、24只有最后一位不同,组成3元候选频繁集123,124,234,其中234的子集34不是频繁集,所以排除;满足支持度只有123:3。所有的频繁集为1:6,2:5,3:5,4:4,5:3,12:4,13:5,14:3,23:3,24:3,123:3。
  然后我们从频繁集中找关联规则。满足置信度条件的有:1->13:5/6,3->13:1,4->14:3/4,12->123:3/4,23->123:1
  Apriori算法实现简单,但是计算时需要多次遍历事务;验证所有N-1元候选集是否频繁集是个繁琐的过程。当事务数目极大,计算量会无法承受。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中有很多关联规则算法的调库,其中包括了Apriori算法。使用Apriori算法需要用到Python中的mlxtend库,它是一个基于Python的机器学习库,提供了许多用于数据预处理、模型选择和评估等功能的工具。 以下是使用mlxtend库实现Apriori算法的代码示例: ```python from mlxtend.frequent_patterns import apriori from mlxtend.preprocessing import TransactionEncoder import pandas as pd # 读入数据 data = [['bread', 'milk', 'vegetable', 'fruit', 'eggs'], ['noodle', 'beef', 'vegetable', 'fruit', 'eggs'], ['bread', 'noodle', 'vegetable', 'beef'], ['noodle', 'milk', 'fruit', 'beef', 'eggs'], ['bread', 'milk', 'fruit', 'beef', 'eggs']] # 将数据转换成 TransactionEncoder 可以接受的格式 te = TransactionEncoder() te_ary = te.fit(data).transform(data) # 将数据转换成 pandas.DataFrame 格式 df = pd.DataFrame(te_ary, columns=te.columns_) # 使用 Apriori 算法生成频繁项集 frequent_itemsets = apriori(df, min_support=0.6, use_colnames=True) # 输出频繁项集 print(frequent_itemsets) ``` 在上述代码中,我们使用了一个包含5个样本的数据集作为示例数据,通过调用Apriori算法生成频繁项集。其中,`min_support`参数指定了支持度的最小值,`use_colnames`参数指定了输出结果使用列名而非原始项集。运行上述代码,可以得到以下输出: ``` support itemsets 0 0.6 (beef) 1 0.8 (bread) 2 0.6 (eggs) 3 0.8 (fruit) 4 0.6 (milk) 5 0.6 (noodle) 6 0.6 (vegetable) 7 0.6 (bread, vegetable) 8 0.6 (fruit, vegetable) 9 0.6 (milk, eggs) 10 0.6 (noodle, beef) 11 0.6 (fruit, milk, eggs) ``` 在输出结果中,每一行代表一个频繁项集,其中`support`列表示该频繁项集在数据集中出现的支持度,`itemsets`列表示该频繁项集的项集。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值