【问题标题】:How to calculate Bloom filter percentage如何计算布隆过滤器百分比
【发布时间】:2014-12-02 19:03:03
【问题描述】:

我正在浏览Hadoop In Action,并在Bloom Filter 上看到了解释,上面写着:

误报率由等式近似

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

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

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

假的 给定 k 的阳性率为 0.6185m/n,并且 k 必须是 整数。误报率只是一个近似值。从一个 从设计的角度来看,应该考虑 (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 类 原始 URL,假设平均 URL 长度为 100 字节,我们 将不得不使用 1 GB。布隆过滤器缩小了存储空间 要求提高 2 个数量级,而代价仅为 2 百分百误报率!分配给的存储空间略有增加 布隆过滤器将进一步降低误报率。 10 点 每个 URL 的位数,布隆过滤器将占用 12.5 MB 并且有一个错误 阳性率仅为 0.8%。

所以这里说误报率是 0.6185*8,即 4.948,但是文档怎么说它大约是 2%?有人可以帮我计算百分比吗?

根据大卫的回答详细解释:

根据书中的解释:

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%

【问题讨论】:

    标签: algorithm hadoop


    【解决方案1】:

    正确的公式是

                    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
    

    【讨论】:

    • 感谢您的回复,能否请您告诉我百分比是如何计算的?
    • 您能否添加 cmets 以说明您是如何获得结果的。我不知道n=1e7m=8*n 以及您更新答案的其余行。很抱歉给您带来了困扰。
    • @user3181365 1e7 是 10,000,000 的缩写。我通过将等式 m/n = 8 的两边乘以 n 来设置 m = 8*n
    • 感谢大卫花时间澄清我的问题。
    猜你喜欢
    • 2021-01-13
    • 2021-01-31
    • 1970-01-01
    • 2021-04-12
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    相关资源
    最近更新 更多