如何用Python挖掘“啤酒和尿布”的关系?(Apriori算法挖掘关联规则)

一、什么是关联规则挖掘?

“啤酒与尿布”的故事大家都听过吧,一些年轻的父亲在去超市给孩子买尿布的时候,会顺便给自己买点啤酒,超市发现这个规律之后,就把啤酒和尿布的货架放在一起,这次改动明显增加了超市的销售额。
啤酒和尿布两者之间就存在着关联规则。
那么学会挖掘这些关联规则,用处是非常大的。

二、规则度量:支持度和置信度

支持度就是两个事务同时发生的概率。
s u p p o r t ( A , B ) = P ( A B ) support(A, B) = P(A B) support(A,B)=P(AB)

[注1]   ~   P ( A B ) P(AB) P(AB)就是A和B同时出现的概率。(下同)

置信度就是
c o n f i d e n c e ( A ⇒ B ) = P ( B ∣ A ) = P ( A B ) / P ( A ) confidence(A\Rightarrow B)=P(B|A)=P(AB)/P(A) confidence(AB)=P(BA)=P(AB)/P(A)
举个栗子
路人甲购买了:商品A、B、C;
炮灰乙购买了:商品A、C;
流氓丙购买了:商品A、D;
土匪丁购买了:商品B、E、F。
s u p p o r t ( A , B ) = P ( A B ) = 1 / 4 = 0.25 support(A, B) = P(A B)=1/4=0.25 support(A,B)=P(AB)=1/4=0.25
s u p p o r t ( A , C ) = P ( A C ) = 2 / 4 = 0.5 support(A, C) = P(AC)=2/4=0.5 support(A,C)=P(AC)=2/4=0.5
c o n f i d e n c e ( A ⇒ B ) = P ( B ∣ A ) = P ( A B ) / P ( A ) = 1 / 3 confidence(A\Rightarrow B)=P(B|A)=P(AB)/P(A)=1/3 confidence(AB)=P(BA)=P(AB)/P(A)=1/3
c o n f i d e n c e ( A ⇒ C ) = P ( C ∣ A ) = P ( A C ) / P ( A ) = 2 / 3 confidence(A\Rightarrow C)=P(C|A)=P(A C)/P(A)=2/3 confidence(AC)=P(CA)=P(AC)/P(A)=2/3
我们在算法中一般会设置两个阈值:最小支持度和最小置信度。

注2】对于最小支持度 s u p p o r t support support,取值范围为 [ 0 ,   1 ] [0, ~1] [0, 1],我们一般用 s u p p o r t ∗ n support * n supportn代替 s u p p o r t support support n n n就是源数据集的条目数(上面例子四组商品, n = 4 n=4 n=4),这样做的好处就是可以减少运算,判断是否符合最小支持度时,根据项集的计数进行比较就行了。

例如我们设最小支持度 = 0.4,最小置信度 = 0.8。
那么规则 A , B {A,B} A,B因为不满足最小支持度而舍弃;
规则 A ⇒ B A\Rightarrow B AB和规则 A ⇒ C A\Rightarrow C AC因为不满足最小置信度而舍弃。

三、k-项集、频繁项集与强关联规则

k-项集:包含k个项的集合。

  • {啤酒,尿布,奶粉}是个3-项集。

频繁项集:满足最小支持度要求的项集。(算法第一步挖掘的东西)

强关联规则:满足最小支持度和最小置信度的规则。(算法最终得到东西)

四、Apriori算法

4.1 概述

  1. Apriori算法:利用频繁项集性质的先验知识(prior knowledge),通过逐层搜索的迭代方法,即将k-项集用于探察(k+1)-项集,来穷尽数据集中的所有频繁项集(通过先验知识挖掘未知知识)
  2. Apriori性质:频繁项集的所有非空子集也必须是频繁的。(模式不可能比A更频繁的出现,即A与B的非空交集不可能比A大,只能被包含)

4.2 算法

在这里插入图片描述

★FIRST. 挖掘频繁项集
  1. 扫描数据集,生成单个物品的所有项集(1-项集),并根据在源数据集中出现的次数计数,如下图表C1;
  2. 根据最小支持度,对表 C i C_i Ci进行筛选,去除掉小于最小支持度的项集,留下的就是频繁项集,即表 L i L_i Li
  3. 利用 L i L_i Li表,进行连接,有原来的k-项集,连接扩展为(k+1)-项集,记为表 C k + 1 C_{k+1} Ck+1
  4. 重复执行2、3步,直到不可扩展,所有的 L L L表中的项集,即为频繁项集。

以图中的数据为例,展示代码结果:

1 所有的频繁项集:
['A']   支持度: 2
['C']   支持度: 3
['B']   支持度: 3
['E']   支持度: 3
['E', 'B']   支持度: 3
['B', 'C']   支持度: 2
['E', 'C']   支持度: 2
['A', 'C']   支持度: 2
['E', 'B', 'C']   支持度: 2
★SECOND. 挖掘强关联规则

同时满足最小支持度和最小置信度的才是强关联规则。
上面已经得到满足最小支持度的频繁项集了,那么我们可以直接从频繁项集入手,找出满足最小置信度的规则,具体步骤如下:

  1. 对于每个频繁项集 l l l ,产生 l l l 的所有非空子集;
  2. 对于每个子集 s s s ,如果 s u p p o r t ( l ) s u p p o r t ( s ) ≥ m i n _ c o n f i d e n c e \frac{support(l)}{support(s)} \geq min\_confidence support(s)support(l)min_confidence
    则有规则: s → ( l − s ) s \rightarrow (l-s) s(ls)
2 强关联规则:
['B'] -> ['E'] 置信度为: 1.0
['E'] -> ['B'] 置信度为: 1.0
['C'] -> ['B'] 置信度为: 0.6666666666666666
['B'] -> ['C'] 置信度为: 0.6666666666666666
['C'] -> ['E'] 置信度为: 0.6666666666666666
['E'] -> ['C'] 置信度为: 0.6666666666666666
['A'] -> ['C'] 置信度为: 1.0
['C'] -> ['A'] 置信度为: 0.6666666666666666
['C'] -> ['E', 'B'] 置信度为: 0.6666666666666666
['B'] -> ['E', 'C'] 置信度为: 0.6666666666666666
['E'] -> ['B', 'C'] 置信度为: 0.6666666666666666
['E', 'B'] -> ['C'] 置信度为: 0.6666666666666666
['B', 'C'] -> ['E'] 置信度为: 1.0
['E', 'C'] -> ['B'] 置信度为: 1.0

4.3 核心代码

  1. 首先获取C1表,直接从原数据集中把单个元素分离出来并计数。
'''
1. 获取C1
'''
def get_C1(dataset):
    C1 = []  # 使用list存放元素
    for datas in dataset:   # 遍历数据集的每一行
        for data in datas:  # 遍历每一行的所有元素
            if [data] not in C1: # 如果C1中还没有存放这个元素,就把它放入C1
                C1.append([data])
    # frozenset是冻结的集合,它是不可变的,存在哈希值。
    return list(map(frozenset, C1)) # 将[['A'], ['B']...]转换为[(frozenset({'A'}), (frozenset({'B'})...]的形式
  1. 计算支持度,并将小于最小支持度的数据舍弃
