Apriori算法分析以及FP-tree算法

提高Apriori算法的有效性

主要的挑战:
1. 要对数据进行多次扫描
2. 会产生大量的候选集
3. 对候选项集的支持度计算会非常繁琐

解决思路
1. 减少对数据的扫描
2. 缩小产生的候选项集
3. 改进对候选项集的支持度的计算方法

方法1:基于hash表的项集计数
将每个项集通过相应的hash函数映射到hash表中的不同的桶中,这样可以将桶中的项集计数跟最小支持度计数相比较,先淘汰一部分项集。
(淘汰整个桶)

方法2:事务压缩(压缩进一步迭代的事务数)
不包含任何k项集的事务不可能包含任何(k+1)项集,这种事务在下一步的计算中可以加上标记或删除

方法3:划分
挖掘频繁项集只需要2次数据扫描
D中的任何频繁项集必须作为局部频繁项集至少出现在一个部分中
第一次扫描:将数据划分为多个部分并找到局部频繁项集
第二次扫描:评估每个候选项集的实际支持度,以确定全局频繁项集。

方法4:选样(在给定数据的一个子集挖掘)
基本思想:选择原始数据的一个样本,在这个样本上用Apriori算法挖掘频繁模式
通过牺牲精确度来减少算法开销,为了提高效率,样本大小应该可以放在内存中为宜,可以适当降低最小支持度来减少遗漏的频繁模式。
可以通过一次全局扫描来验证从样本中发现的模式
可以通过第二次全局扫描来找到遗漏的模式

方法5:动态项集计数
在扫描的不同点添加候选项集,这样,如果一个候选项集已经满足最小支持度,则在可以直接将它添加到频繁项集,而不必在这次扫描的以后对比中继续计算。


从数据库构建一个FP树
Apriori算法的主要开销:
可能要产生大量的候选项集
(10,4)个频繁1-项集会导致(10,7)个频繁2-项集
对长度为100的频繁模式,会产生(2,100)个候选
重复扫描数据库,通过模式匹配检查一个很大的候选集合

不产生候选频繁项集的算法-FP树频集算法
一种采用divide and conquer的方法
在经过第一遍扫描之后,把数据库的频集压缩进一颗频繁模式树(FP-tree),同时依然保留其中的关联信息
将FP-tree分化成一些条件库,每个库和一个长度为1的频集相关,然后再对这些条件库分别进行挖掘。

从数据库构建一个FP树
步骤:
1. 扫描一次数据库,导出频繁项的集合(1-项集)
2. 将频繁项按降序排列
3. 再次扫描数据库,构建FP树

FP树挖掘
1. 创建树的根节点,用null标记
2. 将每个事务中的项按递减支持度计数排列,并对每个事务创建一个分支
3. 当为一个事务考虑增加分支时,沿共同前缀上的每一个节点的计数+1,为跟随前缀后的项创建节点并连接
比如将第二个事务{f,c,a,b,m}加到树上时,将为f,c,a各增计数1,然后为{b,m}创建分支
4. 创建一个项头表,以方便遍历,每个项通过一个节点链指向它在树中的出现。

FP树的挖掘步骤:
由长度为1的频繁模式(初始后缀模式)开始,构造它的条件模式基(一个“子数据库”,由FP树中与后缀模式一起出现的前缀路径集组成)
构造该初始后缀模式的条件FP树,并递归的在该树上实现挖掘。模式增长通过后缀模式与条件FP树产生的频繁模式连接实现。

你可能感兴趣的:(c,数据库,算法,null,FP)