大数据笔记--Bloom Filter

来源:互联网 发布:cad三维设计软件 编辑:程序博客网 时间:2024/05/16 23:35

     应用场景:现有10亿个邮件地址,都是非垃圾邮件地址,存在集合S中。那么对于输入的任意邮件地址,如何判断是否在集合S中。

   如果将10亿个地址都放入内存中查找,假设一个地址是10个字符,占用10个字节,那么10亿个地址需要占用10G内存,很显然是非常浪费资源的。

   Bloom Filter 的思路:

                                    1. 在内存中开1G的空间,记为R,总共80亿个bit,初始全部置为0。

                                    2. 将10亿个邮件地址通过某个随机的hash函数,计算出一个整数,然后将R中对应的bit置为1。例如,整数

                                        是1000,则将R中第1000位记为置为1。当然很有可能会对同一个位多次操作。

   当输入一个待判断的邮件地址时,通过hash函数快速映射到R中,如果对应的位为1,则该邮件地址为非垃圾邮件地址,如果为0,则判断为垃圾邮件地址。

   很显然,会有一定的概率将垃圾邮件地址判断为非垃圾邮件地址,那么这种概率有多大呢?直觉可以大概判断是1/8,就是恰好映射到了为1的位。这种概率,也称为伪阳率。

    下面来证明之。

     先看一个启发性的例子(我没有用书中的例子,我觉得他讲的不清楚,这里是自己的理解),有y个球,x个盒子,这y个球随机的放进x个盒子。那盒子至少存在一个球的概率是多大呢?

     先来算,一个都没有的概率

                                                

     至少存在一个的概率,用1减去上式就可以了,当x很大时,可以根据幂定律得到

                                                        

     那么对于80亿个位,就是80亿个盒子,10亿个邮件地址,就是10亿个球。得到位为1的概率为0.1175

     在实际情况中,有大概80%的垃圾邮件地址,这80%中,有11.75%不会被过滤,但大多数都会被过滤掉。

       

      如何进一步降低false postive呢?增加hash函数,每一个S中的地址,通过几个hash函数映射,映射的相应位都置为1,这样相当于增加了球的个数。判断规则为,必须映射的所有位都是1,就接受待判断的地址为正常邮件地址。

     现在看正式的证明,如果R中空间为n,S中个数为m,hash函数为k个,那每一个位至少为1的概率为:

                                             

     也就是有1的位数占总位数的比率为:

                                               
      那false postive 就为:

                                               

      如果将该式对k求导,可得最小化这个概率的k取值为:

                                                

 





     


0 0