'''
2. 计算支持度,并进行剪枝处理
'''
def calc_support_and_drop(dataset, C, min_support):
    '''
    2.1 计算支持度
    '''
    support_dict = {} # 存放各元素的支持度,例:{['A']:1, ['B']:4 ...} 表示['A']的支持度为1,['B']的支持度为4
    for Cx in C: # 遍历C
        for datas in dataset: # 遍历dataset
            if Cx <= set(datas): # 判断Cx 是否为datas的子集,就是当前表C中的一行元素Cx能否在dataset中找到
                # 若是其子集,说明原数据集dataset中这一行中有这组元素
                if Cx not in support_dict: # 判断Cx这组合是否在dict中
                    support_dict[Cx] = 1   # 若不在,将它的支持度初始化为1
                else:
                    support_dict[Cx] += 1  # 若在,支持度加1即可
    '''
    2.2 剪枝处理
    '''
    data_list = [] # [['A'], ['B']...]
    for k, v in support_dict.items(): # 遍历一下我们上面获得的支持度字典
        if v >= min_support: # 如果该组合的支持度不小于最小支持度
            data_list.append(k) # 将改数据放入结果中
    return data_list, support_dict # 返回满足支持度的列表和支持度字典

  1. 两层循环,两两组合,只有一个元素不相同时,进行合并,并使用Apriori性质进行剪枝(频繁项集的所有子集必须是频繁的)
'''
3. 连接
'''
def merge(Lk, k):
    data_set = set() # 存放所有组合的数据(未剪枝)
    data_list = [] # 存放剪枝后的数据
    # 两层循环,找到两两组合
    for i in range(len(Lk)-1): # 外循环,从0 ~ len(Lk)-1
        for j in range(i+1, len(Lk)): # 内循环,从i到len(Lk)
            # 两个集合Lk[i]和Lk[j]做差,如果差的长度为1,则说明他们只有一个元素不相同
            if len(Lk[i] - Lk[j]) == 1:
                # 取到他们的交集
                data_set.add(Lk[i].union(Lk[j]))
    # 使用Apriori性质剪枝:频繁项集的所有子集必须是频繁的
    for data in data_set:
        count = 0 # 一个计数器
        for Lkx in Lk:
            if Lkx.issubset(data): # 如果Lkx是data的子集,count+=1
                count += 1
        if count == k+2: # 如果count=k+2,说明data的所有非空子集都都是频繁的
            data_list.append(data)
    return data_list # 返回形式:[['A', 'B'], ['B', 'C']...]

  1. 重复执行步骤3,直到满足退出条件(最后表中只有一个或没有频繁项集)
  2. 检查置信度,得到强关联规则。
'''
5. 检查置信度,得到强关联规则。
目的:计算di的置信度 / dj的置信度,其中dj为di的非空子集。
'''
def get_rules(L, support_dict, min_conf):
    relus = {} # 存放强关联结果,以元组形式表示[(A, B), (C, D)...],(A, B)表示 A->B
    for i in range(1, len(L)):          # 循环1:遍历L列表
        for di in L[i]:                 # 循环2:遍历L[i],L[i] = [[A, B, C], [A, C, D]...]
            for j in range(len(di)-1):  # 循环3:0 ~ len(di)-1,例 di=[A, B, C],则需要找长度小于3的子集,即0~2的
                for dj in L[j]:         # 循环4:找长度为j的
                    if dj.issubset(di): # 如果长度为j的dj是di的子集,则判断置信度
                        conf_ij = support_dict[di] / support_dict[dj] # 计算置信度
                        if conf_ij >= min_conf: # 如果support_dict[A并B] / support_dict[B] >= min_conf:
                            relus[(dj, di-dj)] = conf_ij # 得到规则 B -> A
    return relus # 返回强关联规则

4.3 代码测试及运行结果展示

测试样例:

IDitems
0 I 1 , I 2 , I 5 I1,I2,I5 I1,I2,I5
1 I 2 , I 4 I2,I4 I2,I4
2 I 2 , I 3 I2,I3 I2,I3
3 I 1 , I 2 , I 4 I1,I2,I4 I1,I2,I4
4 I 1 , I 3 I1,I3 I1,I3
5 I 2 , I 3 I2,I3 I2,I3
6 I 1 , I 3 I1,I3 I1,I3
7 I 1 , I 2 , I 3 , I 5 I1,I2,I3,I5 I1,I2,I3,I5
8 I 1 , I 2 , I 3 I1,I2,I3 I1,I2,I3

