我正在浏览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%
答案 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