挖掘频繁模式、关联和Apriori算法
1. 引入
1.1 基本概念
频繁模式:频繁出现在数据集中的模式
频繁模式挖掘:获取到给定数据集中反复出现的联系
注:模式其实可以理解为,你在淘宝购物,你的购物车里面会购置的不同商品的集合种类,因为不止是只有你,还有其他用户也在买,因此大家购物车中购置的商品也不尽相同,因此可以把不同商品的组合集合看作为一种模式,而某种集合出现的次数较多,则可能视为频繁模式
非空项集 :T = {I1,I2,I3,I4,I5.....}
k-项集: 项集中项的个数为k。 如:2-项集 {1,2}
关联规则:可以表示模式。支持度(support)和置信度(confidence)则是规则兴趣度的两种度量,可以反应出所发现规则的有用性和确定性。
支持度support: support(A=>B) = P(A U B)
置信度confidence:confidence(A=>B) = P(B|A) = support(AUB) / support(A)
注:这儿的的AUB与概率统计中不一样,这儿的AUB表示 A和B的交集
A=>B 代表 B|A
引入一个重要概念: 先验性质
先验性质:频繁项集所有的非空子集都是频繁的
换句话说(逆否):一个项集不频繁则其所有超集都不是频繁项集
1.2 关联挖掘的过程
1. 找出所有的频繁项集(项集必须满足最小支持度要求min_support)
2. 由频繁项集产生强关联规则(项集必须满足最小支持度要求min_support和最小置信度min_confidence要求)
2. Apriori介绍
Apriori算法是发现频繁项集的基本算法
2.1 Apriori算法特点:
- - 利用先验性质
- - 逐层迭代的方式
- - 由Lk-1到Lk。(k-1项集到k项集)
- - 反单调性(先验性质的逆否说法)
- - 连接步骤
连接:使用k项集 找出 k+1项集
:为找出频繁k项集,通过将所有的频繁k-1项集与自身连接
-->产生候选k项集。候选集合记作Ck。
设 l1 和 l2 是频繁k-1项集中的成员。记 li[ j ] 表示 li 中的第 j 项。
假设Apriori算法对事务或项集中的项按字典次序排序。
即对于(k-1)项集 li ,li[1]<li[2]<……….<li[k-1]。
将Lk-1与自身连接,如果(l1[1]=l2[1])&&( l1[2]=l2[2])&&……..&& (l1[k-2]=l2[k-2])&&(l1[k-1]<l2[k-1])
那认为l1和l2是可连接。
连接l1和l2 产生的结果是{l1[1],l1[2],……,l1[k-1],l2[k-1]}。
- 剪枝步骤
剪枝:利用先验性质的逆否
CK是LK的超集,也就是说,CK的成员可能是也可能不是频繁的。
法1. 通过扫描所有的事务,确定CK中每个候选的计数,判断是否小于最小支持度计数,如果不是,则认为该候选是频繁的。
法2. 为了压缩Ck,可以利用Apriori性质:任一频繁项集的所有非空子集也必须是频繁的,反之,如果某个候选的非空子集不是频繁的,那么该候选肯定不是频繁的,从而可以将其从CK中删除。
2.2 Apriori伪代码:
获取候选1-项集
剪枝1-项候选集得到 1 项集和对应support
存在1项集(k+1项集)满足最小支持度
对 1 项集(k项集)进行连接操作-->获取连接后的 2 项集(k+1项集)
对连接后的 2 项集(k+1项集)进行剪枝操作-->获取候选 k+1 项集(k+1项集):(先验性质)
计算出 2 项集(k+1项集)的支持度(符合最小支持度min_support要求)
# -*- coding: utf-8 -*-
3 算法的改进与提升
3.1 Apriori效率提高
1. 基于散列的技术
将每个项集通过相应的hash函数映射到hash表中的不同的桶中,这样可以通过将桶中的项集技术跟最小支持计数相比较先淘汰一部分项集。
2. 事务压缩
不包含任何k-项集的事务不可能包含任何(k+1)-项集,这种事务在下一步的计算中可以加上标记或删除
3. 划分
挖掘频繁项集只需进行两次数据扫描
任何频繁项集必须作为局部频繁项集至少出现在一个部分中(不可缺失)。
第一次扫描:将事务划分为多个部分并找到局部频繁项集
第二次扫描:评估每个候选项集的实际支持度,以确定全局频繁项集。(局部推全局)
4. 抽样
选择原始数据的一个样本,在这个样本上用Apriori算法挖掘频繁模式
通过牺牲精确度来减少算法开销,为了提高效率,样本大小应该以可以放在内存中为宜,可以适当降低最小支持度来减少遗漏的频繁模式
可以通过一次全局扫描来验证从样本中发现的模式
可以通过第二此全局扫描来找到遗漏的模式
5. 动态项集计数
在扫描的不同点添加候选项集,这样,如果一个候选项集已经满足最少支持度,则在可以直接将它添加到频繁项集,而不必在这次扫描的以后对比中继续计算。
3.2 Apriori缺点
- Apriori算法将会产生大量的候选集
- 重复的扫描数据库,系统开销极大
改进: 频繁模式增长(Frequent-Pattern Growth,FP-Growth)
- 分而治之
- -频繁模式树
- 模式片段
- 。。。
具体见下一篇FP-Growth