运行结果:
在这里插入图片描述

4.4   −   −   − ~-~-~-    

  • 可直接运行代码之后会给出
  • 如博客中存在错误请您评论或者私信
  • 如有其它地方我可以帮到您的也可评论或者私信
  • 如本博客对您有些许帮助,劳烦点一下赞,万分感谢
  • 最后感谢您的浏览
  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
尿布啤酒的故事 这是一个老故事, 但每次看总是能从中想到点什么.在一家超市里,有一个有趣的现象:尿布啤酒赫然摆在一起出售。但是这个奇怪的举措却使尿布啤酒的销量双双增加了。这不是一个笑话,而是发生在美国沃尔玛连锁店超市的真实案例,并一直为商家所津津乐道。原来,美国的妇女们经常会嘱咐她们的丈夫下班以后要为孩子买尿布。而丈夫在买完尿布之后又要顺手买回自己爱喝的啤酒,因此啤酒尿布在一起购买的机会还是很多的。 是什么让沃尔玛发现了尿布啤酒之间的关系呢? 研究“啤酒尿布”关联的方法就是购物篮分析,购物篮分析曾经是沃尔玛秘而不宣的独门武器,购物篮分析可以帮助我们在门店的销售过程中找到具有关联关系的商品,并以此获得销售收益的增长! 商品相关性分析是购物篮分析中最重要的部分,购物篮分析英文名为market basket analysis(简称MBA,当然这可不是那个可以用来吓人的学位名称)。在数据分析行业,将购物篮的商品相关性分析称为“数据挖掘算法之王”,可见购物篮商品相关性算法吸引人的地方,这也正是乐此不疲的围绕着购物篮分析进行着研究和探索的根本原因。 下面每一行是一个购物小票,直到遇到五个零00000,输入序列终止,每个字母表示一种商品(字母区分大小写,即a 和A代表不同的产品),请分析哪两个种产品的销售相关性最高: 样例输入: AABZXY BMNY CD CBYPQ BWVCY 00000 输出(字幕顺序按ASC码升序排列): BY
### 回答1: Apriori算法是一种常用的关联规则挖掘算法,用于发现数据集中项与项之间的频繁关联关系Apriori算法的实现可以使用Python编程语言来完成。以下是一个简单的示例: 首先,需要准备一个数据集。可以用一个列表来表示数据集,每个元素都是一个集合,表示一个事务,其中每个项是数据集中的一个元素。例如,下面是一个简单的数据集: dataset = [ {'牛奶', '尿布', '啤酒'}, {'尿布', '洋葱', '洗发水', '啤酒'}, {'牛奶', '尿布', '洋葱', '啤酒'}, {'牛奶', '洋葱', '啤酒'}, {'尿布', '洗发水', '啤酒'}, ] 然后,可以使用pyfpgrowth库中的函数来实现Apriori算法。该库提供了简单且高效的算法实现。可以使用以下代码来执行算法: from pyfpgrowth import find_frequent_patterns from pyfpgrowth import generate_association_rules # 设定最小支持度 min_support = 2 # 寻找频繁项集 frequent_patterns = find_frequent_patterns(dataset, min_support) # 根据频繁项集生成关联规则 association_rules = generate_association_rules(frequent_patterns, 0.7) 这里通过设置min_support参数来控制支持度的最小值,可以根据需求进行调整。生成的关联规则可以通过设置confidence_threshold参数来控制置信度的最小值。 最后,可以打印出频繁项集和关联规则的结果: print("频繁项集:") for itemset, support in frequent_patterns.items(): print(itemset, ":", support) print("关联规则:") for antecedent, consequent, confidence in association_rules: print(list(antecedent), "->", list(consequent), ":", confidence) 这样就完成了Apriori关联规则算法的Python实现。 总之,Apriori关联规则算法是一种常用的数据挖掘算法,可以使用Python的pyfpgrowth库来实现。通过设置支持度和置信度的阈值,可以发现频繁项集和关联规则。 ### 回答2: Apriori 关联规则算法是一种常用的数据挖掘算法,用于发现数据集中的频繁项集和关联规则Python中有多种库可以实现Apriori算法,例如mlxtend和apyori库。 mlxtend是一个常用的机器学习库,它提供了一个apriori函数,可以用于实现Apriori算法。在使用mlxtend库时,需要先将数据集转化为适合于算法的形式,一般为列表的列表。然后,通过调用apriori函数,并设置支持度阈值,即可得到频繁项集。 apyori是另一个常用的库,用于实现Apriori算法。它提供了一个apriori函数,可以直接对数据集进行操作。在使用apyori库时,可以通过设置支持度和置信度阈值来筛选频繁项集和关联规则。 下面是一个示例代码,展示了如何使用mlxtend和apyori库进行Apriori算法的实现: 使用mlxtend库: ``` from mlxtend.frequent_patterns import apriori #构建频繁项集 frequent_itemsets = apriori(df, min_support=0.1, use_colnames=True) #基于频繁项集构建关联规则 rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.5) ``` 使用apyori库: ``` from apyori import apriori #将数据集转化为列表的列表 transactions = [['牛奶', '洋葱', '肉豆蔻', '芸豆', '鸡蛋', '酸奶'], ['鸡蛋', '洋葱', '芸豆', '肉豆蔻', '酸奶'], ['牛奶', '肉豆蔻', '芸豆', '酸奶'], ['牛奶', '芸豆', '鸡蛋', '酸奶'], ['牛奶', '洋葱', '肉豆蔻', '芸豆', '鸡蛋']] #设置支持度和置信度阈值 min_support = 0.3 min_confidence = 0.6 #运行Apriori算法并输出结果 results = list(apriori(transactions, min_support=min_support, min_confidence=min_confidence)) ``` 通过以上示例代码,我们可以很方便地使用Python实现Apriori关联规则算法。 ### 回答3: Apriori算法是一种常用的关联规则挖掘算法,用于发现数据集中项之间的频繁关联关系。它的核心思想是通过候选项集的递归产生和剪枝来寻找频繁项集。 Python提供了多种实现Apriori算法的库,其中最常用的是mlxtend库。 使用mlxtend库实现Apriori算法需要先安装该库,可以通过pip命令进行安装。 安装完毕后,可以导入mlxtend库的apriori模块。使用该模块的apriori函数可以传入数据集和最小支持度参数来进行频繁项集的挖掘和生成关联规则。 具体实现步骤如下: 1. 导入mlxtend库的apriori模块:`from mlxtend.frequent_patterns import apriori` 2. 加载数据集,可以将数据集存储为一个列表,每个元素是一条交易记录,每条交易记录是一个集合,表示该交易包含的项。 3. 调用apriori函数,传入数据集和最小支持度参数。最小支持度参数表示频繁项集在整个数据集中出现的最小比例。 具体代码如下: ```python from mlxtend.frequent_patterns import apriori # 加载数据集 dataset = [['A', 'B', 'C'], ['B', 'D'], ['C', 'D', 'E'], ['A', 'C', 'D', 'E']] # 挖掘频繁项集 frequent_itemsets = apriori(dataset, min_support=0.5) # 打印频繁项集 print(frequent_itemsets) ``` 以上代码中,待挖掘的数据集包含4条交易记录,每个交易记录是一个集合。最小支持度参数`min_support`设置为0.5,表示频繁项集在所有交易记录中至少出现一半以上。 运行上述代码,可以得到频繁项集的输出结果。 通过上述代码,我们可以在Python中使用mlxtend库的apriori函数来实现Apriori关联规则算法。使用这个函数可以方便地进行频繁项集的挖掘和生成关联规则,从而帮助我们发现数据集中的有意义的关联关系

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值