Apriori 算法
1. 先验原理
1. 性质
上次说到,Apriori算法有两个重要特性。
- 频繁项集的非空子集一定是频繁的
- 非频繁项集的超集一定是非频繁的
这两个性质就是Apriori算法的基础,插图解释。(插图用PPT画的,有好的画图方法,请大佬赐教)。
都从1-项集开始分析的,假设1,2,3,4都满足最小支持度,那么它们都是频繁1-项集。
2-项集分析时,发现34不是频繁项集,标红。其余为频繁2-项集。
3-项集分析时,134,234 都不是频繁项集,标红。
4-项集分析时,1234不是频繁4-项集。
性质1 ,频繁项集的非空子集一定是频繁的。知道123 是频繁项集,就可以得出结论,12,13,23,1,2,3肯定都是频繁项集。234同理。
性质2 ,非频繁项集的超集一定是非频繁的。分析过程中,得知34是非频繁的,那么就可以知道134,234一定也是非频繁的。
2. 算法流程
流程是死的,就不解释什么了。感兴趣的还可以看看伪代码。
输入:数据集合D,支持度阈值αα
输出:最大的频繁k项集
- 扫描整个数据集,得到所有出现过的数据,作为候选频繁1项集。k=1,频繁0项集为空集。
- 挖掘频繁k项集
a) 扫描数据计算候选频繁k项集的支持度
b) 去除候选频繁k项集中支持度低于阈值的数据集,得到频繁k项集。如果得到的频繁k项集为空,则直接返回频繁k-1项集的集合作为算法 结果,算法结束。如果得到的频繁k项集只有一项,则直接返回频繁k项集的集合作为算法结果,算法结束。
c) 基于频繁k项集,连接生成候选频繁k+1项集。 - 令k=k+1,转入步骤2。
3. 剪枝和连接
剪枝和连接是算法的核心。通过当项集不满足支持度的时候,我们删除。
1-项集都满足最小支持度,不需要剪枝,只要连接。因此,1,2,3,4 被连接成12,13,14,23,24,34。
2-项集时,34 不满足最小支持度,因此删除。这一步删除就是剪枝,删除之后,234,134,1234 都不会再出现。而12,13,14,23,24连接成123,124。
3-项集时,123,124 运行结束。
如果数据比较多,则算法就会4-项集,5-项集,,,n-项集一直这样下去。
2. python 代码分析
from numpy import *
def loadDataSet(): ## 定义的数据集,选数字还是选字母自行选择,也可以用其他的数据集代替。
#return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
return [['A','B','D','E'],['E','B','D'],['B','D','E'],['E','D'],