系列文章目录
频繁模式挖掘系列算法(一):
频繁模式挖掘系列算法(二):
频繁模式挖掘系列算法(三):
文章目录
前言
频繁模式挖掘是一种数据挖掘技术,旨在发现数据集中出现频率较高的模式。这些模式可能是项目集中的频繁项集,或者是序列数据中的频繁子序列。常见的频繁模式挖掘算法包括 Apriori
算法、FP-growth
算法等。这些算法可以在大规模数据集中高效地发现频繁模式,并提供支持度、置信度等指标来评估模式的重要性和可靠性。
本文主要介绍了什么是频繁模式,和频繁模式常见的第一个算法 Apriori
算法。
1. 频繁模式
1.1. 定义
频繁模式
- 指在一个数据集中频繁出现的模式(如一组项目、子序列、子结构等)
- 数据集的一个内在的和重要的属性,是进行任何必要的数据分析任务的基础
动机
- 寻找数据中的内在规律性
1.2. 评价指标
- Basic Concepts
itemset
: 一个或多个项目的集合k-itemset
: X = { x 1 , ⋯ , x k } X = \{x_1, \cdots, x_k \} X={ x1,⋯,xk}support
(absolute) support / support count
:一个项目集 X X X 的频率或发生率(relative) support
:一次交易中包含 X X X 的概率- 一个项目集 X X X 是频繁的,如果 X X X 的支持度不低于一个
minsup
(最小支持度)阈值
- Association Rules
support
- 支持度- 支持度就是几个关联的数据在数据集中出现的次数占总数据集的比重,或者说几个数据关联出现的概率
- 一般来说,支持度高的数据不一定构成频繁项集,但是支持度太低的数据肯定不构成频繁项集
- s u p p o r t ( X , Y ) = P ( X Y ) = n u m e r ( X Y ) n u m ( A l l _ S a m p l e ) support(X, Y) = P(XY) = \frac{numer(XY)}{num(All\_Sample)} support(X,Y)=P(XY)=num(All_Sample)numer(XY)
confidence
- 置信度- 置信度体现了一个数据出现后,另一个数据出现的概率,或者说数据的条件概率
- c o n f i d e n c e ( X → Y ) = P ( Y ∣ X ) = P ( X Y ) / P ( X ) confidence(X \rightarrow Y) = P(Y | X) = P(XY) / P(X) confidence(X→Y)=P(Y∣X)=P(XY)/P(X)
- 一般来说,要选择一个数据集合中的频繁数据集,则需要自定义评估标准。最常用的评估标准是用自定义的支持度,或者是自定义支持度和置信度的一个组合
- Closed Patterns and Max-Patterns
- Closed Patterns 是对频繁模式的压缩,可以减少模式和规则的数量
- 项集 X X X 是
closed-pattern
如果 X X X 是个频繁项集并且不存在和 X X X 拥有相同的支持度的 super-pattern Y ⊃ X Y \supset X Y⊃X - 项集 X X X 是
max-pattern
如果 X X X 是个频繁项集并且不存在 super-pattern Y ⊃ X Y \supset X Y⊃X
1.3. 向下封闭性
频繁模式挖掘算法的理论基础:频繁项目集的任何子集都必须是频繁的
2. Apriori 算法
2.1. 算法思想
Apriori
算法的目标是找到最大的 K 项频繁集:- 要找到符合支持度标准的频繁集,但是这样的频繁集可能有很多
- 要找到最大个数的频繁集
- 举例来说:如果我们找到符合支持度的频繁集 AB 和 ABE,那么我们会抛弃 AB,只保留 ABE,因为 AB 是 2 项频繁集,而 ABE 是 3 项频繁集
Apriori
的一个重要属性- 频繁项集的所有非空子集也必须是频繁的
Apriori
修剪原则- 如果有任何项目集是不频繁的,它的超集不应该被生成
2.2. 算法流程
- 输入与输出
- 输入:数据集合 D D D,支持度阈值 α \alpha α
- 输出:最大的频繁 K K K 项集
- 流程
- 概述
Apriori
算法采用了迭代的方法,先搜索出候选 1 1 1 项集及对应的支持度,剪枝去掉低于支持度的 1 1 1 项集,得到频繁 1 1 1 项集- 然后对剩下的频繁 1 1 1 项集进行连接,得到候选的频繁 2 2 2 项集,筛选去掉低于支持度的候选频繁 2 2 2 项集,得到真正的频繁 2 2 2 项集
- 以此类推,迭代下去,直到无法找到频繁 k + 1 k+1 k+1 项集为止,对应的频繁 k k k 项集的集合即为算法的输出结果
- 具体操作流程
- 扫描整个数据集,得到所有出现过的数据,作为候选频繁 1 1 1 项集, k = 1 k=1 k=1,频繁 0 0 0 项集为空集。
- 挖掘频繁 k k k 项集
- 扫描数据计算候选频繁k项集的支持度
- 去除候选频繁 k k k 项集中支持度低于阈值的数据集,得到频繁 k k k 项集
- 如果得到的频繁 k k k 项集为空,则直接返回频繁 k − 1 k-1 k−1 项集的集合作为算法结果,算法结束
- 如果得到的频繁 k k k 项集只有一项,则直接返回频繁 k k k 项集的集合作为算法结果,算法结束
- 基于频繁 k k k 项集,连接生成候选频繁 k + 1 k+1 k+1 项集
- 令k=k+1,转入步骤2
- 概述
从算法的步骤可以看出,Aprior
算法每轮迭代都要扫描数据集,因此在数据集很大,数据种类很多的时候,算法效率很低
2.3. 算法实现
- Candidate-generation
self-joining
L k L_k Lkpruning
- Example
完整例子,min_sup = 2:
2.4. 算法伪代码
- Input:
- D, a database of transactions;
- min_sup, the minimum support count threshold.
- Output: L, frequent itemsets in D.
- Method 1
- Method 2
2.5. 算法存在的问题
- 主要的计算挑战
- 对交易数据库进行多次扫描
- 候选人数量巨大
- 对候选人进行支持性计数的繁琐工作量
- 改进先验方法:一般想法
- 减少交易数据库的扫描次数
- 缩减候选人的数量
- 便于对候选人的支持计数
总结
Aprior
算法是一个非常经典的频繁项集的挖掘算法,很多算法都是基于 Aprior
算法而产生的,包括 FP-Tree
、GSP
、CBA
等。这些算法利用了 Aprior
算法的思想,但是对算法做了改进,数据挖掘效率更好一些,因此现在一般很少直接用 Aprior
算法来挖掘数据了,但是理解 Aprior
算法是理解其它 Aprior
类算法的前提,同时算法本身也不复杂,因此值得好好研究一番
本文部分内容参考自:Apriori算法原理总结
本文部分内容参考自:BUPT 物联网信息处理技术——张海涛老师