aihot  2017-11-25 21:22:13  深度学习 |   查看评论   

  这是Apriori前两遍扫描的内存占用图:

Apriori

  第一遍扫描,左上角是项名称到整数的映射,右边是项的计数值,剩下的空间是不使用的;第二遍扫描,已经筛选掉了支持度不足的项,只保留了足够频繁的频繁项C1,然后对所有可能的C1项进行组合,得到C2的候选,也就是图中下面的部分。

  然后是PCY算法前两遍扫描的内存占用图:

PCY算法

  PCY算法在第一遍扫描时对购物篮进行检查,且不仅对篮中的每个项的计数值加1,而且通过一个双重循环生成所有的项对。对每个项对我们将哈希结果对应的桶元素加1,而且项对本身并不会放到哈希桶中,因此它只会影响桶中的单个整数。也就是第一遍扫描时图中下面的部分。

  第一遍扫描结束时,每个桶中都有一个计数值,记录的是所有哈希到该桶中的项对的数目之和,如果该桶的计数值高于支持度阈值,那么该桶称为频繁桶,我们很容易知道,频繁桶中的项对不一定是频繁项对,因为一个桶中可能有多个项对,但是非频繁桶中的项对一定不可能是频繁项。图中的Bimap每一位表示一个桶,如果该位是个频繁桶,则该位置1。

  这样,在第二遍扫描的时候,我们所需要进行支持度验证的项对C2就有了两个条件,组成项对的项都是频繁项,且该项对哈希到一个频繁桶。这第二个条件就是PCY算法和Apriori算法的本质区别。

  多阶段算法通过使用连续的哈希表来进一步降低PCY算法中的候选对数目,其示意图如下:

PCY算法

  多阶段算法的第一遍扫描和PCY的一样。第一遍扫描之后,频繁桶会被识别出来并概括为一个位图,这和PCY算法的情况也一样,也就是第二张图中的Bitmap1。但是多阶段算法的第二遍扫描并不对候选对计数,而是基于另一个哈希函数再建立另一张哈希表(第三遍扫描的目的仍然是减小候选对数目而不是生成C3)。

  这样,只有某个项对同时哈希到第一二张哈希表的某个频繁桶中,它才会成为我们的C2候选项,就相当于在PCY算法条件的基础上,又加了一条,也必须要哈希到第三张表的某个频繁桶中。

  有时,多阶段算法中额外扫描的大多数好处可以在一次扫描中得到,PCY的这种变形算法称为多哈希算法。其示意图如下:

PCY算法

  多哈希算法在一次扫描中同时使用两个哈希函数和两张独立的哈希表,其风险在于,每张哈希表的桶数目大概是PCY算法中的大哈希表的一半左右。只要PCY的每个桶的平均计数值远小于支持度阈值,我们就可以使用两张一半大小的哈希表,并仍然期望两张表中大部分桶都是不频繁的。

  我们还要介绍有限扫描算法,虽然讲前面的PCY等算法已经尝试减小Apriori算法的内存占用,但如果数据量还是过大,就要采用有限扫描算法了,如果我们并不一定要发现所有而是只需要大部分频繁项集的话。

  我们可以简单的随机化选择,抽样出来一定比例来运行前面的Apriori等算法。一种更好的有限扫描算法是SON算法,能够在两次扫描的代价下去掉所有的伪反例和伪正例。SON算法非常适合与MapReduce结合应用于并行计算环境。

  SON算法的基本思路是,将输入文件分成多个组块,将每个组块看成一个样本数据。假定,每个组块站整个文件的比例为p,而s是总的支持度阈值,然后我们对于所有组块运行之前的频繁项集算法(Apriori等),设置支持度阈值为ps,并将在一个或多个组块上发现的所有频繁项集进行合并,这些项集为候选项集。容易知道,如果项集在全集上的支持度是高于s的,那它至少会在一个组块上是频繁的,也即不会存在伪反例。然后进行第二遍扫描,将所有候选项集的支持度进行统计,去掉伪正例。

  除了SON算法之外,还有一种不会产生伪正例和伪反例,但也有可能不产生任何结果的Toivonen算法。

  该算法首先在抽样数据集上发现频繁项集,但是采用的支持度阈值较低以保证在整个数据及上的频繁项集的丢失几率较低。下一步是检查购物篮整个文件,此时不仅要对所有样本数据集上的频繁项集计数,而且要对反例边界(那些自己还没发现频繁但是其所有直接子集都频繁的项集)上的项集计数。如果反例边界上的人以及和都在整个数据集上不频繁,那么结果是确切的。但是如果反例边界上的一个集合被发现是频繁的,那么需要在一个新的样本数据集上重复整个处理过程。

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自浅谈数据挖掘基础

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]