Skip to content

Instantly share code, notes, and snippets.

@lieuzhenghong
Created September 20, 2017 09:29
Show Gist options
  • Save lieuzhenghong/bd5008228a9e912abb6a8e602660228a to your computer and use it in GitHub Desktop.
Save lieuzhenghong/bd5008228a9e912abb6a8e602660228a to your computer and use it in GitHub Desktop.
False positives of a Bloom filter
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# About this notebook\n",
"\n",
"This notebook aims to visualise the fundamental space-accuracy tradeoff of a [Bloom filter](https://en.wikipedia.org/wiki/Bloom_filter).\n",
"\n",
"Bloom filters can sometimes give false positives. With a bit size of 8, the false positive rate is about 2%. This can be unacceptably high for some applications, so choosing the right bit size is important.\n",
"\n",
"## Methodology\n",
"\n",
"I plot the error rate of a Bloom filter `e` with respect to the number of bits `b` used per object.\n",
"\n",
"I also plot the expected number of false positives `f` given a certain dataset size and number of bits `b`.\n",
"\n",
"Since false positives are assumed to be independent of each other, the expectation of false positives is error rate `e * size`."
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import math\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"matplotlib.style.use('ggplot')"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f88ed5c14e0>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Error rate for 8 bits: 2.1415847120684%\n",
"Error rate for 16 bits: 0.0458638507896%\n",
"Error rate for 32 bits: 0.0000210349281%\n",
"Error rate for 64 bits: 0.0000000000044%\n",
"Error rate for 128 bits: 0.0000000000000%\n"
]
}
],
"source": [
"# Plot the error rate e given number of bits b\n",
"\n",
"#b = [2**i for i in range(3, 9)] #range from 8 bits to 128 bits (16 bytes)\n",
"b = np.geomspace(8, 128, num=5)\n",
"e = ((1/2) ** (math.log(2) * b))\n",
"\n",
"fig1, ax1 = plt.subplots()\n",
"plt.xscale('log')\n",
"plt.yscale('log')\n",
"ax1.set_xticks(np.around(b).astype(int))\n",
"ax1.get_xaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter())\n",
"\n",
"plt.plot(b,e, marker='o', linestyle='--')\n",
"plt.show()\n",
"\n",
"for index, error_rate in enumerate(e):\n",
" print(\"Error rate for {} bits: {:.13%}\".format((np.around(b[index]).astype(int)), error_rate))"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nJadOneKGG26IY4Qt11wuY8eOZdGiRXz99df069cvjhG2XHO5AKxdu5bS0tJ4hRaV5vK47rrr+POf\n/8yGDRvo2rVrHCNsueZyqaqq4u2336a+vp6f/exncYxQYqlDFk/NycjI4N577413GDExduxYxo4d\nG+8wYuLKK69s1w3J52rPDcmnXX311Vx99dXxDiMmUlNTmT59erzDiJlJkybFO4RL1qtXr3b/0M5p\n3bp147777ot3GBJjif9P31bg9Xqprq6OvK6ursbr9cYxoounXBJPsuQByiVRJUsuyZIHJFcu8v06\nZPHUt29fDh48SFVVFcFgkE2bNjFkyJB4h3VRlEviSZY8QLkkqmTJJVnygOTKRb5f0u9t98wzz7Bz\n505qa2vJyspi0qRJlJWVsWXLFl599VVM06S0tJRbbrkl3qF+L+WSeJIlD1AuiSpZckmWPCC5cpGL\nk/TFk4iIiEgsdcjbdiIiIiIXS8WTiIiISBRUPImIiIhEQcWTiIiISBRUPImIiIhEQcWTiIiISBRU\nPImIiIhEQcWTiIiISBRUPImIiIhE4f8BmqvAGSNDnrUAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f88eda68240>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Now we plot size and find the expected number of false positives\n",
"# given a certain number of bits\n",
"size = np.geomspace(10, 1000000000)\n",
"plt.figure(figsize=(8,8))\n",
"for index, bit_size in enumerate(b):\n",
" fp = (np.multiply(e[index], size))\n",
" plt.plot(size, fp, label=\"{} bits\".format(np.around(bit_size).\n",
" astype(int)))\n",
" \n",
"plt.legend(loc=(1.04, 0))\n",
"plt.xscale('log')\n",
"plt.yscale('log')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f88ed97cb00>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"size = np.geomspace(10, 1000000000)\n",
"plt.figure(figsize=(8,8))\n",
"for index, bit_size in enumerate(b[:4]):\n",
" fp = (np.multiply(e[index], size))\n",
" plt.plot(size, fp, label=\"{} bits\".format(np.around(bit_size).\n",
" astype(int)))\n",
" \n",
"plt.legend(loc=(1.04, 0))\n",
"plt.xscale('log')\n",
"plt.yscale('symlog')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Conclusion\n",
"\n",
"I hope this visualisation has been somewhat useful in helping the designer choose the correct bitsize for his application.\n",
"\n",
"To me it seems like \"32 bits ought to be enough for anyone\": even with a billion entries, the expected number of false positives is still extremely, comically low (around 200). You could even get away with 16 bits (2 bytes per entry).\n",
"\n",
"Compare to a 32-bit hash table which would have a load factor of ~50% with a billion entries and would require double the memory."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment