lsh notebook
This commit is contained in:
1 parent
8bb99e507f
commit
5ae93a9a6a
1 file changed
+357
@@ -0,0 +1,357 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import floky\n",
|
||||
"from tqdm import tqdm\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"import glob\n",
|
||||
"import imageio\n",
|
||||
"from skimage.transform import resize\n",
|
||||
"from scipy import stats\n",
|
||||
"import time"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# LSH Definition\n",
|
||||
"We hash some some vectors $p$ into buckets with $h$ coming from a hash function family $H$ $h: M \\mapsto S$. The hash functions map from vector space to a bucket. We hope to be able to query $q$ approximate nearest neighbors for cosine similarity, maximum inner product, l2 distance etc. We do this by making more similar vectors collide in the same hash buckets. \n",
|
||||
"\n",
|
||||
"Given that:\n",
|
||||
"\n",
|
||||
"* The approximation is defined by a factor $c > 1$.\n",
|
||||
"* The distance threshold $R > 0$.\n",
|
||||
"\n",
|
||||
"### It is guaranteed:\n",
|
||||
"\n",
|
||||
"* If $Distance(p, q) \\le R$ then $h(p) = h(q)$ with a probability $\\ge P_1$. $\\quad$ \n",
|
||||
"* If $Distance(p, q) \\ge cR$ then $h(p) = h(q)$ with a probability $\\le P_2$\n",
|
||||
"\n",
|
||||
"## LSH for Approximate nearest neighbor\n",
|
||||
"Only useful if $P_q \\gt P_2$\n",
|
||||
"\n",
|
||||
"* $K$: Bucket width: (In random projections this is the number of random projections)\n",
|
||||
"* $L$: Number of hash tables. When querying the union of the collisions in all the hash tables is returned\n",
|
||||
"\n",
|
||||
"### Guarantees:\n",
|
||||
"\n",
|
||||
"* Preprocessing time: $\\mathcal{O}(nLKt)$ ($t$ is the time of evaluating the hash function)\n",
|
||||
"* Space: $\\mathcal{O}(nL)$ (and the data points space)\n",
|
||||
"* query time: $\\mathcal{O}(LKt + dn P_2^K)$\n",
|
||||
"* Succes of finding point $q$ within distance $cR$ (if it exists) w/ probability $\\ge 1 - (1 - P_1^K)^L$\n",
|
||||
"\n",
|
||||
"So given hyperparameters $P_1, P_2$ we can derive $K = \\frac{\\log n}{\\log 1 / P_2}$\n",
|
||||
"\n",
|
||||
"and $L = n^{\\rho}$, where $\\rho = \\frac{\\log P_1}{\\log P_2}$\n",
|
||||
"\n",
|
||||
"## Parameter estimation\n",
|
||||
"If $P_1$ is known, see (L2 and SRP below), *L* can be derived for a chosen value of *k* and a success probability $1-\\delta$. \n",
|
||||
"\n",
|
||||
"$$ L = \\frac{\\log \\delta}{ \\log(1 - P_1^k)} $$\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# L2 \n",
|
||||
"\n",
|
||||
"$$h(x) = \\lfloor \\frac{ w^Tx + b}{r} \\rfloor$$\n",
|
||||
"\n",
|
||||
"$$ P(h(x) = h(y)) = 1 - 2\\Phi(-r/d) - \\frac{2}{\\sqrt{2 \\pi} r / d } (1 - e^{r^2/ (2d^2)})$$\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Cosine similarity (Signed Random Projections)\n",
|
||||
"$$ h(x) = sign(w^Tx) $$\n",
|
||||
"$$ P(h(x) = h(y)) = 1 - \\frac{\\theta}{\\pi} $$\n",
|
||||
"\n",
|
||||
"$\\theta = \\cos^{-1}(\\text{cosine similarity})$\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def collision_prob_l2(r, distance):\n",
|
||||
" # https://arxiv.org/pdf/1411.3787.pdf eq. 10\n",
|
||||
" a = 1 - 2 * stats.norm.cdf(-r / distance)\n",
|
||||
" b = 2 / (np.sqrt(2 * np.pi) * r / distance) * (1 - np.exp(-r**2 / (2 * distance**2)))\n",
|
||||
" return a - b\n",
|
||||
"\n",
|
||||
"def collision_prob_cosine(sim):\n",
|
||||
" return 1 - np.arccos(sim) / np.pi"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"0.609548422215397"
|
||||
]
|
||||
},
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"collision_prob_l2(2, 1)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def n_hash_tables(p1, p2, n):\n",
|
||||
" return n**(np.log(p1) / np.log(p2))\n",
|
||||
" \n",
|
||||
"def n_projections(p2, n):\n",
|
||||
" return np.log(n) / (np.log(1 / p2))\n",
|
||||
" \n",
|
||||
"def p_query(p1, k, L):\n",
|
||||
" return (1 - (1 - p1**k)**L)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Simhash for Cosine similarity and hamming distance\n",
|
||||
"\n",
|
||||
"https://www.cs.princeton.edu/courses/archive/spr04/cos598B/bib/CharikarEstim.pdf\n",
|
||||
"\n",
|
||||
"https://arxiv.org/pdf/1411.3787.pdf\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def cosine_sim(a, b):\n",
|
||||
" return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def hash_l2(v, r, seed=1):\n",
|
||||
" np.random.seed(seed)\n",
|
||||
" w = np.random.randn(*v.shape)\n",
|
||||
" b = np.random.uniform(0., r)\n",
|
||||
" h = np.floor((w.dot(v) + b) / r) \n",
|
||||
" return h\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"0.7468166888933649\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"0.8466788083683645"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"p1 = collision_prob_cosine(0.7)\n",
|
||||
"print(p1)\n",
|
||||
"p_query(p1, 9, 25)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 2 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAAEWCAYAAABG030jAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3de7QcZZ3u8e9DuIlcQwRDCAYQmWEYQA3giDpRGQWOIyoqcBxBxMGsIY54POvIQUcZcM0CVGYcRVnhjoMgKEh0IpfDIOgomMQJgRCRGBBiQmIACZFRkvA7f1RtdqfTl+pLVVd1P5+1eu3u6rq8u/feT9786q23FBGYmVl1bDHoBpiZWWcc3GZmFePgNjOrGAe3mVnFOLjNzCrGwW1mVjEObhsISWdJunTQ7TCrIge3DURE/FNEfCSv/Uv6hKQnJD0j6XJJ2zRZ742S1tU9QtJxebXNrFfyBTg2bCS9HbgaeAuwArgJuCcizsyw7Qzge8DLI+L3ebbTrFvucVuuJH1K0m8kPSvpIUlvTZefLenf0ufT0l7uKZIel/S0pJmSDpW0SNLvJH21g8OeDFwWEYsj4mngXOBDHWz7bYe2ldmWg26ADS9J+wOzgEMjYoWkacCEFpscDuwHvAmYA9wCHAlsBfyXpBsi4i5JewGLgIMi4rEG+/kz4Oaa1/cBu0vaNSKebNHe7YD3An+d8Vs0GwgHt+VpI7ANcICk30bEo23WPzci/gDcJun3wLURsRpA0o+AVwN3pWG9c4v9bA88U/N67PkOQNPgBo4D1gB3tWmn2UC5VGK5iYilwBnA2cBqSddJ2qPFJqtqnv93g9fbZzz0OmDHmtdjz59ts93JwNXhEz9Wcg5uy1VEfDMi3gC8Agjg/AIOuxg4uOb1wcCqNmWSqcAMkpOaZqXm4LbcSNpf0lvSoXh/IOk1byzg0FcDp0o6QNIuwGeAK9ts80HgJxHxq7wbZ9YrB7flaRvgPJK68RPAbsBZve5U0l7peOu9Gr0fEbcAFwB3Ar9OH5+r2f4HkurbcRJwVa9tMyuCx3GbmVWMe9xmZhWTW3BLmirpTklLJC2W9PF0+dnpBRkL08cxebXBzGzQ0ikXVkt6oMn7kvSvkpamF5y9pu0+8yqVSJoMTI6In0vaAVgAvAt4P7AuIr6Yy4HNzEpE0ptIhqheHREHNnj/GOBjwDEkF6F9OSIOb7XP3HrcEbEyIn6ePn8WWAJMyet4ZmZlFBF3A0+1WOVY0usHIuIeYOe049tUIVdOppc6vxq4FzgCmCXpJGA+8Ml0Pon6bU4DTgPYbjteu+++vsizrNa+sG1P26/b2HDivrae27B1x9tsXN95X0Xr1fE2Y7ZY3/Wmfd1HIxOeL2JkZof+2Ps3u3bjmjUR8bJe9vGXM7aJp596oe1699+/YTHJUNcxsyNidoeHmwI8XvN6ebpsZbMNck9DSdsD3wHOiIi1kr5OMulPpF+/BHy4frv0m58NcNBBW8WcuZPybqp14f8998qe9/Gj372qq+3u+22rizAbe/qJHTreZpsntup4mzHbPdH1pi/afkU+AfvSx8o1j5Ye+Q28pPf93PrkJb/udR9PP/UCWTJn76lP/CEipvd4uEY9g5Y17FxHlUjaiiS0r4mIGwEiYlVEbIyIF4BLgMPybIPZoPQjtG0kLAem1rzek2Q64qbyHFUi4DJgSURcWLO8tnbzbqDhmVazVorqbQ9aXr1tK5U5wEnp6JLXAc9ERNMyCeRbKjmC5DLi+yUtTJedBZwo6RCS/wo8Cnw0xzaY9aSXMokZgKRrSebBmSRpOclVvFsBRMTFwFySESVLgeeAU9rtM7fgjogf07h2MzevY1r1dFvftt6Urb49zCLixDbvB3B6J/v0lZPWtX6cmBxWrm93Ro/8ZtBNqBQHt40E17dtmDi4rXK6OTHZDde3rawc3DYwrm+bdcfBbTZiynZi0vXtzjm4rSs+MdmcT0xa3hzcVim+8MbMwW3WkE9MWpk5uG0gfGJyMMpW37buOLjNbGB8YrI7Dm7rWJVOTBZd3y7zNK42PBzcVhm+8MYs4eC2wrm+bdYbB7fZiCjbiUnXt7vn4LaOVKm+XTRfeGNFcXBbJfjCG7NxDm6zGj4xaVWQ+13ezWr5xORguL7dmbUvbJuxLDiY+ph73GZ94Pq2FcnBbZkN6sSk69tmm3Jwm6Vc37aqcHBbYVzfHoyy1betdw5usx65vt2Zsp+YrAIHt2VSpQtvXN+2YefgtlLzxFJmm3NwWyFc3x4M17eHk4PbzArj+nZ/OLitLde3m/ONE2wQHNxWWq5vmzXm4DYbUq5vDy8Ht+XOJyYNXN/uJwe3teT6dnOub9ugOLitlFzfNmvOwW02hFzfHm4ObsuV69sGrm/3m4PbhoLr21ZWko6S9JCkpZLObPD+TpK+J+k+SYslndJun7kFt6Spku6UtCRtzMfT5RMl3S7p4fTrLnm1wXpTpRsndMP1bcubpAnARcDRwAHAiZIOqFvtdODBiDgYmAF8SdLWrfabZ497A/DJiPhT4HXA6WmDzwTuiIj9gDvS12bWJ2Wrb494meQwYGlELIuI54HrgGPr1glgB0kCtgeeIsnPpnK7WXBErARWps+flbQEmELS6BnpalcBPwQ+lVc7bHCGtb7t+beH37qN22T8/f3xJEnzaxbMjojZNa+nAI/XvF4OHF63k68Cc4AVwA7A8RHxQqujFnKXd0nTgFcD9wK7p6FORKyUtFsRbbDh5fm3bYDWRMT0Fu+rwbKoe/12YCHwFmBf4HZJP4qItc12mvvJSUnbA98BzmjVkAbbnSZpvqT5Tz7V8h8fy4Hr22Z9sRyYWvN6T5Keda1TgBsjsRR4BPiTVjvNNbglbUUS2tdExI3p4lWSJqfvTwZWN9o2ImZHxPSImL7rRA9+McvC9e3SmQfsJ2nv9ITjCSRlkVqPAW8FkLQ7sD+wrNVO8xxVIuAyYElEXFjz1hzg5PT5ycDNebXBBsf1bTOIiA3ALOBWYAlwfUQsljRT0sx0tXOB10u6n2TAxqciYk2r/eZZ4z4C+CBwv6SF6bKzgPOA6yWdSvIvzftybIMNOde3rewiYi4wt27ZxTXPVwBv62SfeY4q+TGNC/OQ/rfAysn17WoqW5nE8uPisfXdsJZJrDOub+fHwW2WkS9zt7JwcNsmPP+2Wfk5uK0UXN/ujevbo8XBbX3l+raB69t5c3CbZeD6tpWJg9teVKVhgN3Ut4e1TGKjx8FtVnFlq2+7TJI/B7f1zbDWt32Zu5WNg9sqp4rDAF3ftn5ycBtQrfp2N4a1vu0yyWhycJuZVYyD2/rC9e3mXCaxfnNw28B4GKBZdxzcVqn5SWyc69ujq5CbBdtwc5mkOZdJqum5DVsXduK8G+5xW2VUcRigWR4c3CPOwwCryWWS0ebgNmvAV0tamTm4rSdF1berWCZxfdvy4uC2wrlM0puylUmseA7uEeZhgNYPrm8Xz8FtXfMwwOZcJrE8ObitUL5a0qx3Du4R5TJJNZWtvu0yyWB0FdySvtjvhli1uEzSnMsklrdue9zv72srzJqo4jBAs7x1G9zqayusUL5asppcJrExTSeZkjSx2Vs4uEeayyTNuUxiRWg1O+ACIGgc0s/n0xyzcS6TmDXWNLgjYu8iG2LDzWWS3rhMYrU8HHDEeBhgYy6TWJU4uK0jnlTKbPAc3JY7l0l64zJJtUk6StJDkpZKOrPJOjMkLZS0WNJd7fbpW5eNEJdJGnOZxPIiaQJwEfBXwHJgnqQ5EfFgzTo7A18DjoqIxyTt1m6/mXrckr7f6rWNBpdJzDp2GLA0IpZFxPPAdcCxdev8T+DGiHgMICJWt9tp1lLJ37Z5bdaQyyS9cZmk9CZJml/zOK3u/SnA4zWvl6fLar0K2EXSDyUtkHRSu4NmKpVExEoASbsAUyNiUbttJF0OvANYHREHpsvOJgn936arnRURc7O0wXrjMkljLpNYIxvXb5H1f35rImJ6i/cbXQcTda+3BF4LvBV4CfBTSfdExC+b7bRtjzv9V2DH9ErK+4ArJF3YbjvgSuCoBsv/OSIOSR8O7YpwmcSsK8uBqTWv9wRWNFjnloj4fUSsAe4GDm610yylkp0iYi3wHuCKiHgtcGS7jSLibuCpDPu3IeUySW9cJhkK84D9JO0taWvgBGBO3To3A2+UtKWk7YDDgSWtdpoluLeUNJlkRsB+nJScJWmRpMvT0ktDkk4bqxs9+dQLfTjs6HKZpDGXSSxvEbEBmAXcShLG10fEYkkzJc1M11kC3AIsAn4GXBoRD7Tab5Ya9znpQf8zIuZJ2gd4uMvv4+vAuSQ1nnOBLwEfbrRiRMwGZgMcdNBW9TUhK5DLJGbdS0vCc+uWXVz3+gvAF7Lus21wR8QNwA01r5cBx2U9QN2+Vo09l3QJ/enBWwm5TNIbl0mslSwnJ18l6Q5JD6SvD5L0mW4OlpZcxrwbaPnfAeudyySNuUxiVZalxn0J8H+B9QDpUMAT2m0k6Vrgp8D+kpZLOhW4QNL9khYBbwY+0XXLrRBlLpO4t10M97bLJ0uNe7uI+Jm0yXDEDe02iogTGyy+LGvDrLqKKpOYjaosPe41kvYlHTQu6b3AylxbZX3hMkljLpNY1WXpcZ9OMrrjTyT9BngE+JtcW2Wl4DJJ8VwmsSyyjCpZBhwp6aXAFhHxbP7Nsqoqe5mkH71ts0FrdbPg/9VkOQARkeWydxuQXsskw3pD4H5wmcQGrVWP21dDWEe66W27TDLOZRLLqtXNgv+xyIaY5c0nJW1YZLkAZx9J35P0W0mrJd2cXvZuJVWVMol72+Pc27ZOZBkO+E3gemAysAfJ5e/X5tkoq56yn5Q0GyZZglsR8Y2I2JA+/o3NJwI3KzWXSWyYtBpVMjF9emd6Z+LrSAL7eODfC2ibdcFlkupxmcQ61WpUyQKSoB671v2jNe+NTctLine truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 2 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 2 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 2 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"for sim in [0.5, 0.7, 0.8, 0.9]:\n",
|
||||
" p1 = collision_prob_cosine(sim)\n",
|
||||
" k = np.linspace(1, 20)\n",
|
||||
" L = np.linspace(1, 25)\n",
|
||||
"\n",
|
||||
" kk, ll = np.meshgrid(k, L)\n",
|
||||
"\n",
|
||||
" plt.title(f\"sim: {sim}\")\n",
|
||||
" plt.contourf(kk, ll, p_query(p1, kk, ll), levels=10)\n",
|
||||
" plt.xlabel(\"hash projections: k\")\n",
|
||||
" plt.ylabel(\"hash tables: L\")\n",
|
||||
" plt.colorbar()\n",
|
||||
" plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Gap amplification\n",
|
||||
"\n",
|
||||
"$$P(h(x) = h(y)) = 1 - (1 - P_h^k)^L$$\n",
|
||||
"\n",
|
||||
"where $P_h$ is similarity function."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def collision_prob(k, L, ph):\n",
|
||||
" return 1 - (1 - ph**k)**L"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 31,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<matplotlib.legend.Legend at 0x7ffb155ee780>"
|
||||
]
|
||||
},
|
||||
"execution_count": 31,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA0AAAAHwCAYAAACPNg8eAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzdeVzVZf7//8fFIiAoCLgDouKC+5Zbu2maZTbTomnr2DR9Z6qZmvZmfjWfz+Q0Y/u0l9NeOlNN5pZbaeaSSy6VgCAqICgIirIKnOv3B9hHTQWRw/sczvN+u3U7nPd5n+v9BEfnvLje1+sy1lpERERERER8gZ/TAURERERERBqLCiAREREREfEZKoBERERERMRnqAASERERERGfoQJIRERERER8hgogERERERHxGSqARESkSTHGLDfG3Fbz9VRjzOJjXjvXGJNqjCkyxlxljFlojLnZDRleNcb8uaHHFRGRs2e0D5CIiG8yxkwG7gH6AMXATuAd4BXrxf/nYIxZDrxvrX3zJK8tAz631j7fgNe7BbjNWnteQ40pIiLuoxkgEREfZIz5I/A8MANoB7QF7gDOBZo5GM3dOgE/Oh1CREScowJIRMTHGGPCgf8Bfmut/dhae9hW22StnWqtLa8573JjzCZjzCFjTKYx5vFjxog3xlhjzO3GmGxjTE5NUXWqa9ZlrFtrXjtgjLnDGHOOMWarMeagMebFY86/xRizyhjzT2NMoTEm2RhzySmue4sx5puar3cAXYC5NbfABR17u1zNOb82xiQZYw4bY7YZYwbVHH/IGLPjmOO/qDmeCLwKjKgZ82DN8beNMX89Ydw0Y0yBMeZzY0yHY16zNd9vas33/pIxxtTlz1JERM6cCiAREd8zAggC5tRyXjFwExABXA78P2PMVSecczHQDbgUeMgYM/osxhpWM9Yk4DngUWA00Bu4zhhz4QnnpgPRwGPAp8aYyNN9M9barkAGMMFaG3a00DvKGHMt8HhNzpbAlUB+zcs7gPOBcOAvwPvGmPbW2iSqZ87W1IwZceJ1jTGjgL8B1wHtgd3ArBNOuwI4B+hfc97Y030vIiJSfyqARER8TzSw31pbefSAMWZ1zUxLqTHmAgBr7XJr7ffWWpe1divwEXDhCWP9xVpbbK39HngLuP5kF6zjWP9rrS2z1i6mumD6yFqba63dA6wEBh5zbi7wnLW2wlo7G0ihurA6G7cB/7DWrq+ZEUuz1u6uyf8fa212Tf7ZQCowtI7jTgX+Za39rqboepjqGaP4Y8550lp70FqbAXwFDDjL70VERE5BBZCIiO/JB6KNMQFHD1hrR9bMXuRT8/8NxphhxpivjDF5xphCqmc6ok8YK/OYr3cDHTiJOo6175ivS0/yPOyY53tOaNRwymufgViqZ3p+xhhzkzFmc02ReJDqxhEn5j+VDjX5ALDWFlH9c+54zDl7j/m6hOO/VxERaUAqgEREfM8aoByYWMt5HwKfA7HW2nCq17qcuDYl9piv44DssxjrTHQ8YZ3M6a5dV5lA1xMPGmM6AW8AdwJRNYXiD/xf/to65mVT3Xzh6HihQBSw5yzziohIPagAEhHxMdbag1SvY3nZGHONMSbMGONnjBkAhB5zagugwFpbZowZCkw5yXB/NsY0N8b0Bm4FZp/isnUZ60y0Ae42xgTWrN1JBBac5ZhvAvcZYwabagk1xU8o1UVOHoAx5laqZ4CO2gfEGGNO1T3vQ+BWY8wAY0wQMB341lq76yzziohIPQTUfoqIiDQ11tp/GGP2AA8A71K95iYdeBBYXXPab4GnazqwrQD+TXUTg2OtANKo/oXaUzXrd06mLmOdiW+pbpiwn+oC5Bprbf7p33J61tr/GGOiqC5YOgK7gButtZuMMU9TPXPmovrnteqYt35JdWvtvcYYl7U2+oRxl5nqTVE/AVpR/fOdfDZZRUSk/rQRqoiInLGaBfw7gcBjmyk00rVvQRuPiohIPekWOBERERER8RkqgERERERExGfoFjgREREREfEZmgESERERERGfoQJIRERERER8hte1wY6Ojrbx8fFOxxAREREREQ+1cePG/dba1id7zesKoPj4eDZs2OB0DBERERER8VDGmN2nek23wImIiIiIiM9QASQiIiIiIj5DBZCIiIiIiPgMr1sDdDIVFRVkZWVRVlbmdBSfEBwcTExMDIGBgU5HERERERE5I02iAMrKyqJFixbEx8djjHE6TpNmrSU/P5+srCw6d+7sdBwRERERkTPSJG6BKysrIyoqSsVPIzDGEBUVpdk2EREREfFKTaIAAlT8NCL9rEVERETEWzWZAshJu3btok+fPvV676OPPkpsbCxhYWGnPOftt9/mzjvvPOOxv/76awYN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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 1008x576 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"k = 1\n",
|
||||
"L = 1\n",
|
||||
"ph = np.linspace(0, 1)\n",
|
||||
"plt.figure(figsize=(14, 8))\n",
|
||||
"plt.title(\"Gap amplification\")\n",
|
||||
"plt.xlabel(\"similarity\")\n",
|
||||
"plt.ylabel(\"collision probability\");\n",
|
||||
"plt.plot(ph, collision_prob(k, L, ph), label=f\"k={k} L={L}\")\n",
|
||||
"k = 10\n",
|
||||
"L = 1\n",
|
||||
"plt.plot(ph, collision_prob(k, L, ph), label=f\"k={k} L={L}\")\n",
|
||||
"k = 10\n",
|
||||
"L = 13\n",
|
||||
"plt.plot(ph, collision_prob(k, L, ph), label=f\"k={k} L={L}\")\n",
|
||||
"plt.legend()"
|
||||
]
|
||||
}
|
||||
],
|
||||
"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.7.3"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
Reference in new issue
Block a user