Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@vitillo
Created October 25, 2016 11:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vitillo/26f827750b9bcae60708581c9aea137c to your computer and use it in GitHub Desktop.
Save vitillo/26f827750b9bcae60708581c9aea137c to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import numpy.random\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from HLL import HyperLogLog\n",
"from joblib import Parallel, delayed\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def generate_population(size):\n",
" pop = [str(i) for i in range(size)]\n",
" return numpy.random.permutation(pop)\n",
"\n",
"\n",
"def sample(pop, p):\n",
" return np.random.choice(pop, int(p*len(pop)))\n",
"\n",
"\n",
"def segment(pop, p):\n",
" divisor = int(round(1/p))\n",
" to_int = np.vectorize(int)\n",
" return pop[to_int(pop) % divisor == 0]\n",
"\n",
"\n",
"def hll_cardinality(pop, registers=12):\n",
" hll = HyperLogLog(12)\n",
" for p in pop:\n",
" hll.add(p)\n",
" return hll.cardinality()\n",
"\n",
"\n",
"def mean_sample_count(pop, seg, sample_ratio, n=10):\n",
" sample_counts = []\n",
" for i in range(n):\n",
" sam = sample(pop, sample_ratio)\n",
" sample_counts.append((1/sample_ratio)*len(set(sam).intersection(set(seg))))\n",
" return np.mean(sample_counts)\n",
"\n",
"\n",
"def relative_error(pop, segment_ratio, sample_ratio):\n",
" seg = segment(pop, segment_ratio)\n",
" sample_count = mean_sample_count(pop, seg, sample_ratio)\n",
" hll_count = hll_cardinality(seg) \n",
" hll_error = 100*abs(hll_count - len(seg))/len(seg)\n",
" sample_error = 100*abs(sample_count - len(seg))/len(seg) \n",
" return {\"hll_error\": hll_error, \"sample_error\": sample_error, \"segment_ratio\": segment_ratio}"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Simulate\n",
"\n",
"size = 20\n",
"np.random.seed(42)\n",
"population = generate_population(2**size)\n",
"segment_sizes = [1.0/(2**i) for i in range(1, 21)]\n",
"errors = Parallel(n_jobs=4)(delayed(relative_error)(population, ss, 0.01) for ss in segment_sizes)\n",
"errors = pd.DataFrame(errors)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\ntG7dOr3wwgvlgdG8efN07LHH6rTTTmvochutZKOEajty6ODBg/VVDgAAAAA0aas+XaURc0fo8VGP\na0j+kKjLQSNFgNSALrroIo0aNUq5ubmHrVu3bp2GDBmijh07atCgQVq7dq127dqlBx54QPfdd1+N\n+77pppvUvXt3de7cWaeccopWrVolSXrllVd02mmnqXPnzsrLy9PUqVPLX1NUVKRmzZrpySefVN++\nfdW1a1dNnz5dK1eu1CmnnKLc3FzdcMMN5dvPmjVLZ599tm644QZ16dJFJ5xwgt54440qa3riiSd0\nwgknqGvXrjr//PP10UcfVbntn/70J5111lnKycnRqaeeqmXLlpWvGzJkiH7wgx/o7LPPVvv27cuv\nVeVln3zyiS688EJ17dpVxx13nB5//PHyfUydOlWXXXaZJkyYoC5dumjWrFk1XlMAAAAAyHTrt6/X\neU+fp2nDp2nU8aOiLgeNWFqbaCN1J598shYvXqyjjjpK77zzjn74wx/qzjvv1E033aSOHTtW+9pF\nixbp97//vQoLC9WxY0etXr1aXbp0kSR16NBBs2fP1oknnqgPPvhAw4YN06mnnqpRo774w7BixQoV\nFhZq+fLlGjlypM4//3y98cYbKikp0amnnqrRo0frnHPOkST9+c9/1ujRo1VcXKznn39eF198sdav\nX19+vDIvvvii7r//fr388ssqKCjQ/fffr7Fjx+rtt98+rP5NmzZpxIgRmjNnjs477zwtWbJEl1xy\niVavXq2uXbtKkp5++mm99tprOu6443To0KGky4YOHaqBAwdq8+bNWrVqlYYNG6aCggINHjxYkvTS\nSy/pueee0+zZs1VSUlK3NwoAAAAAMsTm3Zs1bPYw3XbWbRo/cHzU5aCRy7oAyaYm7QVVa35X/TZb\nnjx5sv7zP/9Tjz32mK6//nqVlJTo/fff15QpU3TFFVdo48aNuuyyy3T99dcf9tqWLVtq165dWrVq\nlU4//XQdf/zx5evOPffc8scnnXSSxowZo2XLlpUHSGamH/7wh2rVqpW+8Y1vqH379ho7dmx5cHPO\nOefob3/7W3mA1L17d914442SpNGjR+vBBx/UwoULdcUVV1Soafr06br99tt13HHHlZ/fPffcow0b\nNqhPnz4Vtn366ad1wQUX6LzzzpMkDR06VF/5ylf0yiuvaMKECZKkK6+8Ul/60pckSc2aNTts2aZN\n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\n9N1DWnvPWgUHBZd6rdBVqBbJLfTRnz7SJQ0vMZQQAICKoUACgCroUNYhffDLB5qxeoYyczN1+0W3\n67YOt6lpbFPT0aqEAleBVv+6uuSUt8U7F6tWtVrq2binujfurgtrX6jWtVozC6cK+HDth3p12av6\n8Y4fWekXYGzbVo+ZPXT3xXdrUPtBpV77KvUrTf5hslL+lmIoHQAAFUeBBABVRIGrQN+lfaeZq2dq\nztY5urrV1RrSYYh6N+19xhkd8A6X7dLa/Wu1cMdC/bj7R60/sF4Op0P1Y+qrba22alurrdrUaqO2\ntduqdc3WrA4LAIeyDmlz+mYN+s8gzbxmpno17WU6EjxgwfYFuvPLO7Vx2MZSFx4Y8N4A3dr+Vg2+\naLDBdAAAVAwFEgAEuNRDqZq5eqbe++U9NareSEM7DtVf2/5VNSJqmI6GsyhwFWiLc4vWH1yv9QfW\nF90fXK80Z5oaxDRQ29ptS8qltrXbqlVCK4olH5NTkKM0Z5pSD6UqNT1Vm9M3l9y7bJdaJbTS5UmX\na2KfiaajwoP6v9tfN154o+7sdKckaePBjeozq492PLBD4SHhhtMBAFB+FEgAEICO5h7VJ+s/0YzV\nM7TFuUWD2w/WkI5D1KZWG9PRcJ7yC/OV5kzThoMbSkql9QfWa8vhLWpYvWGpUqltrbZqVbOVIkIi\nTMcOWC7bpV0Zu0qVQ8X3vx77Vc1im6llQku1SmhVdF+z6L5WVC1OWasiftz1o278vxu1efhmhYeE\na9h/hykhKkGT+kwyHQ0AgAqhQAKAAGHbtn7Y8YNmrp6pzzd9rj7N+mhoh6G6ovkVpU6dQGDKL8yX\nw+koWa1UXDBtPbxVjao3KnPFEqsfyu9w9uEyS6I0Z5piI2LVKqHVaSVR09imXFUNkqSrPrxKVza/\nUoPaD1KzV5pp3b3rVD+mvulYAABUCAUSAPi5XRm7NGvNLL2z+h1FhERoaMehGtR+kGpXq206GnxA\nXmGeHOmOUqfCbTi4QVsPb1WT2CanrVhqmdCyyhZLuQW52np4q1LTU5V6qHRRlFOQ81s5FP9bSdQy\noaWiw6JNR4eP+3nvz/rjx3/U8M7DtWb/Gn38549NRwIAoMIokADAD+UU5OiLTV9oxuoZWrF3hW5o\nc4OGdhyqi+tfzGkxKJe8wjxtTt9car7ShoMbtP3IdjWNbVo0tPukcqllQkuFBYeZjn3ebNvW3qN7\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11734d150>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot\n",
"\n",
"plt.figure(figsize=(20, 10))\n",
"plt.plot(errors.index + 1, errors[\"hll_error\"], label=\"HLL error\")\n",
"plt.plot(errors.index + 1, errors[\"sample_error\"], label=\"1% sample error\")\n",
"plt.title(\"HLL vs 1 % sampling for a population of size 2^{} = {}\".format(size, 2**size))\n",
"plt.ylabel(\"relative error (%)\")\n",
"plt.xlabel(\"inverse segment ratio in logarithmic scale\")\n",
"plt.legend(loc=\"best\")\n",
"r = plt.axis([1, errors.index[-1], 0, errors[\"sample_error\"].max()+5])"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>hll_error</th>\n",
" <th>sample_error</th>\n",
" <th>segment_ratio</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.939997</td>\n",
" <td>0.527954</td>\n",
" <td>5.000000e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.541836</td>\n",
" <td>0.955200</td>\n",
" <td>2.500000e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.574175</td>\n",
" <td>1.405334</td>\n",
" <td>1.250000e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0.619938</td>\n",
" <td>1.336670</td>\n",
" <td>6.250000e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.013840</td>\n",
" <td>0.360107</td>\n",
" <td>3.125000e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>1.583049</td>\n",
" <td>1.928711</td>\n",
" <td>1.562500e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>2.056134</td>\n",
" <td>6.372070</td>\n",
" <td>7.812500e-03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1.394880</td>\n",
" <td>3.515625</td>\n",
" <td>3.906250e-03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>1.158547</td>\n",
" <td>1.562500</td>\n",
" <td>1.953125e-03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>0.372341</td>\n",
" <td>3.320312</td>\n",
" <td>9.765625e-04</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>0.156556</td>\n",
" <td>25.000000</td>\n",
" <td>4.882812e-04</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>0.899617</td>\n",
" <td>2.343750</td>\n",
" <td>2.441406e-04</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>1.628347</td>\n",
" <td>29.687500</td>\n",
" <td>1.220703e-04</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>0.789485</td>\n",
" <td>9.375000</td>\n",
" <td>6.103516e-05</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>0.392672</td>\n",
" <td>6.250000</td>\n",
" <td>3.051758e-05</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>0.195823</td>\n",
" <td>87.500000</td>\n",
" <td>1.525879e-05</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>0.097784</td>\n",
" <td>100.000000</td>\n",
" <td>7.629395e-06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>0.048860</td>\n",
" <td>100.000000</td>\n",
" <td>3.814697e-06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>0.024422</td>\n",
" <td>100.000000</td>\n",
" <td>1.907349e-06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>0.012209</td>\n",
" <td>100.000000</td>\n",
" <td>9.536743e-07</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" hll_error sample_error segment_ratio\n",
"0 0.939997 0.527954 5.000000e-01\n",
"1 0.541836 0.955200 2.500000e-01\n",
"2 0.574175 1.405334 1.250000e-01\n",
"3 0.619938 1.336670 6.250000e-02\n",
"4 0.013840 0.360107 3.125000e-02\n",
"5 1.583049 1.928711 1.562500e-02\n",
"6 2.056134 6.372070 7.812500e-03\n",
"7 1.394880 3.515625 3.906250e-03\n",
"8 1.158547 1.562500 1.953125e-03\n",
"9 0.372341 3.320312 9.765625e-04\n",
"10 0.156556 25.000000 4.882812e-04\n",
"11 0.899617 2.343750 2.441406e-04\n",
"12 1.628347 29.687500 1.220703e-04\n",
"13 0.789485 9.375000 6.103516e-05\n",
"14 0.392672 6.250000 3.051758e-05\n",
"15 0.195823 87.500000 1.525879e-05\n",
"16 0.097784 100.000000 7.629395e-06\n",
"17 0.048860 100.000000 3.814697e-06\n",
"18 0.024422 100.000000 1.907349e-06\n",
"19 0.012209 100.000000 9.536743e-07"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"errors"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.11"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment