微信登录

关联规则挖掘 - Apriori 算法 - 发现频繁项集与规则

关联规则挖掘 - Apriori 算法 - 发现频繁项集与规则

一、引言

在当今信息爆炸的时代,海量的数据蕴含着丰富的价值。关联规则挖掘作为数据挖掘的一个重要分支,旨在从数据中发现不同项目之间的关联关系。例如,在超市购物数据中,我们可能会发现购买面包的顾客往往也会购买牛奶,这种关联关系可以帮助商家进行商品陈列、促销活动等决策。Apriori 算法是关联规则挖掘中经典且常用的算法,下面我们将详细介绍该算法的原理、实现步骤,并通过实际例子和 R 语言代码进行演示。

二、Apriori 算法原理

2.1 基本概念

  • 项集(Itemset):由一个或多个项组成的集合,例如在超市购物数据中,{面包,牛奶} 就是一个项集。
  • 支持度(Support):项集在数据集中出现的频率。对于项集 $X$,其支持度 $supp(X)$ 定义为包含 $X$ 的事务数与总事务数的比值。
  • 频繁项集(Frequent Itemset):支持度大于等于用户设定的最小支持度阈值(min_sup)的项集。
  • 置信度(Confidence):对于关联规则 $X \rightarrow Y$,其置信度 $conf(X \rightarrow Y)$ 定义为 $supp(X \cup Y) / supp(X)$,表示在包含 $X$ 的事务中,同时包含 $Y$ 的比例。
  • 强关联规则(Strong Association Rule):支持度和置信度都分别大于等于最小支持度阈值和最小置信度阈值(min_conf)的关联规则。

2.2 Apriori 算法核心思想

Apriori 算法基于“先验原理”,即如果一个项集是频繁的,那么它的所有子集也必须是频繁的;反之,如果一个项集是非频繁的,那么它的所有超集也一定是非频繁的。该算法通过逐层搜索的迭代方法,从单个项集开始,不断生成更大的项集,同时利用先验原理剪枝,减少不必要的计算。

2.3 算法步骤

  1. 生成 1 - 项集($C_1$):扫描数据集,统计每个项的出现次数,生成候选 1 - 项集。
  2. 生成频繁 1 - 项集($L_1$):根据最小支持度阈值,从候选 1 - 项集中筛选出频繁 1 - 项集。
  3. 连接步:由频繁 $k$ - 项集 $Lk$ 生成候选 $k + 1$ - 项集 $C{k+1}$。
  4. 剪枝步:利用先验原理,从候选 $k + 1$ - 项集 $C_{k+1}$ 中删除包含非频繁 $k$ - 项集的候选项集。
  5. 生成频繁 $k + 1$ - 项集($L_{k+1}$):扫描数据集,统计候选 $k + 1$ - 项集的支持度,根据最小支持度阈值筛选出频繁 $k + 1$ - 项集。
  6. 重复步骤 3 - 5,直到无法生成更大的频繁项集为止。
  7. 生成关联规则:从频繁项集中生成满足最小置信度阈值的关联规则。

三、R 语言实现

3.1 安装和加载必要的包

  1. # 安装 arules 包
  2. if (!require(arules)) {
  3. install.packages("arules")
  4. library(arules)
  5. }

3.2 准备数据集

我们使用 arules 包中自带的 Groceries 数据集,该数据集包含了超市的购物记录。

  1. # 加载 Groceries 数据集
  2. data("Groceries")
  3. # 查看数据集基本信息
  4. summary(Groceries)

3.3 挖掘频繁项集

  1. # 设置最小支持度和最小置信度
  2. min_sup <- 0.005
  3. min_conf <- 0.5
  4. # 挖掘频繁项集
  5. frequent_itemsets <- apriori(Groceries, parameter = list(support = min_sup, target = "frequent itemsets"))
  6. # 查看频繁项集结果
  7. inspect(head(sort(frequent_itemsets, by = "support"), 10))

3.4 生成关联规则

  1. # 生成关联规则
  2. rules <- apriori(Groceries, parameter = list(support = min_sup, confidence = min_conf))
  3. # 查看关联规则结果
  4. inspect(head(sort(rules, by = "confidence"), 10))

3.5 结果可视化

  1. # 安装 arulesViz 包用于可视化
  2. if (!require(arulesViz)) {
  3. install.packages("arulesViz")
  4. library(arulesViz)
  5. }
  6. # 绘制关联规则的散点图
  7. plot(rules, method = "scatterplot")

四、代码解释

4.1 数据集准备

data("Groceries") 用于加载 arules 包中自带的 Groceries 数据集。summary(Groceries) 可以查看数据集的基本信息,如事务数、项数等。

4.2 挖掘频繁项集

apriori() 函数是 Apriori 算法的核心函数,通过设置 parameter 参数来指定最小支持度和挖掘目标。target = "frequent itemsets" 表示挖掘频繁项集。inspect() 函数用于查看挖掘结果,sort() 函数按支持度对频繁项集进行排序,head() 函数取前 10 个结果。

4.3 生成关联规则

同样使用 apriori() 函数,通过设置 parameter 参数指定最小支持度和最小置信度,target 参数默认为 "rules",表示生成关联规则。

4.4 结果可视化

arulesViz 包提供了多种可视化方法,plot(rules, method = "scatterplot") 绘制关联规则的散点图,横轴为支持度,纵轴为置信度,点的大小表示提升度。

五、总结

概念 定义
项集 由一个或多个项组成的集合
支持度 项集在数据集中出现的频率
频繁项集 支持度大于等于最小支持度阈值的项集
置信度 关联规则的可信度
强关联规则 支持度和置信度都满足阈值要求的关联规则

Apriori 算法通过逐层搜索和剪枝的策略,有效地挖掘出数据集中的频繁项集和关联规则。R 语言的 arules 包提供了方便的函数和工具,使得 Apriori 算法的实现变得简单高效。通过实际例子的演示,我们可以看到该算法在商业智能、推荐系统等领域有着广泛的应用前景。

希望本文能帮助你理解 Apriori 算法的原理和实现,你可以根据自己的需求调整最小支持度和最小置信度阈值,挖掘出更有价值的关联规则。