在《什么是布隆过滤器(Bloom Filter)?》一文中,多次提到了误识别率(FPP,false positive probabilistic)。

那么误识别率到底是多大,应该如何计算呢?

假设布隆过滤器大小为m比特,存储了n个元素,使用k次散列函数来计算元素的存储位置。

  • 添加1个元素,则任一比特为1的概率为:1/m,任一比特为0的概率:1-1/m
  • 添加1个元素,执行k次散列之后,则任一比特为0的概率:(1-1/m)^k,任一比特为1的概率:1-(1-1/m)^k
  • 如果添加n个元素,那么任一比特为0的概率:(1-1/m)^kn,任一比特为1的概率:1-(1-1/m)^kn
  • 如果将1个新的元素,添加到已存在n个元素的布隆过滤器中,则任一比特已经为1的概率与上面相同,概率为:1-(1-1/m)^kn。因此,k个比特都为1的概率为:(1-(1-1/m)^kn)^k,此即为新插入元素的误识别率。

当n值比较大时,(1-(1-1/m)kn)k约等于:(1-e-kn/m)k

其中,e是一个数学常数,是自然对数函数的底数。有时被称为欧拉数(Euler’s number),以瑞士数学家欧拉命名。它是一个无限不循环小数,数值约为2.71828182846。

假定布隆过滤器大小m为16比特,k为8,存储元素n为1,那么误识别(假阳性)的概率是万分之五(5/10000)。

此时,m/n=16,事实上这表示1个元素使用16个比特的空间来存储。

因此,当k相同时,m/n为16/1、32/2、64/4等值时具有相同的误识别率。

将数值代入公式,计算一下万分之五的概率是怎么来的:

kn=8*1=8kn/m=8/16=1/2e的-1次方转换为倒数:1/e=0.36787944117再计算1/e的1/2次方,即对0.36787944117进行开方,得到:0.60653065971144443045693327628786计算括号内的值:1-0.60653065971144443045693327628786=0.39346934028855556954306672371214最后再计算k次方:0.39346934028855556954306672371214的8次方=5.7449622219356465294987619912758e-4

计算得到的误识别率为 5.7449622219356465294987619912758e-4 ,即万分之五。

下面是来自http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html的一个误识别率表,可以很方便的查询出在m、n和k分别取不同值时的误识别率。

m/nk取不同的值时,布隆过滤器的误识别率.
m/n k k=1 k=2 k=3 k=4 k=5 k=6 k=7 k=8
2 1.39 0.393 0.400            
3 2.08 0.283 0.237 0.253          
4 2.77 0.221 0.155 0.147 0.160        
5 3.46 0.181 0.109 0.092 0.092 0.101      
6 4.16 0.154 0.0804 0.0609 0.0561 0.0578 0.0638    
7 4.85 0.133 0.0618 0.0423 0.0359 0.0347 0.0364    
8 5.55 0.118 0.0489 0.0306 0.024 0.0217 0.0216 0.0229  
9 6.24 0.105 0.0397 0.0228 0.0166 0.0141 0.0133 0.0135 0.0145
10 6.93 0.0952 0.0329 0.0174 0.0118 0.00943 0.00844 0.00819 0.00846
11 7.62 0.0869 0.0276 0.0136 0.00864 0.0065 0.00552 0.00513 0.00509
12 8.32 0.08 0.0236 0.0108 0.00646 0.00459 0.00371 0.00329 0.00314
13 9.01 0.074 0.0203 0.00875 0.00492 0.00332 0.00255 0.00217 0.00199
14 9.7 0.0689 0.0177 0.00718 0.00381 0.00244 0.00179 0.00146 0.00129
15 10.4 0.0645 0.0156 0.00596 0.003 0.00183 0.00128 0.001 0.000852
16 11.1 0.0606 0.0138 0.005 0.00239 0.00139 0.000935 0.000702 0.000574
17 11.8 0.0571 0.0123 0.00423 0.00193 0.00107 0.000692 0.000499 0.000394
18 12.5 0.054 0.0111 0.00362 0.00158 0.000839 0.000519 0.00036 0.000275
19 13.2 0.0513 0.00998 0.00312 0.0013 0.000663 0.000394 0.000264 0.000194
20 13.9 0.0488 0.00906 0.0027 0.00108 0.00053 0.000303 0.000196 0.00014
21 14.6 0.0465 0.00825 0.00236 0.000905 0.000427 0.000236 0.000147 0.000101
22 15.2 0.0444 0.00755 0.00207 0.000764 0.000347 0.000185 0.000112 7.46e-05
23 15.9 0.0425 0.00694 0.00183 0.000649 0.000285 0.000147 8.56e-05 5.55e-05
24 16.6 0.0408 0.00639 0.00162 0.000555 0.000235 0.000117 6.63e-05 4.17e-05
25 17.3 0.0392 0.00591 0.00145 0.000478 0.000196 9.44e-05 5.18e-05 3.16e-05
26 18 0.0377 0.00548 0.00129 0.000413 0.000164 7.66e-05 4.08e-05 2.42e-05
27 18.7 0.0364 0.0051 0.00116 0.000359 0.000138 6.26e-05 3.24e-05 1.87e-05
28 19.4 0.0351 0.00475 0.00105 0.000314 0.000117 5.15e-05 2.59e-05 1.46e-05
29 20.1 0.0339 0.00444 0.000949 0.000276 9.96e-05 4.26e-05 2.09e-05 1.14e-05
30 20.8 0.0328 0.00416 0.000862 0.000243 8.53e-05 3.55e-05 1.69e-05 9.01e-06
31 21.5 0.0317 0.0039 0.000785 0.000215 7.33e-05 2.97e-05 1.38e-05 7.16e-06
32 22.2 0.0308 0.00367 0.000717 0.000191 6.33e-05 2.5e-05 1.13e-05 5.73e-06

参考

《数学之美》

http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html

https://zh.wikipedia.org/zh-cn/E_(%E6%95%B0%E5%AD%A6%E5%B8%B8%E6%95%B0)

https://en.wikipedia.org/wiki/Bloom_filter

关于我

公众号:二进制之路

教程:996geek.com

博客:binarylife.icu

布隆过滤器之误识别率FPP公式的推导相关推荐

  1. KWS_关键词命名+识别率和误识别率

    关键词命名: 1. 命令词中相邻汉字的声母区分度越大越好,比如"消息"."小心",这样的不容易识别,因为相邻汉字的声母都是x,最好是不同的声母. 2. 命令词中 ...

  2. 布隆过滤器之Python+Redis

    简单的python实现 pip install mmh3 对于安装报错,c++编译错误问题:可以安装    Microsoft Visual C++ Build Tools() 例子转载(https: ...

  3. 目标检测(降低误检测率及小目标检测系列笔记)

    深度学习中,为了提高模型的精度和泛化能力,往往着眼于两个方面:(1)使用更多的数据(2)使用更深更复杂的网络. ** 一.什么是负样本 ** 负样本是指不包含任务所要识别的目标的图像,也叫负图像(Ne ...

  4. OCR算法识别率怎么评估?

    关于OCR算法:http://ocr.space/ ocr api接口的种类:OCR名片识别API接口.OCR文档识别API接口.OCR车牌识别API接口.OCR证件识别API接口 一.测试方法: 人 ...

  5. 误报率、故障检测率、漏报率、虚警率、误警率等指标异同及计算公式

    文章目录 误报率.故障检测率.漏报率.虚警率.误警率等指标异同及计算公式 1. 一些标准指标的计算 true positive rate (tp rate)[真阳性率], or hit rate [命 ...

  6. 一步步提高手写数字的识别率(1)

    手写数字识别是机器学习领域中的一个经典应用,很多机器学习算法以这个问题作为示例,其地位相当于程序界的hello world.这个问题具有以下两个特点: 问题复杂度适中.手写识别是一门很深的学问,但这里 ...

  7. 国税局发票查验中英文验证码识别,识别率95.2%

    关于国税局发票验证码识别,应该是大多数从事发票查验的人员比较头疼的问题,但实际上发票验证码识别问题严格而言较为简单. 一.背景 首先,需要了解清楚国税局的发票验证码构成,如下图,正常而言都是中文.数字 ...

  8. oracle bloom过滤,布隆过滤(Bloom Filter)-必须了解的优化器算法

    布隆过滤(Bloom Filter)-必须了解的优化器算法 布隆过滤器(Bloom Filter)是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一 ...

  9. 【Redis系列】Redis布隆过滤之8亿大数据集实战

    序言 即便平凡的日子仿佛毫无波澜,但在某个特定的时刻,执着的努力便会显现出它的价值和意义. 文章标记颜色说明: 黄色:重要标题 红色:用来标记结论 绿色:用来标记一级重要 蓝色:用来标记二级重要 希望 ...

最新文章

  1. IOS 中的MVC设计模式
  2. Python 技术篇 - 使用pypandoc库实现html文档转word文档实例演示
  3. Mac终端Terminal使用
  4. 缓存服务器协议有哪些,HTTP 协议的缓存机制概述
  5. 企业实战_23_MyCat SQL防火墙
  6. android webview 字体 系统字体大小,Android 系统字体大小动态改变,导致webview中显示不兼容的问题解决...
  7. 一种使用pyinstaller时图标问题解决方案
  8. vue子组件mounted不执行_vue中父子组件传值,解决钩子函数mounted只运行一次的问题...
  9. Mac配置adb笔记,彻底解决zsh: command not found: adb问题
  10. Jenkins通过FTP上传站点太多文件导致太慢且不稳定,切换为压包上传再解压的思路(asp.net)...
  11. c 按输入的字母来输出对应效果
  12. 计算机基础竞赛知识试题,计算机基础知识及基本技能操作竞赛试题
  13. MxCAD云图DWG转PDF
  14. mysql怎么tonumber_orcale中的to_number方法使用
  15. dcn网络与公网_DCN网络安全
  16. yolov5环境配置及训练coco128数据集
  17. 数学建模PPT(三)
  18. c语言编译星座测试,用c语言编写程序,判断输入的日期(月,日)属于哪个星座?...
  19. docker搭建xui
  20. C语言之三目运算符---学习笔记

热门文章

  1. python实现远程控制
  2. java aria,ARIA 标签和关系
  3. | 名师博客 | 地址 |
  4. 关于java开发邮件接收程序的一点总结
  5. 数加生产制造执行系统(MES)——优势
  6. linux安装docker并搭建DNS服务器,劫持百度小实验
  7. 噼里啪智能·财税产品技术 VP 张芳:DI 和 AI 双引擎为智能财税保驾护航
  8. 自动化篇 - 为闲鱼制作一个客服机器人
  9. jenkins提示没有这个文件: ‘pom.xml‘
  10. VC6.0编译出错Compiling...,Error spawning cl.exe的解决方法