Created
January 28, 2015 03:42
-
-
Save cjauvin/d1daeaf78b4e7264422f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "metadata": { | |
| "name": "", | |
| "signature": "sha256:964c520d798a29a2fc3c585d0390e941e55f27276cbc1b5da19f1e879280eb7f" | |
| }, | |
| "nbformat": 3, | |
| "nbformat_minor": 0, | |
| "worksheets": [ | |
| { | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "minutia_prob = 0.2\n", | |
| "g = np.floor(np.random.random((100, 100)) + minutia_prob)\n", | |
| "plt.imshow(g, cmap='Greys', interpolation='nearest')\n", | |
| "plt.axis('off');" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\n2ffP35Y5nerel7erOg96up1BR+/vb46hW1/erm65+26GdbtPMTtz3H189OfBFR4AIyh4AIyg4AEw\nQqsMr1vm9dS9L6ub7D660+ffngsY3aP0kz68t70np9uPnhV5e3+726t2u/d593x+fn5++3hXeACM\noOABMIKCB8AIrTK8U9364Kr7wp66Hc/K7v370+1n92CdPv4nxxu9zexeyOreyW7foertrzK60/d3\n5bm9r6+vbx/vCg+AERQ8AEZQ8AAY4dUZ3mmGs7u9bhnPSnY+cnsO49PttbWi50LuPv83iJ4F2S1H\njn7+7fX6bvcB3u6NPd2fKzwARlDwABhBwQNghFYZ3u371yvd1+rafX723MHqTKv6/N0+nhtOZyF2\nnwV5+zNX3at6+n5kH3/158cVHgAjKHgAjKDgATBCqwzvds/J6f6qZ1uunn+77y4708pWndHe6FuM\n/oycOs3ps89p9Xcs+zfwturfAFd4AIyg4AEwgoIHwAitMryn7mtddZPdd7dyO6+53UN2qtucwz89\nJzvj6da3F52xrR6/u//qPshu83FXj19xhQfACAoeACMoeACM0DrDq+6Lur296vXqVm4fz2n+cLq/\n0wzwVHReE3EMT92+M9Hn6G29pdW59K7o+bqn30FXeACMoOABMIKCB8AIrTO86vv13dZLu90Ht6vb\n2lnRfXu7/x/txv6yZzvufsaq10vLzuVvz9M93V92r+rt31xXeACMoOABMIKCB8AIrTO8p+z79dk9\nSivRa3U9vX39vG4Z3O0MMmKW5m3dMqPd/Xfvc3uq7pPszhUeACMoeACMoOABMMKrMrxot3tsokX3\nTHXLKE91n/sY/fgKv+0zsyt7/cDbbn9nVrLnybrCA2AEBQ+AERQ8AEZ4dYaXfT/99ty6ler8oHs+\n0+14dt2eIxghepZmh9f0b2873lO7mVn03wXsHt8pV3gAjKDgATCCggfACK/K8Hbvr5/eL77dx7b7\neqr7/lbHezv/yJ5NmX28p32hf7ON37Zm4NPbj79a9es//Y3//Pz89vmu8AAYQcEDYAQFD4ARXpXh\nZc/xO53rdjr78lT22l6r/UXP2Xs6zewm9GB1y7BOP5Pde0N3Vff2nn4+TnPx2++fKzwARlDwABhB\nwQNghFdleCu37//enht4mrlF95XdzkRX+9s9nog+tki3+/gq8qrqz+TT7fXbuve+PlX39lb3rn59\nfX37eFd4AIyg4AEwgoIHwAivzvCiM6bT7UXff8/uO3zKzlduZ5y7+8uW0VOW3bfWva+v22fgKXv+\n66nb38nT7bvCA2AEBQ+AERQ8AEZ4VYbXPbN6+/6r5xKe5i/V+cbtDPhvtnc7N67+jK50P76V0/Xg\nun9nq7nCA2AEBQ+AERQ8AEZ4VYaXncGc7r967apd1X1/p7odf0WfYLf3JNvpmojZx/N0O/e9/f8r\n0fOGd7nCA2AEBQ+AERQ8AEZ4VYZ32qOyenz3/CN7Vmj0/frsWZm72189fnf7T9H5yU+OoZvb69Hd\nXvNwJXsNytPvUHYfZvbn1RUeACMoeACMoOABMEKrDG93FmL0/f/oHpTbPT/ZPT67bj//bevhZWSQ\nu5lV99mLv+31rJ5/uv2398re5goPgBEUPABGUPAAGKFVhtc9g9n19gwqO4Nc2c10335+Vrp//v+k\n22f8VHXOXd1nGJ0xnm7v8/Pz28e7wgNgBAUPgBEUPABGaJXhVTvtY8tei2r3+J5O+x5v95VVZ3C7\n5yd6+yt/+jx069P67fvbdfs7dHt/u/vfffzp6/n6+vr2+a7wABhBwQNgBAUPgBF+VYZXnZGdrve2\nK7sH6HYecnstr9PjWck+3p88P3u+bPb82Oz153a9/fzvyl5zcsUVHgAjKHgAjKDgATDCr8rwqufa\nPUXfX789d6/6fv9T97XNoucY7r4/f9OHF50BVfe5vS2nfZvo3tBu58cVHgAjKHgAjKDgATDCr8rw\nVt6eNzztZj7V99NPM6rbs0J3Rc8xrOiLPN3n7XmhT9Nmc3b/u4Kn7u+vKzwARlDwABhBwQNghFEZ\nXnae0G0tqpXqvOIpO0+InrVaff4yjiF7Dcls3XtBu/VJnrp9vK7wABhBwQNgBAUPgBFGZXjZGVr1\n/fXojPH0+KvzhNO5kU8dM9Ts9/RU9hqSp25/Jrq/X7f3f/v8usIDYAQFD4ARFDwARvhVGV73tZyy\n58xVH3/2/f7ojPLp9vuXMRvz7RlQt89g9Pk+/Yzc/k243duqDw8AAih4AIyg4AEwwj+fn5/vGrYG\nAD/gCg+AERQ8AEZQ8AAYQcEDYAQFD4ARFDwARlDwABhBwQNgBAUPgBEUPABGUPAAGEHBA2AEBQ+A\nERQ8AEZQ8AAYQcEDYAQFD4ARFDwARlDwABhBwQNgBAUPgBEUPABGUPAAGEHBA2AEBQ+AERQ8AEZQ\n8AAYQcEDYAQFD4ARFDwARlDwABhBwQNgBAUPgBH+D6wE4kL2JxsaAAAAAElFTkSuQmCC\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x112d306d0>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 73 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "from mpl_toolkits.axes_grid1 import ImageGrid\n", | |
| "\n", | |
| "# return a similar grid where bits are flipped with a certain prob\n", | |
| "def get_dupe(g, minutia_agreement_prob=0.8):\n", | |
| " h = g.flatten()\n", | |
| " pos = np.argwhere(h == True).flatten()\n", | |
| " n_pos = len(pos)\n", | |
| " js = int((n_pos - (n_pos * minutia_agreement_prob)) /\n", | |
| " (1 + minutia_agreement_prob))\n", | |
| " n_pos_to_flip = n_pos - js\n", | |
| " p = n_pos_to_flip / n_pos\n", | |
| " pos_flip = np.random.random(n_pos) > p\n", | |
| " neg = np.argwhere(h == False).flatten()\n", | |
| " h[pos] = np.logical_xor(h[pos], pos_flip)\n", | |
| " h[np.random.choice(neg, sum(pos_flip), replace=False)] = True\n", | |
| " return h.reshape(g.shape)\n", | |
| "\n", | |
| "fig = figure(1, (10, 12))\n", | |
| "grid = ImageGrid(fig, 111,\n", | |
| " nrows_ncols=(2, 2),\n", | |
| " axes_pad=0.25,\n", | |
| " share_all=True)\n", | |
| "\n", | |
| "for i, prob in zip(range(4), [0.25, 0.50, 0.75, 1]): \n", | |
| " grid[i].imshow(get_dupe(g, prob), \n", | |
| " cmap='Greys', interpolation='nearest')\n", | |
| " grid[i].set_axis_off()\n", | |
| " grid[i].set_title('minutia_agreement_prob=%.2f' % prob)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "iVBORw0KGgoAAAANSUhEUgAAAzMAAANICAYAAADzTrG0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3XmU1cWd//9Xy6ICEQRcCGhEQVBUkAgkblF0XCOKUVEG\nSZQwJlEHY4xk5jseHZMZlxmjZ5SZiToiEuWMDMTETASJdEdMAoTIZmJImgxhCRAVhW5oZevfH/y6\npW/fvp+uW8unqnk+zsnJkXs/VfVZ61Z/3u+qisrKynoBAAAAQGIOyrsBAAAAAFAOBjMAAAAAksRg\nBgAAAECSGMwAAAAASBKDGQAAAABJYjADAAAAIEkMZgAAAAAkicEMAAAAgCQxmAEAAACQJAYznjz7\n7LMaOXKkli1blndTmnnwwQc1cuRIbd68Oe+mAE4sW7ZMI0eO1LRp0/JuCmCN/gMIh/4jfe3zbkBb\nVVFR0fi/0J599lk999xzevTRRzV48OAW24YD26ZNmzR27FhdfPHFmjx5ct7NSdaePXs0e/ZszZkz\nRxs2bNDBBx+sk046STfeeKMGDRrU6nIWL16shQsXasWKFfrLX/6ijz76SEcddZRGjBihsWPH6vDD\nD2+2zR133KEVK1a0WObcuXPVoUOHsvYL+aH/QOzoP9xw1X803LcteeihhzRs2LBm/75t2zY999xz\neuONN7RlyxZ17dpVw4YN00033aQjjjiirH3KA4MZT6666iqNHDlSRx55ZN5NaWbixIkaO3asevbs\nmXdTgKTV19fr29/+tl5//XUde+yxGj16tLZt26bKykpNmjRJ//iP/6izzjors5ydO3fqW9/6ljp0\n6KDTTjtNZ5xxhvbu3as333xTs2bN0vz58/Vv//Zv6t27d9Htv/jFLxb994MO4uV7iug/gLbPVf+x\nv4svvlhHH310s38v1nds3bpVt99+u9avX6+hQ4fqggsu0Nq1azVnzhwtXLhQU6ZMUa9evcrev5AY\nzHjStWtXde3aNdc21NfXF/337t27q3v37oFbA7Q98+fP1+uvv65TTjlFjzzySONbkFGjRun222/X\nI488oqFDh+rQQw8tWU67du00YcIEXXnllerSpUvjv9fX1+uxxx7Tyy+/rH//93/XP/3TPzXbtqKi\nosXBDNJE/wG0fa76j/1dcsklRd+oFvP0009r/fr1uu666/SVr3yl8d9nz56tJ554Qo899pgeeugh\ns53KCYOZ/ez/2nTcuHF68skntWzZMu3evVsnn3yyvva1r6lv37764IMP9NRTT2nhwoWqra1V3759\n9ZWvfEVDhgxpLKulV/UjR47U4MGDdd999+mpp57SL3/5S9XU1Kh3794aM2aMLrnkkiZtmjNnjh5+\n+GHdfffdzT7bv7xHH31UknT99dfrL3/5iyTpzjvvbPLd+fPnS9oX8/zqq69qxowZOuqoo5rU9Ytf\n/ELV1dXasmWL2rdvr759+2rUqFH6q7/6q7KP67p16/TKK6/o17/+tTZv3qwdO3aoe/fuGjZsmMaP\nH1/0VebOnTv1wgsv6NVXX9W7776rnj176sILL9S4ceMab9aGfZY+Pt7f/e539e6772rWrFlas2aN\nunXrphkzZkiSPvzwQ82aNUuVlZXasGGDKioqdPzxx+vqq6/WyJEji7Z98eLFmj17tt5++23V1dXp\niCOO0DnnnKNx48Y1+dEp7Tv2FRUVeuaZZ/TMM8/oZz/7mbZt26Y+ffroS1/6ks4++2zt2bNHL7zw\ngubOnat33nlHPXv21DXXXKPRo0c7q3/q1Kl69tlnVVlZqffff19HHnmkLr/8ct1www3Njpe0LxRp\n7ty5jZ+1dK21ZP/75oYbbtCTTz6pFStWaNeuXerfv7/Gjx+vM844o8k2+1/X3bt31wsvvKDq6mrt\n2LGj8Tqtra3VjBkztGDBAm3evFkHH3ywBg4cqDFjxujTn/50i+35zW9+o2eeeUarVq1SfX29Bg0a\npAkTJmjAgAGt3qfW+tGPfiRJuvnmm5uEcw0YMEDnn3++5s2bp5/97GeZx7Ndu3b667/+62b/XlFR\nofHjx+vll1/W8uXL3TYeTtF/0H8Uov/IRv9h33+Uo66uTvPmzdOhhx7a7I9ho0eP1osvvqhf/epX\n2rhxYxJvZxjMFLFp0ybdeuut+tSnPqVLL71UGzdu1BtvvKE77rhDjz/+uL71rW+pS5cuGjlyZOMr\nwcmTJ2v69OmtCguora3V7bffrg4dOui8887Trl27VFVVpYcfflgVFRW6+OKLm21TKkZ5/8+uueYa\n/fznP9fy5ctbfN3YUnmPPfaY+vbtq8GDB6tHjx7aunWrFi1apAceeEDr1q3TzTffnLlvxSxYsEAv\nv/yyTj/9dJ166qlq37691qxZo5/85Cf65S9/qf/8z/9sErJQX1+ve++9V4sWLVKfPn109dVXa9eu\nXZozZ47+7//+r+TxmDlzppYsWaIzzzxTQ4cO1fbt2yXtO+Z33nmnqqurdeKJJ+qyyy5TfX29Fi9e\nrO985ztas2ZNs/2bNm2apk2bpsMOO0xnnnmmunXrptWrV+vFF1/UokWLNGXKFHXq1KnJMd29e7e+\n+c1vqqamRmeffbZ27dql+fPn695779VDDz2kl156Sb///e81YsQIdejQQVVVVXr88cfVrVs3nX/+\n+c7q37Jliz7zmc+oXbt2WrBggZ566int3Lmz8aE1ZMgQbd++XbNmzVK/fv2avMru379/OadZGzdu\n1G233abjjz9eo0aN0nvvvdd4b/zDP/xDs/2TpNdff12LFy/WiBEjdOWVV2rTpk2N5+u2227T2rVr\nNXDgQJ1zzjnaunWrqqqqdPfdd+uOO+7QFVdc0ay8t99+W88//7zOOOMMjR49WuvXr9eCBQu0YsUK\n/cu//ItOPfXUsvatmJ07d+qtt97SIYccotNOO63Z5yNGjNC8efO0dOlSq86oXbt2Tf6/UH19vSor\nK7Vx40a1b99exx13nE4//XRyZXJC/0H/IdF/mKL/aKrc/mPlypX63e9+p7179+roo4/W0KFDi77l\n/e1vf6udO3dq2LBhzd78VFRUaPjw4frxj3+spUuXMphJ1fLlyzVhwoQmfymdPn26pk6dqq997Wu6\n4IIL9PWvf73xszPOOEMPPPCAZs6cqVtvvTWz/NWrV+uyyy7TN77xjcaH6he+8AVNmDBBM2bMKNoZ\ntdY111yj2tpaLV++vOTrxmIhBFOnTm120e7evVuTJ0/WjBkzNGrUqLLipC+66CJdd911at++6eW2\nZMmSxk58/+M5b948LVq0SKeddpoeeeSRxh9xN910U+bxXbp0qaZMmaJ+/fo1+fcnnnhC1dXVuuWW\nWzRmzJjGf9+5c6fuuecePf/88zr33HMbt1u6dKmmTZumQYMG6cEHH1Tnzp0bt2n4q9DUqVObtKe+\nvl7vvfeeTjzxRD322GON+3vRRRdp0qRJuu+++3TMMcdo6tSpjeVde+21+uIXv6gZM2Y0eVjb1N+v\nXz898sgj6tixoyRp/PjxuvHGG/U///M/GjdunNq1a6chQ4bo6KOP1qxZs3TCCSc4CVNasWKFxowZ\no1tuuaXx36666irddtttevTRRzVixIgmnackLVq0SA8++GCzxMTvfe97Wrt2ra644oom18YNN9yg\nW265RY8//riGDRvW7MfW4sWL9bd/+7e66qqrGv/t5z//ue655x49/PDDeu655xrvuU2bNmnOnDlG\n+3jJJZc01rlhwwbV19erV69eRXNTGmKU169fb1RHoVdeeUWSiiZvNuzLt7/97Sb/3q1bN02aNEmf\n+9znrOqGOfqPj9F/0H+0Fv1HU+X2H88880yT/+7QoYPGjBnTbLC9du1aSVKfPn2KltNQ/4YNG4zq\nzwvZoUX06tVLY8eObfJvDR3E3r17m8QWStIFF1ygdu3aafXq1a0q/5BDDtGtt97a5K9Dn/rUpzRo\n0CCtW7dOH374oeUelKfY6Lt9+/a68sortWfPHr355ptllduzZ89mHZG0rxM/7rjjtGTJkib/3vDK\nesKECU3+Gt2lSxfdeOONJev6/Oc/36wj2rp1q+bNm6cBAwY06YgkqWPHjpo4caLq6+v12muvNf77\n7NmzJUl33XVXk45A2vdAOuGEE5p8v0FFRYVuu+22Jvt76qmn6uijj1ZdXZ1uueWWJuX16tVLgwYN\n0po1a5r8QLCp//bbb2/siKR9P2zPPPNMbd++XevWrWu2jStdunTR+PHjm/zbgAEDdOGFF6q2tlYL\nFixots1ZZ53VrCPatWuXfvrTn6pTp06aOHFik8969+6tq6++Wrt379arr77arLw+ffo06Yga6hg8\neLA2bNjQZOavTZs26bnnnmv1/6ZPn95kOtqGv9oWhms0aDhvtbW1RT9vjd/97neaNm2aOnXqpAkT\nJjT7/KyzztI///M/a+bMmZo7d66mTZumsWPHqra2Vvfff78WL15cdt0oD/3Hx+g/6D9ai/6jKdP+\no1+/frr77rsbwxD/+7//W9/4xjfUpUsXff/739fTTz/d5PsN9RdeH+XWnzfezBRxwgknNHsN3aNH\nD0n7LvbCV3IHHXSQunXrpnfffbdV5RcrQ5KOPPJI1dfXq6amRoccckiZrS/f5s2bNWPGDL355pt6\n55139NFHHzX5/L333iu77Hnz5mnOnDlavXq1amtrtXfv3sbPCsNhqqurddBBBxWdlvCUU04pWc/A\ngQOb/VtD7Ku0L9a30O7duyV9/JcKaV/cbPv27VVVVVX0r5C7du3SBx98oJqaGn3iE59o/PcuXboU\n7dR79OihzZs368QTT2z2Wc+ePbV7925t2bKl8Tort/7OnTvrk5/8ZLPvN4Sv1NTUNPvMlf79+xe9\n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\ncTU1NY2hZUOHDtVbb72lt956q1l911xzTeNfGpctW6bvfve7Ou2003T00UfrsMMO0+bNm7Vo0SLt\n2LFDAwYMaDLNKQ489B/0H/Qfbb//2Lp1q770pS9pwIABOvbYY9WjRw998MEHWrZsmTZt2qRu3brp\nnnvuaVb/l7/8ZS1btkwzZ85UdXW1Bg4cqD/96U/6xS9+ocMPP1yTJk1yvs++MJhxpPDhWFFRYfzA\nbGmbu+66S4cffrjmz5+vH/7whzrqqKP0hS98Qdddd13RTuLYY4/Vt771Lb344ov60Y9+pJ07d6qi\noqKxMypWz/HHH69HH31U//Vf/6WFCxdqz5496tevn+6//3517ty57M5I2rci8Cc/+UlVVlbqhz/8\noQ4//HCdeeaZ+tKXvqR777236D7ff//9ev755zVv3jz94Ac/UM+ePXXJJZdo1KhReuONN5rFz2Yd\n706dOumxxx7Tyy+/rNdee00LFizQzp071b17d/Xp00e33nprs1WBb7jhBp1yyimaPXu23nrrLf3i\nF79Qly5d1LNnT11xxRW64IILmrWhJaXa19JnIer/u7/7O/37v/+7Fi9e3Dgzy5FHHllWZ9SrVy/d\neeedevLJJ/Xyyy9r165dGjBgQNEVnLPa+4lPfEJPPPGEXnjhBS1YsEAzZ87UIYccopNOOknXX399\niys4n3TSSRo/fryeeeaZxnjxT3/6095WcJake+65Rz/4wQ/0yiuv6KWXXtLBBx+sIUOG6MYbb9TJ\nJ5/c7PsN52L//d++fbtqampUUVGhN998s+g0thUVFbr00ksbBzMDBgzQBRdcoN///vf6wx/+oB07\ndqhTp0464YQTdN5552nUqFEtLrSJuNB/tIz+g/6D/uNjxfqPww47TKNHj9bvfvc7LVmyRDU1NerQ\noYM++clP6oYbbtB1111XNNz4sMMO05QpUzRt2jS98cYbWrlypbp27apLL71UN910U1nrQuWlorKy\nsvXDfSBnS5Ys0d13362xY8fqy1/+ct7NgfaFO40dO1YXX3yxJk+enHdzAKAo+o/40H/ABYKpEaVi\ncb5bt27Vk08+qYqKilbHzwIADiz0H8CBhTAzRGnKlCn64x//qJNPPlndunXTO++8o8WLF6umpkZX\nXHGFt1e+AIC00X8ABxYGMzA2Z86cJjO3tKRfv37NVqVtrXPPPVcffPCBFi5cqNraWnXs2FHHHXec\n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\n7du3V9++fTVq1KgmoS2m1q1bp1deeUW//vWvtXnzZu3YsUPdu3fXsGHDNH78+KKvMnfu3KkXXnhB\nr776qt5991317NlTF154ocaNG6dLLrmkyT5LHx/v7373u3r33Xc1a9YsrVmzRt26ddOMGTMkSR9+\n+KFmzZqlyspKbdiwQRUVFTr++ON19dVXtxjis3jxYs2ePVtvv/226urqdMQRR+icc87RuHHj1KVL\nlybfvf7661VRUaFnnnlGzzzzjH72s59p27Zt6tOnj770pS/p7LPP1p49e/TCCy9o7ty5euedd9Sz\nZ09dc801Gj16tLP6p06dqmeffVaVlZV6//33deSRR+ryyy/XDTfc0Ox4SftCkebOndv4WUvXWkv2\nv29uuOEGPfnkk1qxYoV27dql/v37a/z48c3eKOx/XXfv3l0vvPCCqqurtWPHjsbrtLa2VjNmzNCC\nBQu0efNmHXzwwRo4cKDGjBmjT3/60y225ze/+Y2eeeYZrVq1SvX19Ro0aJAmTJigAQMGtHqfWqth\noHHzzTc3CecaMGCAzj//fM2bN08/+9nPjI5noR//+MeSpCuuuMKusfCK/oP+oxD9R7YDuf845phj\nnJVl2hfV1dVp3rx5OvTQQ5v9MWz06NF68cUX9atf/UobN25M4u0Mg5kiNm3apFtvvVWf+tSndOml\nl2rjxo164403dMcdd+jxxx/Xt771LXXp0kUjR45sfI03efJkTZ8+vVVhAbW1tbr99tvVoUMHnXfe\nedq1a5eqqqr08MMPq6KiQhdffHGzbUrFKO//2TXXXKOf//znWr58uS6++GIdffTRmds0eOyxx9S3\nb18NHjxYPXr00NatW7Vo0SI98MADWrdunW6++ebMfStmwYIFevnll3X66afr1FNPVfv27bVmzRr9\n5Cc/0S9/+Uv953/+Z5OQhfr6et17771atGiR+vTpo6uvvlq7du3SnDlz9H//938lj8fMmTO1ZMkS\nnXnmmRo6dKi2b98uad8xv/POO1VdXa0TTzxRl112merr67V48WJ95zvf0Zo1a5rt37Rp0zRt2jQd\ndthhOvPMM9WtWzetXr1aL774ohYtWqQpU6aoU6dOTY7p7t279c1vflM1NTU6++yztWvXLs2fP1/3\n3nuvHnroIb300kv6/e9/rxEjRqhDhw6qqqrS448/rm7duun88893Vv+WLVv0mc98Ru3atdOCBQv0\n1FNPaefOnY0PrSFDhmj79u2aNWuW+vXr1+T1c//+/cs5zdq4caNuu+02HX/88Ro1apTee++9xnvj\nH/7hH5rtnyS9/vrrWrx4sUaMGKErr7xSmzZtajxft912m9auXauBAwfqnHPO0datW1VVVaW7775b\nd9xxR9Ef92+//baef/55nXHGGRo9erTWr1+vBQsWaMWKFfqXf/kXnXrqqWXtWzE7d+7UW2+9pUMO\nOUSnnXZas89HjBihefPmaenSpWUPZlatWqXq6mr16tWrxRCz+vp6VVZWauPGjWrfvr2OO+44nX76\n6eTK5IT+g/5Dov8wdaD1Hy61ti968803G/ui3/72t9q5c6eGDRvWLHKgoqJCw4cP149//GMtXbqU\nwUyqli9frgkTJuiv//qvG/9t+vTpmjp1qr72ta/pggsu0Ne//vXGz8444ww98MADmjlzpm699dbM\n8levXq3LLrtM3/jGNxofql/4whc0YcIEzZgxo2hn1FrXXHONamtrtXz58sa/QBVTLIRg6tSpzS7a\n3bt3a/LkyZoxY4ZGjRpVVpz0RRddpOuuu07t2ze93JYsWdLYie9/POfNm6dFixbptNNO0yOPPKJ2\n7dpJkm666abM47t06VJNmTJF/fr1a/LvTzzxhKqrq3XLLbdozJgxjf++c+dO3XPPPXr++ed17rnn\nNm63dOlSTZs2TYMGDdKDDz6ozp07N27T8FehqVOnNmlPfX293nvvPZ144ol67LHHGvf3oosu0qRJ\nk3TffffpmGOO0dSpUxvLu/baa/XFL35RM2bMaPKwtqm/X79+euSRR9SxY0dJ0vjx43XjjTfqf/7n\nfzRu3Di1a9dOQ4YM0dFHH61Zs2bphBNOcBKmtGLFCo0ZM0a33HJL479dddVVuu222/Too49qxIgR\nTTpPSVq0aJEefPBBDRs2rMm/f+9739PatWt1xRVXNLk2brjhBt1yyy16/PHHNWzYsGY/thYvXqy/\n/du/1VVXXdX4bz//+c91zz336OGHH9Zzzz3XeM9t2rRJc+bMMdrHSy65pLHODRs2qL6+Xr169Sqa\nm9K7d29J0vr1643q2F/DW5nLL7+86OcN+/Ltb3+7yb9369ZNkyZN0uc+97my60Z56D8+Rv9B/9Fa\nB1r/4VJr+6INGzY0/tvatWslSX369ClaZrFtYkZ2aBG9evXS2LFjm/xbQwexd+/eJrGFknTBBReo\nXbt2Wr16davKP+SQQ3Trrbc2+evQpz71KQ0aNEjr1q3Thx9+aLkH5Sk2+m7fvr2uvPJK7dmzR2++\n+WZZ5fbs2bNZRyTt68SPO+44LVmypMm/N7yynjBhQmNHJEldunTRjTfeWLKuz3/+8806oq1bt2re\nvHkaMGBAk45Ikjp27KiJEyeqvr5er732WuO/z549W5J01113NekIpH0PpBNOOKHJ9xtUVFTotttu\na7K/p556qo4++mjV1dXplltuaVJer169NGjQIK1Zs6bJDwSb+m+//fbGjkja98P2zDPP1Pbt27Vu\n3bpm27jSpUsXjR8/vsm/DRgwQBdeeKFqa2u1YMGCZtucddZZzTqiXbt26ac//ak6deqkiRMnNvms\nd+/euvrqq7V79269+uqrzcrr06dPk46ooY7Bgwdrw4YNTWb+2rRpk5577rlW/2/69OlNpqNt+Ktt\nYbhGg4bzVltbW/TzLHV1dZo/f77at2+vSy+9tOh3zjrrLP3zP/+zZs6cqblz52ratGkaO3asamtr\ndf/992vx4sVl1Y3y0X98jP6D/qO1DrT+w6Vy+qKGbQqvj1LbxIw3M0WccMIJzV5D9+jRQ9K+i73w\nldxBBx2kbt266d13321V+cXKkKQjjzxS9fX1qqmp0SGHHFJm68u3efNmzZgxQ2+++abeeecdffTR\nR00+f++998oue968eZozZ45Wr16t2tpa7d27t/GzwnCY6upqHXTQQUWnEjzllFNK1jNw4MBm/9YQ\n+yrti/UttHv3bkkf/6VC2hc32759e1VVVRX9K+SuXbv0wQcfqKamRp/4xCca/71Lly5FO/UePXpo\n8+bNOvHEE5t91rNnT+3evVtbtmxpvM7Krb9z58765Cc/2ez7DeErNTU1zT5zpX///kWv68GDB2vu\n3Lmqrq5u9lfjk046qdn3161bp48++kinnnpq0Yfz0KFD9f3vf1/V1dXNPmspDGDw4MFavny5qqur\nG//aPGTIkMb46hi99tprqqur07nnnls08V/a95f0/R1zzDH68pe/rB49eujxxx/X008/reHDh4do\nLv5/9B/0H/Qf5ug/YIPBTBHFRqoNf+FpaeTbrl27xodallJlSGryoA7lz3/+s7761a+qtrZWgwcP\n1vDhw9W5c2cddNBB2rRpk+bOnaudO3eWVfaUKVM0a9Ys9ejRQ8OHD9cRRxzR+JefOXPmNCacNqit\nrVXXrl2Lvi7NmkWn2Odbt26VtK9TWrVqVdHtKioqVFdX1/jf27Zt0969e0suotWwTWFnUEzDuS18\nTb7/Z/tfP+XWn+e11dIP7oZz0vCXoKxtGr7X0rlu+PdifzEqpw3lyvrLVdZfy7I0hJh9/vOfN972\n8ssv15QpU7R69WrV1dW1ajY1uEH/Qf9B/2HuQOs/XCqnL2rYpqV9su2/QmMwE7mGv/Dt2bOn2Wcu\nX//NnDlTNTU1mjx5crO/frz22mtNZisx8f7772v27Nnq27evnnjiiWY/qoq96u7cuXPjw7iwQ9qy\nZUvJ+ooldjbcjNdee62++tWvtqrdDTf6D3/4w1Z937W86y/H+++/X/TfG85ZsY662Plq+F5L57rh\nL7zFHrImbbCNee7du7cqKiq0ceNG7dmzp0lIi/RxrkxLMcmlVFdX6/e//33JxP9SOnbsqE6dOmn7\n9u368MMPGcwcoOg/6D9ScaD1Hy6V0xcde+yxTT4rZNN/5YHBTOQa/mpS+NcnSS3+lajhAW7yV5SG\nqSbPPffcZp8tX7681eUU2rhxo+rr64vOmPHOO+/oz3/+c7Nt+vfvr6VLl+qtt95qNjPHypUrjdtw\n0kknqaKiouRK6YUGDRqkhQsXas2a/6+9e4u17SoLBz72P6SVirVtiIhpCKlNWmpTuSTi3SpNERLg\nwcRoo0YN5cWHRoK3B6IhMRpD0AeRiIIxRB4kocUGMZa6d2hD8Iix6SFqxRBt6EOjD4ClJ8HL+T80\nPZwzz9lz7rHGN25r/34JD7DXHGPOueZc3xmM7xvj39LLX/7y7D5Lteh/l+dkzec///krzgI89thj\nKaWTr3Lzspe9LF199dUXUkqWQecf/uEfjm3v7Nmz6fz585cFuSudw/M5zyd1cHCQXvWqV10IRldd\ndVW6/fbb09mzZ9PZs2cvWVo3peeKU1NK6VWvetWJ+3jegw8+mFI6vvB/y5NPPpmeeeaZdM0113Tf\nr4R+xA/xQ/wYM35E2iUW3Xbbbemqq65Kn/vc5y677//3f/+XPvvZz1445xlYAGBwt956azo4OEgP\nP/zwJTnIX/nKV9If/uEfXvGYa6+9NqWUsorNXvrSl6bz589feGmfd+bMmfTxj398hzN/zvMv7uOP\nP37Jj965c+fSu9/97iv+EN59990ppZQ+8IEPXDJ1/swzz6QPfehD2edw3XXXpbvuuis98cQT6UMf\n+tAV+3zqqacuLOuY0tdrEd797ndfMdf73Llz6R//8R+zz+WkWvT//D90oooSn3nmmcvSGp544on0\nyU9+Mr3oRS9KP/ADP3Cidl7wgheku+66Kz377LPpgx/84CV/e+qpp9JHP/rR9IIXvOCKe1d88Ytf\nTA888MAl/9ujjz6aHn/88XTjjTde8o+b53OeT/qfhx9++LLVnd7ylreklJ57Vi9Oo/nnf/7ndHR0\nlK677rrLVhR7+umn05NPPnlZTcHzzp07lx5++OHVwv+UngumX/nKVy7737/0pS+l3/md30kpPbeP\nyJXSbTgdxA/xQ/z4utHix3GO27A2pePjR24seuELX5juvvvudO7cuctqwe6///709NNPX3HFt1GZ\nmRncDTfckO6666700EMPpXvvvTe99rWvTV/96lfTmTNn0nd+53desYjt1a9+dTo4OEh/9Ed/lL7w\nhS9c+NFZW8nlLW95S/rEJz6RfuM3fiP90A/9ULrhhhvSv/3bv6W/+7u/S3feeWc6PDzc+fx/+Id/\nOB0eHqZ77703veY1r0lf/epX09///d+nq6++Ot18882XXcPrX//6dHh4mM6cOZN+/ud/Pn3P93xP\n+p//+Z/0yCOPpFtvvTV98YtfXN034Uruu+++9NRTT6U/+ZM/SQ899FD6ju/4jnTDDTek//zP/0xP\nPvlkeuKJJ9I73/nOCy/uq1/96nTvvfemP/7jP04/9VM/lV772tdeWFHm6aefTo8//ni644470m//\n9m+f+BzWfqCWavS/9MIXvjDddttt6ezZs+k3f/M304033pj+3//7f+n7vu/70k033ZTd3h133JH+\n8i//Mv3TP/1Tuv322y/sE5DScxvw5aQ6ve1tb0tnz55NDzzwQHriiSfSK1/5ygv7BJw7dy7dd999\nV/yR/a7v+q70vve9L505cybddNNN6amnnkqPPPJIuvrqq9Mv/dIvZV/Tlh/5kR9Jn/rUp9KnPvWp\n9La3vS1993d/94W9Q86fP5/e8Y53XHbdv/Vbv5Uef/zx9J73vOey/wctpec2J3z22WdXC/9Teu7/\nLXzPe96T7rjjjvSt3/qt6dprr01PP/10+tu//dv07LPPpltuueWSZU45fcQP8UP8GDd+fPnLX07v\ne9/7Lvnv58+fv7BnVEop3XPPPRdSwlI6Pn7sEove+ta3psceeyx95CMfSf/6r/+abr311vTv//7v\n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\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x112be4d10>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 61 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "def get_similarity(g1, g2):\n", | |
| " s1 = set(np.argwhere(g1.flatten() == True).flatten())\n", | |
| " s2 = set(np.argwhere(g2.flatten() == True).flatten())\n", | |
| " return len(s1 & s2) / len(s1 | s2) \n", | |
| "\n", | |
| "def get_hamming_similarity(g1, g2):\n", | |
| " return np.sum(~np.logical_xor(g1, g2)) / g1.size\n", | |
| "\n", | |
| "for prob in [0.25, 0.50, 0.75, 1]:\n", | |
| " d = get_dupe(g, prob)\n", | |
| " print('prob=%.2f, sim=%.4f, sim=%.4f' % (prob, \n", | |
| " get_similarity(g, d), \n", | |
| " get_hamming_similarity(g, d)))" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "prob=0.25, sim=0.2464, sim=0.7532\n", | |
| "prob=0.50, sim=0.4963, sim=0.8626\n", | |
| "prob=0.75, sim=0.7671, sim=0.9462\n", | |
| "prob=1.00, sim=1.0000, sim=1.0000\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 77 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "def get_fingerprints(grid_size=50, minutia_prob=0.2, \n", | |
| " n_total=5000, n_unique=1000):\n", | |
| " # uniques\n", | |
| " fps = {i: (i, \n", | |
| " np.floor(np.random.random(grid_size ** 2) + \n", | |
| " minutia_prob).astype(bool))\n", | |
| " for i in xrange(n_unique)}\n", | |
| " # dupes\n", | |
| " for i in xrange(n_unique, n_total):\n", | |
| " u = np.random.randint(0, n_unique)\n", | |
| " fps[i] = (u, get_dupe(fps[u][1]))\n", | |
| " return fps\n", | |
| "\n", | |
| "fps = get_fingerprints(n_total=5000, n_unique=1000)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 63 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "def get_grid_hashers(n_buckets=1024, n_squares=3, grid_size=50):\n", | |
| " return [np.random.choice(xrange(grid_size ** 2), \n", | |
| " size=n_squares, replace=False)\n", | |
| " for _ in xrange(n_buckets)]\n", | |
| "\n", | |
| "hashers = get_grid_hashers()" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 38 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "from collections import defaultdict\n", | |
| "\n", | |
| "def get_candidate_pairs(fps, hashers):\n", | |
| " # buckets of candidate pairs\n", | |
| " buckets = defaultdict(list)\n", | |
| " for i, fp in fps.iteritems():\n", | |
| " for hasher in hashers:\n", | |
| " if np.all(fp[1][hasher]):\n", | |
| " buckets[tuple(hasher)].append(i)\n", | |
| " return buckets\n", | |
| "\n", | |
| "%time buckets = get_candidate_pairs(fps, hashers)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "CPU times: user 1min 9s, sys: 236 ms, total: 1min 9s\n", | |
| "Wall time: 1min 9s\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 64 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "len(buckets), average([len(b) for b in buckets.values()])" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 65, | |
| "text": [ | |
| "(1024, 39.724609375)" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 65 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "def get_similar_groups(fps, buckets, min_sim_threshold):\n", | |
| " groups = UnionFind()\n", | |
| " for i in xrange(len(fps)):\n", | |
| " groups.union(i)\n", | |
| " cache = set()\n", | |
| " n_comps = 0\n", | |
| " for bucket in buckets.values():\n", | |
| " for idx, i in enumerate(bucket):\n", | |
| " for j in bucket[idx+1:]:\n", | |
| " sij = frozenset([i, j])\n", | |
| " if sij in cache:\n", | |
| " continue\n", | |
| " cache.add(sij)\n", | |
| " n_comps += 1\n", | |
| " if get_similarity(fps[i][1], \n", | |
| " fps[j][1]) >= min_sim_threshold:\n", | |
| " groups.union(i, j)\n", | |
| " print(n_comps)\n", | |
| " return groups\n", | |
| "\n", | |
| "%time groups = get_similar_groups(fps, buckets, 0.75)\n", | |
| "\n", | |
| "# with cache:\n", | |
| "# 784459\n", | |
| "# CPU times: user 31.3 s, sys: 386 ms, total: 31.7 s\n", | |
| "# Wall time: 32.1 s\n", | |
| " \n", | |
| "# without cache:\n", | |
| "# 835481\n", | |
| "# CPU times: user 29.5 s, sys: 83.2 ms, total: 29.6 s\n", | |
| "# Wall time: 29.9 s" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "787380\n", | |
| "CPU times: user 8min 9s, sys: 1.29 s, total: 8min 11s" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "Wall time: 8min 11s\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 66 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "len(groups.sets()), average([len(g) for g in groups.sets()])" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 68, | |
| "text": [ | |
| "(1053, 4.7483380816714149)" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 68 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "truth = defaultdict(set)\n", | |
| "for i, fp in fps.iteritems():\n", | |
| " truth[fp[0]].add(i)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 69 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "retrieved = defaultdict(set)\n", | |
| "for s in groups.sets():\n", | |
| " us = {fps[i][0] for i in s}\n", | |
| " assert len(us) == 1\n", | |
| " retrieved[list(us)[0]] = set(s)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 70 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "nfp = 0\n", | |
| "nfn = 0\n", | |
| "for i, s in truth.iteritems():\n", | |
| " nfp += len(retrieved[i] - truth[i])\n", | |
| " nfn += len(truth[i] - retrieved[i])\n", | |
| "nfp, nfn" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 71, | |
| "text": [ | |
| "(0, 112)" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 71 | |
| } | |
| ], | |
| "metadata": {} | |
| } | |
| ] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment