第四章 数据流挖掘

 

 

考虑到数据到来的速度实在是太快了,以致将全部数据存在活动存储器(即传统数据库)并在我们选定的时间内与之交互是不可能的。数据流处理的每个算法都在某种程度上包含流的汇总过程。

考虑如何从流中抽取有用样本

考虑如何从流中过滤掉大部分不想要的元素

考虑如何估计流中的独立元素个数

 

另外一种对流进行汇总的方法是只观察一个定长的窗口,该窗口有最近的n个元素组成,其中n是某个给定值,通常较大。然后就当它是数据库的一个关系一样对窗口进行查询处理。

 

所以在下面我们基本讨论的其实就是对流的汇总过程

 

抽取代表性样本:书上给的例子是按照用户采样而不是按单个查询采样。随机的选择部分用户,观察它们的全部查询,获取它们的代表性样本。

可以举一个例子:每个查询到来时,如果该用户已在记录桶中,则将该查询放入,否则,则调用哈希函数,将该用户映射到一个桶。如果运气好,映射到那几分之几的桶,那这个样本就可以被放入,否则,映射到空桶中意味着该样本被丢弃。我们通过将部分的桶“去底”,实现将多余的数据给丢弃掉,取用那具有部分用户的查询数据作为代表。

 

流过滤:该过程是基于这样一种情景,请求分为允许的和不允许的。我们只想接受那些允许通过的请求。但即使是允许通过的请求数目也是数量极大,尤其是要在内存中维护这样一张允许地址id表,对普通用户来说也显得太过庞大。据报道,百分之八十的邮件都是垃圾邮件,那么我们又是如何去过滤掉这些垃圾邮件的呢?

很简单,如果考虑将这样的一张表压缩一下即可,在计算机科学里面最喜欢的就是将一个元素映射到一个整数来压缩存储空间。但其实,我们还能做的更彻底,通过给内容中的一段按位编址,将一个元素映射到一个位上。(槽:但其实这与映射到一个整数并无本质区别,外国佬又给起了一个什么布隆过滤器的名字,真的烦,让我多记了20个字节)

这样的一个布隆过滤器由以下几部分组成:

1.     一个n个位组成的数组,每个位的初始值都为0

2.     一系列哈希函数h1,h2,…,hk组成的集合。每个哈希函数将键值(地址id)映射到上述位数组的n个位中。

3.     M个允许键值组成的集合S

当键值为K的流元素到达时,检查所有哈希函数对应的位是否为1即可(这是使用适当多个哈希函数是为了用冗余减少出现漏网之鱼的可能)

既然提到漏网之鱼,顺便说下这种鱼出现的概率-假阳率。

位数组长度为n,允许键值数为m,k个哈希函数,得出,假阳率为 (1-e^(-km/n))^k

猜你喜欢

转载自blog.csdn.net/HAR_fernman/article/details/80490123