关联分析:Apriori算法,简单理解

0 问题

假设有一组购物数据如下,我们需要通过这份数据来挖掘不同商品之间的关联关系,找出强关联规则,从而对购买过某商品的用户推荐其可能也会购买的商品。

用户 购买的商品列表
用户1 A, B, C
用户2 A, B
用户3 B, C
用户4 A, B, C, D
用户5 B, C, D

1 关联分析的基本概念

①事务库:上面的整个表就是一个事务库。

②事务:事务库中的每一条记录就是一个事务。

③项和项集:每个商品就是一个项,多个商品的集合就是项集。

④关联规则:关联规则是形如 A → B 的表达式,A 称为前件,B 称为后件,该规则表示的意思是:某用户如果购买了商品 A,那么也会购买商品 B。

⑤支持度:项集的支持度定义为包含该项集的事务在事务库中所占的比例。例如项集  {A, B} 在事务库中出现了 3 次,而事务库总共有 5 条事务,那么项集 {A, B} 的支持度为 3/5。

⑥频繁项集:支持度大于人为设定的阈值(最小支持度)的项集为频繁项集。例如,假设最小支持度为 50%,那么项集 {A, B} 就为频繁项集。

⑦置信度:关联规则 A→B 的置信度等于在购买商品 A 的条件下购买商品 B 的概率。也就是条件概率 P(B|A)。

⑧强关联规则:置信度大于人为设定的阈值(最小置信度)的关联规则为强关联规则。

2 寻找强关联规则

2.1 步骤 1:设定最小支持度和最小置信度

假设最小支持度为 2/5,最小置信度为 4/5。

2.2 步骤 2:根据最小支持度找出所有的频繁项集

Apriori 算法的思路是,先计算长度为 1 的项集的支持度,找出其中的频繁项集;再将长度为 1 的频繁项集进行排列组合,并计算长度为 2 的项集的支持度,找出其中的频繁项集,以此类推。该算法的核心逻辑是,如果 {A, B} 不是频繁项集的话,那么 {A, B, C} 肯定也不是频繁项集。

计算过程:

1. 长度为 1 的项集

商品项集 包含该项集的事务数 支持度 频繁项集
A 3 3/5
B 5 1
C 4 4/5
D 2 2/5

2. 长度为 2 的项集

商品项集 包含该项集的事务数 支持度 频繁项集
A, B 3 3/5
A, C 2 2/5
A, D 1 1/5
B, C 4 4/5
B, D 2 2/5
C, D 2 2/5

3. 长度为 3 的项集

商品项集 包含该项集的事务数 支持度 频繁项集
A, B, C 2 2/5
A, B, D 1 1/5
A, C, D 1 1/5
B, C, D 2 2/5

4. 长度为 4 的项集

商品项集 包含该项集的事务数 支持度 频繁项集
A, B, C, D 1 1/5

因为关联规则至少在两个数据之间才可能存在,所以需要选择长度大于 1 的项集,因此,符合要求的频繁项集如下表:

商品项集 包含该项集的事务数 支持度 频繁项集
A, B 3 3/5
A, C 2 2/5
B, C 4 4/5
B, D 2 2/5
C, D 2 2/5
A, B, C 2 2/5
B, C, D 2 2/5

2.3 步骤 3:根据最小置信度发现强关联规则

关联规则 置信度 强关联规则
{A}→{B} 1
{B}→{A} 3/5
{A}→{C} 2/3
{C}→{A} 2/4
{B}→{C} 4/5
{C}→{B} 1
{B}→{D} 2/5
{D}→{B} 1
{C}→{D} 2/4
{D}→{C} 1
{A, B}→{C} 2/3
{C}→{A, B} 2/4
{A, C}→{B} 1
{B}→{A, C} 2/5
{A}→{B, C} 2/3
{B, C}→{A} 2/4
{B, C}→{D} 2/4
{D}→{B, C} 1
{B, D}→{C} 1
{C}→{B, D} 2/4
{B}→{C, D} 2/5
{C, D}→{B} 1

根据置信度计算,我们总共获得了9条强关联规则:

强关联规则 置信度
{A}→{B} 1
{B}→{C} 0.8
{C}→{B} 1
{D}→{B} 1
{D}→{C} 1
{A, C}→{B} 1
{D}→{B, C} 1
{B, D}→{C} 1
{C, D}→{B} 1

3 应用

根据我们找到的 9 条强关联规则,我们就可以向购买某商品的用户推荐强关联商品,从而实现精准营销。例如,向购买商品 A, C 的用户,推荐商品 B,就置信度而言,其购买可能性高达100%。

4 代码实现

# 事务库
transactions = [['A', 'B', 'C'], ['A', 'B'], ['B', 'C'], ['A', 'B', 'C', 'D'], ['B', 'C', 'D']]

# 使用apyori库
from apyori import apriori

# 计算强关联规则
rules = apriori(transactions, min_support=0.4, min_confidence=0.8)
results = list(rules)

# 规则展示
for i in results:
    for j in i.ordered_statistics:
        X = j.items_base # 前件
        Y = j.items_add  # 后件
        x = ','.join([item for item in X])
        y = ','.join([item for item in Y])
        if x != '':
            print(f'{x}→{y}')

关联分析:Apriori算法,简单理解_第1张图片

5 结语

有问题或者建议可以留言,如果对你有帮助的话,也可以关注我的公众号,谢谢。

关联分析:Apriori算法,简单理解_第2张图片 

你可能感兴趣的:(机器学习,算法)