暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

关联规则-Apriori 算法

小甜菜Pro 2023-05-08
561

Apriori 算法是一种用于挖掘关联规则的经典算法,由 R. Agrawal 和 R. Srikant 在1994年提出。Apriori 算法的主要思想是如果一个项集是频繁出现的,那么它的子项集一定是频繁出现的。基于这个思想,该算法通过逐层扫描数据集、计算支持度来发现频繁项集,然后再利用频繁项集构建关联规则。

   基本原理

Apriori 算法的主要思想是通过逐层扫描数据集、计算支持度来发现频繁项集,再构建关联规则。

首先介绍关于算法的一些定义:

1、设为数据集,为所有项的集合,则一个包含个项的集合称为,其中;

2、满足最小支持度阈值的称为频繁

3、表示项集在数据集中出现的支持度;

4、关联规则为,其中,且,表示有置信度为的关联规则,其中

Apriori 算法流程与公式如下:

设:为候选的集合,为频繁的集合,为最小支持度阈值,则:

1、生成

2、计算每个候选中出现的频次,筛选出

3、对于,利用频繁生成

4、计算每个候选中的出现频次,筛选出

5、重复步骤 3 和 4,直至没有新的频繁被发现。

Apriori 算法通过上述步骤挖掘出频繁项集,再基于频繁项集构建关联规则。该算法的时间复杂度较高,因为需要遍历所有项集,但清晰而简洁的思想使其成为经典算法之一。

   Python 实现 Apriori 算法

可以使用 Python 中的 mlxtend 库来实现 Apriori 算法,具体步骤如下:

1、准备数据

transactions = [['Milk''Bread''Beer'], ['Milk''Bread''Diaper'], ['Milk''Beer'], ['Milk''Bread''Eggs'], ['Bread''Diaper''Beer'], ['Milk''Diaper''Beer'], ['Milk''Bread'], ['Milk''Eggs'], ['Bread''Eggs'], ['Beer''Diaper'], ['Milk''Cookies'], ['Bread'], ['Milk''Diaper'], ['Milk''Bread''Meat'], ['Milk''Beer''Meat'], ['Eggs'], ['Milk''Cheese''Beer'], ['Beer'], ['Milk''Bread''Cookies'], ['Milk''Cheese']]

数据集为一个列表数据,其中每个元素表示一笔交易,共有20笔交易数据,每笔交易包含了购买的哪些商品。

2、使用 TransactionEncoder 对数据进行编码

import pandas as pd
from mlxtend.preprocessing import TransactionEncoder

te = TransactionEncoder()
data = te.fit_transform(transactions)
df = pd.DataFrame(data, columns=te.columns_)

使用 TransactionEncoder 对数据进行编码,将列表中的每个商品都转换为一个二进制变量,表示该商品是否出现在该笔交易中。同时将编码后的数据转换为 DataFrame 类型,其中每行表示每笔交易,每列表示不同的商品。

3、执行 Apriori 算法,获取频繁项集

from mlxtend.frequent_patterns import apriori

frequent_items = apriori(df, min_support=0.3, use_colnames=True)

apriori 函数用于生成频繁项集,其中,参数 min_support 表示最小支持度阈值,即只有出现次数占比超过该值的商品组合才会被认为是频繁项集;参数 use_colnames 表示将列名转换为具体商品名称。

4、根据频繁项集生成关联规则

from mlxtend.frequent_patterns import association_rules

rules = association_rules(frequent_items, min_threshold=0.6)

association_rules 函数用于根据频繁项集生成关联规则,其中参数 min_threshold 表示最小置信度阈值,即只有置信度达到该值的关联规则才会被保留。

5、输出频繁项集和关联规则

print("频繁项集: \n", frequent_items)
print("关联规则: \n", rules)

输出结果如下:

频繁项集: 
    support       itemsets
0     0.40         (Beer)
1     0.45         (Bread)
2     0.70         (Milk)
3     0.30         (Bread, Milk)
关联规则: 
   antecedents consequents  antecedent support  consequent support  support     confidence      lift      leverage  conviction  zhangs_metric  
0     (Bread)      (Milk)           0.45                 0.7          0.3       0.666667      0.952381     -0.015      0.9        -0.083333  

完整代码如下:

import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules

transactions = [['Milk''Bread''Beer'], ['Milk''Bread''Diaper'], ['Milk''Beer'], ['Milk''Bread''Eggs'], ['Bread''Diaper''Beer'], ['Milk''Diaper''Beer'], ['Milk''Bread'], ['Milk''Eggs'], ['Bread''Eggs'], ['Beer''Diaper'], ['Milk''Cookies'], ['Bread'], ['Milk''Diaper'], ['Milk''Bread''Meat'], ['Milk''Beer''Meat'], ['Eggs'], ['Milk''Cheese''Beer'], ['Beer'], ['Milk''Bread''Cookies'], ['Milk''Cheese']]

te = TransactionEncoder()
data = te.fit_transform(transactions)
df = pd.DataFrame(data, columns=te.columns_)

frequent_items = apriori(df, min_support=0.3, use_colnames=True)

rules = association_rules(frequent_items, min_threshold=0.6)

print("频繁项集: \n", frequent_items)
print("关联规则: \n", rules)

   结语

Apriori算法是一种经典的关联规则挖掘算法,通过逐层扫描数据集、计算支持度来发现频繁项集,并利用频繁项集构建关联规则。其思想简洁明了,在实际应用中具有广泛的应用。对于更大型的数据集,可以使用Apriori算法的变种算法以降低其时间复杂度,提升效率。

文章转载自小甜菜Pro,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论