如何计算Bloom过滤器百分比

时间:2014-12-01 12:06:09

标签: algorithm hadoop

我正在浏览Hadoop In Action,并在Bloom Filter上发现了解释,其中说:

  

假阳性率由等式

近似
(1 – exp(-kn/m))k 
  

其中k是使用的散列函数的数量,m是   用于存储Bloom过滤器的位数,n是数量   要添加到Bloom过滤器的元素。在实践中,m和n是   由系统的要求决定,因此,k是   选择最小化给定m和n的假阳性率,其后(   一点点微积分)

k = ln(2) * (m/n) ≈ 0.7 * (m/n) 
  

虚假   给定k的正率为0.6185m / n,k必须为a   整数。误报率只是近似值。从一个   从设计的角度来看,人们应该考虑(m / n),数量   每个元素的位数,而不是单独的m。例如,我们必须存储一个   设置包含一千万个URL(n = 10,000,000)。分配8位   每个URL(m / n = 8)将需要10 MB Bloom过滤器(m = 80,000,000   位)。此布隆过滤器的误报率为(0.6185)8,   或约2%。如果我们通过存储来实现Set类   原始网址,让我们说平均网址长度为100字节   必须使用1 GB。 Bloom过滤器缩小了存储空间   要求2个数量级,仅花费2个   假阳性率百分比!分配给的存储量略有增加   Bloom过滤器将进一步降低错误的生成率。 10点   每个URL的位数,Bloom过滤器将占用12.5 MB并且为false   积极率仅为0.8%。

所以这里说假阳性率是0.6185 * 8,这是4.948,但文件说它约为2%?有人可以帮我解释百分比是如何计算的吗?

基于David的回复的详细解释:

根据书中的解释:

n = 10,000,000 = 1e7

m/n = 8 which means m = 8*n

k = ln(2) * (m/n), Value of ln(2) is 0.693 = 0.7, so value of k = 0.7 * (m/n)

现在来到我的表达:

 (1 – exp^(-kn/m))^k = (1 - exp^(-0.7))^(0.7*8) = (1 - 0.4965)^(5.6) = (0.5034)^(5.6) = 0.0214 (Here ^ represents power)

要计算百分比,我们必须乘以100。

所以百分比是0.0214*100 = 2%

1 个答案:

答案 0 :(得分:2)

正确的公式是

                k
(1 – exp(-kn/m)) ,

将带括号的表达式取为幂k而不是乘以k。近似主要是假设布隆过滤器的每个单元的值是独立的(写入exp而不是真正的单单元概率有一点误差);假阳性率是k个细胞都被标记的概率。

以下是如何计算给定示例的误报概率。

>>> from math import *
>>> n = 1e7
>>> m = 8*n
>>> k = log(2) * (m/n)
>>> (1 - exp(-k*n/m)) ** k
0.021415847120683718

要将概率转换为百分比,请乘以100.

>>> 100*_
2.1415847120683718