From d2b3231a30b5ec9d898d87156279ac4170d64182 Mon Sep 17 00:00:00 2001 From: Bradlee Speice Date: Mon, 4 Nov 2024 00:16:00 +0000 Subject: [PATCH] 2016-05-15-the-unfair-casino --- blog/2016-05-15-the-unfair-casino/_article.md | 15 + .../_notebook.ipynb | 719 ++++++++++++++++++ .../2016-05-15-the-unfair-casino/_notebook.md | 497 ++++++++++++ .../_notebook_files/_notebook_14_1.png | Bin 0 -> 18634 bytes .../_notebook_files/_notebook_16_1.png | Bin 0 -> 15954 bytes .../_notebook_files/_notebook_18_1.png | Bin 0 -> 18530 bytes .../_notebook_files/_notebook_1_0.png | Bin 0 -> 7602 bytes .../_notebook_files/_notebook_20_1.png | Bin 0 -> 19569 bytes .../_notebook_files/_notebook_22_1.png | Bin 0 -> 18865 bytes .../_notebook_files/_notebook_3_0.png | Bin 0 -> 7106 bytes .../_notebook_files/_notebook_5_0.png | Bin 0 -> 6982 bytes blog/2016-05-15-the-unfair-casino/index.mdx | 487 ++++++++++++ 12 files changed, 1718 insertions(+) create mode 100644 blog/2016-05-15-the-unfair-casino/_article.md create mode 100644 blog/2016-05-15-the-unfair-casino/_notebook.ipynb create mode 100644 blog/2016-05-15-the-unfair-casino/_notebook.md create mode 100644 blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_14_1.png create mode 100644 blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_16_1.png create mode 100644 blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_18_1.png create mode 100644 blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_1_0.png create mode 100644 blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_20_1.png create mode 100644 blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_22_1.png create mode 100644 blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_3_0.png create mode 100644 blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_5_0.png create mode 100644 blog/2016-05-15-the-unfair-casino/index.mdx diff --git a/blog/2016-05-15-the-unfair-casino/_article.md b/blog/2016-05-15-the-unfair-casino/_article.md new file mode 100644 index 0000000..d4362bd --- /dev/null +++ b/blog/2016-05-15-the-unfair-casino/_article.md @@ -0,0 +1,15 @@ +Title: The Unfair Casino +Date: 2016-05-15 +Category: Blog +Tags: casino, probability, em, machine learning, simulated annealing +Authors: Bradlee Speice +Summary: Trying to figure out how exactly two dice are loaded in a cheating casino +[//]: <> "Modified: " + +{% notebook 2016-5-15-the-unfair-casino.ipynb %} + + + diff --git a/blog/2016-05-15-the-unfair-casino/_notebook.ipynb b/blog/2016-05-15-the-unfair-casino/_notebook.ipynb new file mode 100644 index 0000000..ed00df1 --- /dev/null +++ b/blog/2016-05-15-the-unfair-casino/_notebook.ipynb @@ -0,0 +1,719 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or, how to get thrown out of a casino because you're a mathematician.\n", + "\n", + "---\n", + "\n", + "In the ongoing eternal cycle of mathematicians asking generally useless questions about probability, I dreamt up another one. The scenario is as follows:\n", + "\n", + "**You're playing a game with two die, and you do not get to see what the outcome of the die are on each roll. All you get to see is their sum. Given an arbitrarily long list of the sum of two rolls, can you determine if one or both die are loaded, and what those loadings are?**\n", + "\n", + "# Proving we can detect cheating\n", + "\n", + "My first question is simply, is this possible? There's a lot of trivial cases that make it obvious that there's cheating going on. But there are some edge cases that might give us more difficulty. First though, let's get a picture of what the fair distribution looks like. In principle, we can only detect cheating if the distribution of the fair die differs from the distribution of the loaded die." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nP71BWn/o4C2PAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "fair_1 = np.random.randint(1, 7, 10000)\n", + "fair_2 = np.random.randint(1, 7, 10000)\n", + "\n", + "pd.Series(fair_1 + fair_2).plot(kind='hist', bins=11);\n", + "plt.title('Fair Distribution');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This distribution makes sense: there are many ways to make a 7 (the most frequent observed value) and very few ways to make a 12 or 2; an important symmetry. As a special note, you can notice that the sum of two fair dice is a discrete case of the [Triangle Distribution][1], which is itself a special case of the [Irwin-Hall Distribution][2].\n", + "\n", + "# The Edge Cases\n", + "\n", + "Given that we understand how the results of two fair dice are distributed, let's see some of the interesting edge cases that come up. This will give us assurance that when a casino is cheating, it is detectable (given sufficient data). To make this as hard as possible, we will think of scenarios where the expected value of the sum of loaded dice is the same as the expected value of the sum of fair dice.\n", + "\n", + "### Edge Case 1\n", + "What happens when one die is biased low, and one die is biased high? That is, where:\n", + "\n", + "\\begin{align}\n", + "\\begin{array}{cc}\n", + "D_1 = \\left\\{\n", + "\\begin{array}{lr}\n", + "1 & w.p. 1/3\\\\\n", + "2 & w.p. 1/3\\\\\n", + "3 & w.p. 1/12\\\\\n", + "4 & w.p. 1/12\\\\\n", + "5 & w.p. 1/12\\\\\n", + "6 & w.p. 1/12\n", + "\\end{array}\n", + "\\right. &\n", + "D_2 = \\left\\{\n", + "\\begin{array}{lr}\n", + "1 & w.p. 1/12\\\\\n", + "2 & w.p. 1/12\\\\\n", + "3 & w.p. 1/12\\\\\n", + "4 & w.p. 1/12\\\\\n", + "5 & w.p. 1/3\\\\\n", + "6 & w.p. 1/3\n", + "\\end{array}\n", + "\\right. \\\\\n", + "\\mathbb{E}[D_1] = 2.5 & \\mathbb{E}[D_2] = 4.5\n", + "\\end{array}\\\\\n", + "\\mathbb{E}[D_1 + D_2] = 7 = \\mathbb{E}[D_{fair} + D_{fair}]\n", + "\\end{align}\n", + "\n", + "[1]: https://en.wikipedia.org/wiki/Triangular_distribution\n", + "[2]: https://en.wikipedia.org/wiki/Irwin%E2%80%93Hall_distribution" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAEMCAYAAADqG+D0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAG2RJREFUeJzt3X20XXV95/H3ByJP8lB8gKsJTz6EBlrEIPGBihetgG15\n0I4RdRURdLkUBWtnRsJ0hminU+laiFgLqz5hYMAIKAothZAFV8ZpNRRJQZKBVA0QMBcfEEVYmJDP\n/LF/lxxubpJzd7LPvvecz2uts7LP7+y9f9+zc8/5nt/D3lu2iYiImKwd2g4gIiKmpySQiIioJQkk\nIiJqSQKJiIhakkAiIqKWJJCIiKglCSQiImpJAomIiFqSQGK7k/RjSW/cwus/kHR0D+O5VNInt/D6\nFuOdqvrpOE8m1un6/9WPZrQdQAwe27/XdgyDYDod5+kUa2yUBBLPIul1wF8BTwHXALsAvw/cZfuS\nNmPrJznO0Q/ShRXPYvtfgPXAZ2x/2fbFtj8IvEPS8CR2NU/SPZJ+LulLknYae6GzC0LSxyX9h6Rf\nlW6Mkzt3Ul5fU15fKemYUv4iSddIekTSDyV9pGObV0q6Q9JjkhZTfTl3RdIcSbdKelTS3ZJOKOWn\nSbquY71Vkr7W8fwBSYd1W88AH+dXSvr3cnwXj8U7vltK0lxJ3y/7vqqs+8nN7Oerne87eicJJJ5F\n0nOAVwPfGffSd4GTN91is94FvBl4KXAw8JebWe8/gKNs7wl8AvjfkvYtscwGzgSOKK8fB6yWJOB6\n4E7gRcCbgLMlvbnEfy2wCHgecDXwp90ELGkGcB1wI/BC4CzgCkkvB74N/EFZ70XAc4DXlucvAZ5r\n+67uDs1AH+e3A8cCBwGHAaeNX6Hs+xvAl8u+vwq8dQv7ecVE+4nmJYHEeK8G7rH9xLjyFwFPT2I/\nf2f7Ydu/BP6a6otuE7a/bnu0LF8NrALmlZefBnYCfk/SDNsP2P4xcCTwAtt/bftp26uBLwLvBF4D\nzLD92fLa14Hbu4z5NVSJ4Hzb623fCvwj8M5S768lHQ4cDdwEPFy+fI8G/s8kjg0M7nG+yPZoifd6\n4PAJ1nkNsKPtz5V9Xwssq7GfaFgSSIz3RuDWzoLyS/QYYLmkt0la0MV+1nQs30/1xbgJSadKurN0\nRTwKHAq8AMD2D4GPAguBRyRdWX79HwDMlPSL8ngUWADsA7wYeGhcNfd3ES9l2wcn2HZmWb6N6jgc\nDYyUxzDwBqoWymRs6TiPSHqZpLdK+h+S5m5hP9PtOI92LD8B7D7BOhPte/z/Szf7iYYlgcR4xzDu\niw14C/CI7cuBO6i6b7Zmv47lA4CHx68gaX/g88CHbO9te2/gHkBj69hebPv1wP6l6FNUXyY/sv28\n8tjb9l62/wT4CRu/8MfsT3cenmDd/dn4ZfZtqoTxB2X5NqrkcTSTTyBbOs7XAyeUei8E/vMW9jMd\nj/PWTLTv/SZaMdqVBBLPkLQrMBf4vx1lBwJ/AfynSe7uTEkzJT0POBdYPME6zwU2AD+TtIOk9wLP\nTOeUNFvSMWWA9LfAk1TdLcuoupP+q6RdJO0o6VBJrwL+FVgv6SOSZkh6Gxu7arbme8Bvyn5nlMHs\nP+mI/dtUX/y72n6YqtvqeOD5VOMEY3FfKunLm6ukm+Ns+0Lby4BZwI+3EPN0PM5b86/A05LOLHWe\ntB33HdtREkgAIOlI4Hzg18C7JL1P0l8A7wfeXvq/u2XgSmAJ1eDtKqr++c7Xsb0SuIBq4HgtVbdK\n56DyzlS/hH9K9cv6hcC5tjdQfbEfTvXl+gjwBWBP2+uAtwHvBX5ONdj69S7ipWx7AvBHwM+AzwF/\nZvu+8voqquNzW3n+a+CHwHf87Ft77semg+NAreN8Ms8+duPjnnbHeWuvdez7fcCjVOM611NNed7a\nfqKH1OQtbSXtTPVh24nqnJNrbH9C0t7A16ia3KuB+bYfK9ssAE6nmuJ4tu0lpXwu8BWqqYI32P5o\nY4HHZkk6ADjN9ifajmUqKjOIlgOH2Z7MYPhE+zqBapxlqCSvgSXpu8Althe1HUts1GgLxPZTwDG2\nX0n1K+YtkuYB5wBLbR8M3EI1MIekQ4D5wByq/uCLy8AiwCXAGbZnA7MlHddk7LEpSbtTdbEcIenQ\ntuOZimyvs33odkgebwX+O9Wv+vnbJbhpRNLRkvYtXVjvoTrJ8sa244pna/xM9I5pijuX+gycRDX4\nCNU88hGqpHIisNj2eqp56KuoTpS6H9jD9tg0wcuomvY3NR1/bGT7caqukAvajqXflamr17YdR4sO\nBq4CdgN+BPzp2DTkmDoaTyCSdqCaufNS4O9t3y5p34456Wsl7VNWn0k1gDbmoVK2nmdPV1zDprM0\nIqJP2P4C1XhLTGGND6Lb3lC6sGZRtSYOZdNBsAyKRURMMz27mKLtX0kaoZr2ODrWCpE0RDW7A6oW\nR+d871mlbHPlm5CUZBQRUYNtbX2tjRptgUh6gaS9yvKuVNfsWUl1vaHTymrvAb5Vlq8DTpG0k6SD\ngJcBy2yvBR6TNK8Mqp/asc0mbOdhc95557Uew1R55FjkWORYbPlRR9MtkBcBi8o4yA7A12zfUKbk\nXSXpdKrLH8wHsL1C0lXACmAd1ZmzY+/sTJ49jTczMiIiWtRoArF9N9UZt+PLfwH84Wa2+RvgbyYo\nv4NqKl9EREwBORO9jw0PD7cdwpSRY7FRjsVGORbbptEz0dsgyf32niIimiYJT6VB9IiI6F9JIBER\nUUsSSERE1JIEEhERtSSBRERELUkgERFRSxJIRETUkgQSERG1JIFEREQtSSAREVFLEkhERNSSBBIR\nEbUkgURERC1JIBERUUsSSERE1JIEEhERtSSBRERELUkgERFRSxJIRETUkgQSERG1JIFEREQtSSAR\nEVFLEkhERNSSBBIREbUkgURERC1JIBERUUujCUTSLEm3SLpH0t2SPlLKz5O0RtL3y+P4jm0WSFol\naaWkYzvK50q6S9J9kj7TZNwRmzM0dCCSev4YGjqw7bcesQnZbm7n0hAwZHu5pN2BO4CTgHcAv7b9\n6XHrzwGuBI4EZgFLgZfbtqTvAR+2fbukG4CLbN80QZ1u8j3FYJMEtPH3JfJ3HU2ShG1NZptGWyC2\n19peXpYfB1YCM8vLEwV6ErDY9nrbq4FVwLySiPawfXtZ7zLg5CZjj4iILevZGIikA4HDge+Vog9L\nWi7pi5L2KmUzgQc7NnuolM0E1nSUr2FjIoqIiBb0JIGU7qtrgLNLS+Ri4CW2DwfWAhf0Io6IiNh+\nZjRdgaQZVMnjctvfArD9045VvgBcX5YfAvbreG1WKdtc+YQWLlz4zPLw8DDDw8O144+I6EcjIyOM\njIxs0z4aHUQHkHQZ8DPbH+soG7K9tiz/OXCk7XdJOgS4Ang1VRfVzWwcRP8ucBZwO/BPwGdt3zhB\nfRlEj8ZkED36VZ1B9EZbIJKOAt4N3C3pTqpP3rnAuyQdDmwAVgMfALC9QtJVwApgHfChjmxwJvAV\nYBfghomSR0RE9E7jLZBeSwskmpQWSPSrKTeNNyIi+lcSSERE1JIEEhERtSSBRERELUkgERFRSxJI\nRETUkgQSERG1JIFEREQtSSAREVFLEkhERNSSBBIREbUkgURERC1JIBERUUsSSERE1JIEEhERtSSB\nRERELUkgERFRSxJIRETUkgQSERG1JIFEREQtSSAREVFLEkhERNSSBBIREbUkgURERC1JIBERUUsS\nSERE1JIEEhERtSSBRERELUkgERFRS6MJRNIsSbdIukfS3ZLOKuV7S1oi6V5JN0naq2ObBZJWSVop\n6diO8rmS7pJ0n6TPNBl3RERsXdMtkPXAx2wfCrwWOFPS7wLnAEttHwzcAiwAkHQIMB+YA7wFuFiS\nyr4uAc6wPRuYLem4hmOPiIgtaDSB2F5re3lZfhxYCcwCTgIWldUWASeX5ROBxbbX214NrALmSRoC\n9rB9e1nvso5tIiKiBT0bA5F0IHA48F1gX9ujUCUZYJ+y2kzgwY7NHiplM4E1HeVrSllERLRkRi8q\nkbQ7cA1wtu3HJXncKuOfb5OFCxc+szw8PMzw8PD23H1ExLQ3MjLCyMjINu1D9nb97t60AmkG8I/A\nP9u+qJStBIZtj5buqVttz5F0DmDb55f1bgTOA+4fW6eUnwK8wfYHJ6jPTb+nGFzVkFwbf18if9fR\nJEnY1tbX3KgXXVhfBlaMJY/iOuC0svwe4Fsd5adI2knSQcDLgGWlm+sxSfPKoPqpHdtEREQLGm2B\nSDoKuA24m+pnm4FzgWXAVcB+VK2L+bZ/WbZZAJwBrKPq8lpSyo8AvgLsAtxg++zN1JkWSDQmLZDo\nV3VaII13YfVaEkg0KQkk+tVU7cKKiIg+lAQSERG1JIFEREQtSSAREVFLEkhERNSSBBIREbUkgURE\nRC1JIBERUUtXCUTS7zcdSERETC/dtkAulrRM0oc67x4YERGDq6sEYvv1wLuprl11h6QrJb250cgi\nImJKm9S1sCTtSHUnwM8CvwIEnGv7G82EN3m5FlY0KdfCin7V2LWwJB0m6UKqW9K+ETih3JvjjcCF\nk440IiKmva5aIJK+DXwRuMb2k+Ne+zPblzcU36SlBRJNSgsk+lVjl3Mvt6R90vbT5fkOwC62n6gV\naYOSQKJJSSDRr5q8nPtSYNeO57uVsoiIGFDdJpBdbD8+9qQs79ZMSBERMR10m0B+I2nu2JNye9kn\nt7B+RET0uRldrvdR4GpJD1NN3R0C3tFYVBERMeV1fR6IpOcAB5en99pe11hU2yCD6NGkDKJHv2ps\nFlbZ+euAA+lotdi+bDKV9UISSDQpCST6VZ0E0lUXlqTLgZcCy4GnS7GBKZdAIiKiN7odA3kVcEh+\n2kdExJhuZ2H9gGrgPCJasTOSWnkMDR3Y9puPKarbFsgLgBWSlgFPjRXaPrGRqCJinKdoZ+wFRkcn\n1S0eA6TbBLKwySAiImL6mcwsrAOAl9teKmk3YEfbv240uhoyCyua1OYsrLZaIJkBNhiavJz7+4Fr\ngH8oRTOBb04uvIiI6CfdDqKfCRxFdRMpbK8C9tnaRpK+JGlU0l0dZedJWiPp++VxfMdrCyStkrRS\n0rEd5XMl3SXpPkmf6fbNRX8aGjqwtQHliNio2wTylO3fjj2RNIPu2tOXAsdNUP5p23PL48ayzznA\nfGAO8Baq+7CPfWIvAc6wPRuYLWmifcaAGB29n+rPr41HRIzpNoF8W9K5wK7lXuhXA9dvbSPb3wEe\nneCliX7KnQQstr3e9mpgFTBP0hCwh+3by3qXUd1WNyIiWtRtAjkH+ClwN/AB4AbgL7eh3g9LWi7p\ni5L2KmUzgQc71nmolM0E1nSUryllERHRoq6m8dreAHyhPLbVxcAnbVvS/wQuAN63Hfb7jIULFz6z\nPDw8zPDw8PbcfUTEtDcyMsLIyMg27aPbW9r+mAk6gG2/pIttDwCut33Yll6TdE61S59fXrsROA+4\nH7jV9pxSfgrwBtsf3Ex9mcbb59qbSgvtTafNNN5oVmMXU6S6FtaYXYC3A8/rNi46xjwkDdleW56+\njeoyKQDXAVdIupCqi+plwLLSUnlM0jzgduBU4LNd1h0REQ3p+kTCTTaU7rB9xFbWuRIYBp4PjFK1\nKI4BDgc2AKuBD9geLesvAM4A1gFn215Syo8AvkKVvG6wffYW6kwLpM+lBdL7uvOZ6n+N3Q+k83a2\nVAPvrwI+aPsVkwuxeUkg/S8JpPd15zPV/5rswrqgY3k9Vcth/mQqioiI/lK7C2uqSguk/6UF0vu6\n85nqf03ekfBjW3rd9qcnU2lEREx/k5mFdSTVTCmAE4BlVGeLR0TEAOp2EP024I/HLt8uaQ/gn2wf\n3XB8k5YurP6XLqze153PVP9r7HLuwL7Abzue/7aURUTEgOq2C+syYJmka8vzk4FFzYQUERHTwWTu\nSDgXeH15epvtOxuLahukC6v/pQur93XnM9X/muzCAtgN+JXti4A1kg6aVHQREdFXuh1EP49qJtbB\ntmdLejFwte2jmg5wstIC6X9pgfS+7nym+l+TLZC3AicCvwGw/TCwx+TCi4iIftJtAvlt+VlvAEnP\nbS6kiIiYDrpNIFdJ+gfgdyS9H1jK9rm5VERETFOTmYX1ZuBYqs7Ym2zf3GRgdWUMpP9lDKT3decz\n1f8auZy7pB2BpbaP2ZbgeiUJpP8lgfS+7nym+l8jg+i2nwY2SNqrdmQREdF3uj0T/XHgbkk3U2Zi\nAdg+q5GoIiJiyus2gXyjPCIiIoCtjIFI2t/2Az2MZ5tlDKT/ZQyk93XnM9X/mhgD+WbHzr9eK6qI\niOhLW0sgndnoJU0GEhER08vWEog3sxwREQNua2MgT1PNuhKwK/DE2EuAbe/ZeISTlDGQ/pcxkN7X\nnc9U/6szBrLFWVi2d9y2kCIiol9N5n4gERERz0gCiYiIWpJAIiKiliSQiIiopdEEIulLkkYl3dVR\ntrekJZLulXRT50UaJS2QtErSSknHdpTPlXSXpPskfabJmCMiojtNt0AuBY4bV3YO1eXhDwZuARYA\nSDoEmA/MAd4CXKxqvibAJcAZtmcDsyWN32dERPRYownE9neAR8cVnwQsKsuLgJPL8onAYtvrba8G\nVgHzJA0Be9i+vax3Wcc2ERHRkjbGQPaxPQpgey2wTymfCTzYsd5DpWwmsKajfE0pi4iIFnV7Ofcm\nbfdTXBcuXPjM8vDwMMPDw9u7ioiIaW1kZISRkZFt2kfX90SvXYF0AHC97cPK85XAsO3R0j11q+05\nks6hujzK+WW9G4HzgPvH1inlpwBvsP3BzdSXS5n0uVzKpPd15zPV/xq5pe12IJ59Vd/rgNPK8nuA\nb3WUnyJpJ0kHAS8DlpVursckzSuD6qd2bBMRES1ptAtL0pXAMPB8SQ9QtSg+BVwt6XSq1sV8ANsr\nJF0FrADWAR/qaEqcCXwF2AW4wfaNTcYdERFb13gXVq+lC6v/pQur93XnM9X/pmoXVkRE9KEkkIiI\nqCUJJCIiakkCiYiIWpJAIiKiliSQiIioJQkkIiJqSQKJiIhakkAiIqKWJJCIiKglCSQiImpJAomI\niFqSQCIiopYkkIiIqCUJJCIiakkCiYiIWpJAIiKiliSQiIiopdF7okdEP9i53Ea4t/bd9wDWrl3d\n83qje7knetQ2NHQgo6P3t1R77one/3XnXuy9VOee6EkgUVv1qzRfpv1db5t1J4H0Up0EkjGQiIio\nJQkkIiJqSQKJiIhakkAiIqKWTOPtA+3OhoqIQZVZWH1g8GZDDeaMpEF8z4P2WW5TnVlYaYFExBTV\nzgmMADvssBsbNjzR83qn28mTrbVAJK0GHgM2AOtsz5O0N/A14ABgNTDf9mNl/QXA6cB64GzbSzaz\n31ZaIO13Iw3Sr+LB/DWe9zwIdbfX6ppWJxJK+hFwhO1HO8rOB35u+28lfRzY2/Y5kg4BrgCOBGYB\nS4GXT5Qp2kog7XUjweB9wHOsB6PuwXzP0ymBtDkLSxPUfxKwqCwvAk4uyycCi22vt70aWAXM60WQ\nERExsTYTiIGbJd0u6X2lbF/bowC21wL7lPKZwIMd2z5UyiIioiVtDqIfZfsnkl4ILJF0L5u2GTMF\nIyJiimotgdj+Sfn3p5K+SdUlNSppX9ujkoaAR8rqDwH7dWw+q5RNaOHChc8sDw8PMzw8vH2Dj4iY\n5kZGRhgZGdmmfbQyiC5pN2AH249Lei6wBPgE8CbgF7bP38wg+qupuq5uJoPonbW3VPeg1dtm3XnP\ng1H39BpEb6sFsi9wrSSXGK6wvUTSvwFXSToduB+YD2B7haSrgBXAOuBDA3e2YETEFJMz0bdfvQzi\nr6XBqrfNuvOeB6Pu6dUCycUUIyKiliSQiIioJQkkIiJqSQKJiIhakkAiIqKWJJCIiKglCSQiImpJ\nAomIiFqSQCIiopa+vKXttdde23YIERF9ry8vZbLnnidvfcXtaN26B3jyye8ziJddGKx626w773kw\n6p5elzLpywTS+//4y4FTGcQ/9sGqt826854Ho+7plUAyBhIREbX05RhIRMT0tHO5svf0kAQSETFl\nPEW73XaTky6siIioJQkkIiJqSQKJiIhakkAiIqKWJJCIiKglCSQiImpJAomIiFqSQCIiopYkkIiI\nqCUJJCIiakkCiYiIWpJAIiKiliSQiIioZVolEEnHS/p/ku6T9PG244mIGGTTJoFI2gH4HHAccCjw\nTkm/225UU91I2wFMISNtBzCFjLQdwBQy0nYA09q0SSDAPGCV7fttrwMWAye1HNMUN9J2AFPISNsB\nTCEjbQcwhYy0HcC0Np0SyEzgwY7na0pZRES0oC/vSLjnnif0tL5169bw5JM9rTIionWy27p94uRI\neg2w0Pbx5fk5gG2fP2696fGGIiKmGNuTuq/tdEogOwL3Am8CfgIsA95pe2WrgUVEDKhp04Vl+2lJ\nHwaWUI3dfCnJIyKiPdOmBRIREVPLdJqFtVmSZkm6RdI9ku6WdFbbMbVN0g6Svi/purZjaZOkvSRd\nLWll+ft4ddsxtUXSn0v6gaS7JF0haae2Y+oVSV+SNCrpro6yvSUtkXSvpJsk7dVmjL2ymWPxt+Uz\nslzS1yXt2c2++iKBAOuBj9k+FHgtcGZOMuRsYEXbQUwBFwE32J4DvAIYyG5PSS8GPgLMtX0YVff1\nKe1G1VOXUp2E3OkcYKntg4FbgAU9j6odEx2LJcChtg8HVtHlseiLBGJ7re3lZflxqi+JgT1HRNIs\n4I+AL7YdS5vKr6jX274UwPZ6279qOaw27Qg8V9IMYDfg4Zbj6Rnb3wEeHVd8ErCoLC8CTu5pUC2Z\n6FjYXmp7Q3n6XWBWN/vqiwTSSdKBwOHA99qNpFUXAv8FGPQBroOAn0m6tHTnfV7Srm0H1QbbDwMX\nAA8ADwG/tL203ahat4/tUah+hAL7tBzPVHE68M/drNhXCUTS7sA1wNmlJTJwJP0xMFpaZCqPQTUD\nmAv8ve25wBNU3RYDR9LvUP3iPgB4MbC7pHe1G9WUM+g/uJD034B1tq/sZv2+SSClWX4NcLntb7Ud\nT4uOAk6U9CPgq8Axki5rOaa2rAEetP1v5fk1VAllEP0h8CPbv7D9NPAN4HUtx9S2UUn7AkgaAh5p\nOZ5WSTqNquu76x8WfZNAgC8DK2xf1HYgbbJ9ru39bb+EapD0Ftunth1XG0r3xIOSZpeiNzG4Ewse\nAF4jaRdJojoWgzahYHyL/DrgtLL8HmCQfng+61hIOp6q2/tE2091u5O+SCCSjgLeDbxR0p2lv/v4\ntuOKKeEs4ApJy6lmYf2vluNphe1lVC2wO4F/p/ry+HyrQfWQpCuBfwFmS3pA0nuBTwFvljR2hYtP\ntRljr2zmWPwdsDtwc/n+vLirfeVEwoiIqKMvWiAREdF7SSAREVFLEkhERNSSBBIREbUkgURERC1J\nIBERUUsSSERE1JIEEhERtfx/t8CCaUQXJ5cAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def unfair_die(p_vals, n):\n", + " x = np.random.multinomial(1, p_vals, n)\n", + " return x.nonzero()[1] + 1\n", + "\n", + "d1 = [1/3, 1/3, 1/12, 1/12, 1/12, 1/12]\n", + "d2 = [1/12, 1/12, 1/12, 1/12, 1/3, 1/3]\n", + "\n", + "x1 = unfair_die(d1, 10000)\n", + "x2 = unfair_die(d2, 10000)\n", + "\n", + "pd.Series(x1 + x2).plot(kind='hist', bins=11);\n", + "plt.title('$D_1$ biased low, $D_2$ biased high');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that while the 7 value remains the most likely (as expected), the distribution is not so nicely shaped any more. \n", + "\n", + "**Edge Case 2:** When one die is loaded low, and one is loaded high, we've seen how we can detect them. How about when two die are loaded both low and high? That is, we have the following distribution:\n", + "\n", + "\\begin{align}\n", + "\\begin{array}{cc}\n", + "D_1 = \\left\\{\n", + "\\begin{array}{lr}\n", + "1 & w.p. 1/3\\\\\n", + "2 & w.p. 1/12\\\\\n", + "3 & w.p. 1/12\\\\\n", + "4 & w.p. 1/12\\\\\n", + "5 & w.p. 1/12\\\\\n", + "6 & w.p. 1/3\n", + "\\end{array}\n", + "\\right. &\n", + "D_2 = \\left\\{\n", + "\\begin{array}{lr}\n", + "1 & w.p. 1/3\\\\\n", + "2 & w.p. 1/12\\\\\n", + "3 & w.p. 1/12\\\\\n", + "4 & w.p. 1/12\\\\\n", + "5 & w.p. 1/12\\\\\n", + "6 & w.p. 1/3\n", + "\\end{array}\n", + "\\right. \\\\\n", + "\\mathbb{E}[D_1] = 3.5 & \\mathbb{E}[D_2] = 3.5\n", + "\\end{array}\\\\\n", + "\\mathbb{E}[D_1 + D_2] = 7 = \\mathbb{E}[D_{fair} + D_{fair}]\n", + "\\end{align}\n", + "\n", + "We can see even that the expected value of each individual die is the same as the fair die! However, the distribution (if we are doing this correctly) should still be skewed:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nSwIkIiJq+f8KwJfCiHKoPQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "d1 = [1/3, 1/12, 1/12, 1/12, 1/12, 1/3]\n", + "d2 = d1\n", + "\n", + "x1 = unfair_die(d1, 10000)\n", + "x2 = unfair_die(d2, 10000)\n", + "\n", + "pd.Series(x1 + x2).plot(kind='hist', bins=11)\n", + "plt.title(\"$D_1$ and $D_2$ biased to 1 and 6\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In a very un-subtle way, we have of course made the values 2 and 12 far more likely.\n", + "\n", + "# Detection Conclusion\n", + "\n", + "There are some trivial examples of cheating that are easy to detect: whenever the expected value of the sum of two fair dice deviates from the expected value for the sum of two fair dice, we can immediately conclude that there is cheating at stake.\n", + "\n", + "The interesting edge cases occur when the expected value of the sum of loaded dice matches the expected value of the sum of fair dice. Considering the above examples (and a couple more I ran through in developing this), we have seen that in every circumstance having two unfair dice leads to a distribution of results different from the fair results.\n", + "\n", + "We can thus finally state: **just by looking at the distribution of results from this game, we can immediately conclude whether there is cheating.**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Simulated Annealing\n", + "\n", + "What we really would like to do though, is see if there is any way to determine how exactly the dice are loaded. This is significantly more complicated, but we can borrow some algorithms from Machine Learning to figure out exactly how to perform this process. I'm using the Simulated Annealing algorithm, and I discuss why this works and why I chose it over some of the alternatives in the [justification](#Justification-of-Simulated-Annealing). If you don't care about how I set up the model and just want to see the code, check out [the actual code](#The-actual-code).\n", + "\n", + "[Simulated Annealing][3] is a variation of the [Metropolis-Hastings Algorithm][4], but the important thing for us is: Simulated Annealing allows us to quickly optimize high-dimensional problems. But what exactly are we trying to optimize? Ideally, we want a function that can tell us whether one distribution for the dice better explains the results than another distribution. This is known as the **likelihood** function.\n", + "\n", + "## Deriving the Likelihood function\n", + "\n", + "To derive our likelihood function, we want to know: **what is the probability of seeing a specific result given those hidden parameters?** This is actually a surprisingly difficult problem. While we can do a lot of calculations by hand, we need a more general solution since we will be working with very some interesting die distributions.\n", + "\n", + "We first note that the sum of two dice can take on 11 different values - 2 through 12. This implies that each individual sum follows a [Categorical distribution](https://en.wikipedia.org/wiki/Categorical_distribution). That is:\n", + "\n", + "\\begin{align}\n", + "\\mathcal{L(x)} = \\left\\{\n", + "\\begin{array}{lr}\n", + "p_2 & x = 2\\\\\n", + "p_3 & x = 3\\\\\n", + "\\ldots & \\\\\n", + "p_{11} & x = 11\\\\\n", + "p_{12} & x = 12\n", + "\\end{array}\n", + "\\right.\n", + "\\end{align}\n", + "\n", + "Where each $p_i$ is the probability of seeing that specific result. However, we need to calculate what each probability is! I'll save you the details, but [this author](http://math.stackexchange.com/a/1646360/320784) explains how to do it.\n", + "\n", + "Now, we would like to know the likelihood of our entire data-set. This is trivial:\n", + "\n", + "\\begin{align}\n", + "\\mathcal{L(\\mathbf{X})} &= \\prod_{i=1}^n L(x)\n", + "\\end{align}\n", + "\n", + "However, it's typically much easier to work with the $\\log(\\mathcal{L})$ function instead. This is critically important from a computational perspective: when you multiply so many small numbers together (i.e. the product of $L(x)$ terms) the computer suffers from rounding error; if we don't control for this, we will find that no matter the distributions we choose for each die, the \"likelihood\" will be close to zero because the computer is not precise enough.\n", + "\n", + "\\begin{align}\n", + "\\log(\\mathcal{L}) &= \\sum_{i=1}^n \\log(L)\n", + "\\end{align}\n", + "\n", + "## The process of Simulated Annealing\n", + "\n", + "The means by which we optimize our likelihood function is the simulated annealing algorithm. The way it works is as follows:\n", + "\n", + "1. Start with a random guess for the parameters we are trying to optimize. In our case we are trying to guess the distribution of two dice, and so we \"optimize\" until we have a distribution that matches the data.\n", + "\n", + "2. For each iteration of the algorithm:\n", + "\n", + " 1. Generate a new \"proposed\" set of parameters based on the current parameters -\n", + " i.e. slightly modify the current parameters to get a new set of parameters.\n", + " 2. Calculate the value of $\\log(\\mathcal{L})$ for each set of parameters. If the function value for the\n", + " proposed parameter set is higher than for the current, automatically switch to the new parameter set\n", + " and continue the next iteration.\n", + " 3. Given the new parameter set performs worse, determine a probability of switching to the new parameter set anyways: $\\mathcal{P}(p_{current}, p_{proposed})$\n", + " 4. Switch to the new parameter set with probability $\\mathcal{P}$. If you fail to switch, begin the next iteration.\n", + " \n", + "3. The algorithm is complete after we fail to make a transition $n$ times in a row.\n", + "\n", + "If everything goes according to plan, we will have a value that is close to the true distribution of each die.\n", + "\n", + "# The actual code\n", + "\n", + "We start by defining the score function. This will tell us how well the proposed die densities actually explain the results.\n", + "\n", + "[3]:https://en.wikipedia.org/wiki/Simulated_annealing\n", + "[4]:https://en.wikipedia.org/wiki/Metropolis%E2%80%93Hastings_algorithm" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "from numpy import polynomial\n", + "\n", + "def density_coef(d1_density, d2_density):\n", + " # Calculating the probabilities of each outcome was taken\n", + " # from this author: http://math.stackexchange.com/a/1710392/320784\n", + " d1_p = polynomial.Polynomial(d1_density)\n", + " d2_p = polynomial.Polynomial(d2_density)\n", + " coefs = (d1_p * d2_p).coef\n", + " return coefs\n", + "\n", + "def score(x, d1_density, d2_density):\n", + " # We've now got the probabilities of each event, but we need\n", + " # to shift the array a bit so we can use the x values to actually\n", + " # index into it. This will allow us to do all the calculations\n", + " # incredibly quickly\n", + " coefs = density_coef(d1_density, d2_density)\n", + " coefs = np.hstack((0, 0, coefs))\n", + " return np.log(coefs[x]).sum()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Afterward, we need to write something to permute the proposal densities. We make random modifications, and eventually the best one survives." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def permute(d1_density, d2_density):\n", + " # To ensure we have legitimate densities, we will randomly\n", + " # increase one die face probability by `change`,\n", + " # and decrease one by `change`.\n", + " # This means there are something less than (1/`change`)^12 possibilities\n", + " # we are trying to search over.\n", + " change = .01\n", + " \n", + " d1_index1, d1_index2 = np.random.randint(0, 6, 2)\n", + " d2_index1, d2_index2 = np.random.randint(0, 6, 2)\n", + " \n", + " # Also make sure to copy. I've had some weird aliasing issues\n", + " # in the past that made everything blow up.\n", + " new_d1 = np.float64(np.copy(d1_density))\n", + " new_d2 = np.float64(np.copy(d2_density))\n", + " \n", + " # While this doesn't account for the possibility that some\n", + " # values go negative, in practice this never happens\n", + " new_d1[d1_index1] += change\n", + " new_d1[d1_index2] -= change\n", + " new_d2[d2_index1] += change\n", + " new_d2[d2_index2] -= change\n", + " \n", + " return new_d1, new_d2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we've got the main algorithm code to do. This is what brings all the pieces together." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def optimize(data, conv_count=10, max_iter=1e4):\n", + " switch_failures = 0\n", + " iter_count = 0\n", + " \n", + " # Start with guessing fair dice\n", + " cur_d1 = np.repeat(1/6, 6)\n", + " cur_d2 = np.repeat(1/6, 6)\n", + " cur_score = score(data, cur_d1, cur_d2)\n", + " \n", + " # Keep track of our best guesses - may not be\n", + " # what we end with\n", + " max_score = cur_score\n", + " max_d1 = cur_d1\n", + " max_d2 = cur_d2\n", + " \n", + " # Optimization stops when we have failed to switch `conv_count`\n", + " # times (presumably because we have a great guess), or we reach\n", + " # the maximum number of iterations.\n", + " while switch_failures < conv_count and iter_count < max_iter:\n", + " iter_count += 1\n", + " if iter_count % (max_iter / 10) == 0:\n", + " print('Iteration: {}; Current score (higher is better): {}'.format(\n", + " iter_count, cur_score))\n", + " \n", + " new_d1, new_d2 = permute(cur_d1, cur_d2)\n", + " new_score = score(data, new_d1, new_d2)\n", + " \n", + " if new_score > max_score:\n", + " max_score = new_score\n", + " max_d1 = new_d1\n", + " max_d2 = new_d2\n", + " \n", + " if new_score > cur_score:\n", + " # If the new permutation beats the old one,\n", + " # automatically select it.\n", + " cur_score = new_score\n", + " cur_d1 = new_d1\n", + " cur_d2 = new_d2\n", + " switch_failures = 0\n", + " else:\n", + " # We didn't beat the current score, but allow\n", + " # for possibly switching anyways.\n", + " accept_prob = np.exp(new_score - cur_score)\n", + " coin_toss = np.random.rand()\n", + " if coin_toss < accept_prob:\n", + " # We randomly switch to the new distribution\n", + " cur_score = new_score\n", + " cur_d1 = new_d1\n", + " cur_d2 = new_d2\n", + " switch_failures = 0\n", + " else:\n", + " switch_failures += 1\n", + " \n", + " # Return both our best guess, and the ending guess\n", + " return max_d1, max_d2, cur_d1, cur_d2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now we have finished the hard work!\n", + "\n", + "# Catching the Casino\n", + "\n", + "Let's go through a couple of scenarios and see if we can catch the casino cheating with some loaded dice. **In every scenario we start with an assumption of fair dice**, and then try our hand to figure out what the *actual* distribution was.\n", + "\n", + "## Attempt 1\n", + "\n", + "\n", + "The casino is using two dice that are both biased low. How well can we recover the distribution?" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iteration: 1000; Current score (higher is better): -22147.004400281654\n", + "Simulated Annealing time: 0.30s\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import time\n", + "def simulate_casino(d1_dist, d2_dist, n=10000):\n", + " d1_vals = unfair_die(d1_dist, n)\n", + " d2_vals = unfair_die(d2_dist, n)\n", + " \n", + " start = time.perf_counter()\n", + " max_d1, max_d2, final_d1, final_d2 = optimize(d1_vals + d2_vals)\n", + " end = time.perf_counter()\n", + " print(\"Simulated Annealing time: {:.02f}s\".format(end - start))\n", + " \n", + " coef_range = np.arange(2, 13) - .5\n", + " plt.subplot(221)\n", + " plt.bar(coef_range, density_coef(d1_dist, d2_dist), width=1)\n", + " plt.title('True Distribution')\n", + " \n", + " plt.subplot(222)\n", + " plt.hist(d1_vals + d2_vals, bins=11)\n", + " plt.title('Empirical Distribution')\n", + " \n", + " plt.subplot(223)\n", + " plt.bar(coef_range, density_coef(max_d1, max_d2), width=1)\n", + " plt.title('Recovered Distribution')\n", + " \n", + " plt.gcf().set_size_inches(10, 10)\n", + "\n", + "\n", + "simulate_casino([2/9, 2/9, 2/9, 1/9, 1/9, 1/9],\n", + " [2/9, 2/9, 2/9, 1/9, 1/9, 1/9])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Attempt 2\n", + "\n", + "The casino now uses dice that are both biased towards 1 and 6." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simulated Annealing time: 0.08s\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "simulate_casino([1/3, 1/12, 1/12, 1/12, 1/12, 1/3],\n", + " [1/3, 1/12, 1/12, 1/12, 1/12, 1/3])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Attempt 3\n", + "\n", + "The casino will now use one die biased towards 1 and 6, and one die towards 3 and 4." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simulated Annealing time: 0.09s\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl0AAAJZCAYAAACTE4A9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3X2cZGV55//PFyb4iIgaZ+IgoCiP0RB2M5KYaCdsFHDD\nsEk0oLs+4O7yiyD8ousC5oFJskkkroouIS4rEjAoQU0i2aAiq73RGHlQESMDjFGGYYAxgE/oT8LD\n9fvjnMGaonq6urv6VHX35/169WuqzrnPfa5T03X1Vfe5z6lUFZIkSVpcu4w7AEmSpJXAokuSJKkD\nFl2SJEkdsOiSJEnqgEWXJElSByy6JEmSOmDRpUWT5JVJ/naE/d2Y5Pnt499P8t4R9v1bSc4dVX+S\nRi/Jd5Psu5P1f5rkNxe4jxcm2bLAPi5P8h8W0kdPXz+bZGPP868n+YVR9N32949JXjCq/rRz8T5d\nS1OS7wLb//MeB9wHPNguO7GqPrDI+/9z4KXAD9pFtwB/A5xVVd+dY1/vAzZV1e/NYZvfB9ZW1Qlz\n2Ve77RHAe6rqGXPdVtKOktwCPBV4AAhNDvqzqjplnHHNV5IXAu+rqr1nWP8Q8D2a47wPuA74X1V1\n6Tz29RDwrKr62hy2+Trw2qr65Dz2dwGwpap+Z67bajQc6Vqiqmr3qnpCVT0B2Ay8pGfZIwquJLuO\nOgTgD6pqD+BHgdcCPwd8OsmjRrmjRYh9+x8GSQtXNPnnCT05qPOCK0lXf88KeG6bew8ALgTOSfLb\n8+xrRouQ+zRmFl3LQ9qfHy5oTr9dkuT9Sb4NvCLJ+5L8Tk+bI9pPTdufr03yl0m+keSfkrxumJ1X\n1b9U1bXALwFrgFe1/b02yafax0nyriTbknwryXVJDkzy68CvAW9O8p0kH27bb0nyX5JcD9zbs6x3\nGPyxSS5tt7s6yY+37XZN8lCShz+pbj/2JE8ALgP2bk9VfCfJU9rX64Ke9v+uHXa/J8mVSfbvWbcl\nyW8kuT7JN5NcnORHhnmtpGUqAxcmr0rymSRvb98rX03y0+3yW5PcmeSVPe0vaE8RXtG+Nz/V9z5+\nKMkze9qem+Rv25H/qXbZ7/W0X5/ki0m+nWRTkhe1y1+d5IZ2H19N8p/neKwBqKp7qurPgV+nyWF7\ntv1/KskJ7eP9kky3ee8bST7QLv+/bT/Xt3G8NO2pzST/NckdwHsz+HTnuiRfSXJ3kvOT7Nbzen+6\n7//goSTPTPKfgFcA/7Xd30fa9Q+frkyyW5Kzk2xNcluSd2zPbT2xvaHN41uTvHoOr5uw6FrujgX+\nvB2Nmmnou6ApioD/DVwF/Bjwi8B/SfLzw+6sqr4D/B+aEa8d+geOAtYB+1XVE4HjgHuq6k+BvwD+\nsP2E/Cs92/4a8GLgiTPs8t8Bfw7sCXwY+Kv88NPuwE+QbYy/BNza86n8rt5tkhwEXAScRDOK93+A\ny7Ljp86XAkcAzwT+NTCS+RvSMrSO5hTck4APAJfQvGf2o3nfnJPksT3tXw78LvBk4EvAxT3r+t/X\nxwO/X1W7A3/fuyLJOppRqDe2OfAFNNMgALYBR7ejVa8B3pHk0AUc40eAVe2x9vt94ONt3tsL+B8A\nVfXCdv1z2jz0wfb5GpqctzewvRjsP+6X0+To/WhG236rZ11/22r3979oXss/bve3fkCsv9Uew3OB\nn2gf9/a9BtgdeBrwH4E/SbLHgH40A4uu5e0zVXU5QFX9YJa2PwPsXlVnVdWD7RyD99IUR3NxO01y\n7Xc/8ATg4CSpqhur6huz9HV2Vd1RVffNsP6qqrqsqh4E3tr2/1PtuoGfvIf0a8BHqur/tn2/BdgD\neF5Pm3dU1T9X1TdpitWFJGxpqfvrdlT4m+2/r+1Z9/WquqiaCcR/QVN4/G5V3V9VnwD+BXhWT/u/\nraq/r6r7gd8EfjrJ2nZd//v6I1X1OYABeeIE4Pztc5/aXHJz+/ijVXVL+/jTwBXs+GFxTqrqAeAu\nZs59+yRZ254V+Gzf+v5jehA4s319Zsp9/6Oqbq+qbwF/QFN8zmQuufDlNP83d1fV3TTFb+8Hyn+h\nKXIfrKqP0pyFOGAO/a94Fl3L21yuwNmbJjHcsz15Am8CVs9xn2uBe/oXtsn13cCfAne2pwUeN0tf\nt82y/uHjq6qHgK00n8AW6mk08+S2911tLGt72mzrefx94PEj2K+0VK2vqidV1Z7tv+f3rOt9r/x/\nAD2jy9uX9b5/et/X36PJJzO9r3eW454O/NOgFUmOSvIP7em5b9KMxD9lJ33tVJJVNKPidw9Y/Saa\nv7VXJ/lyktfM0t0/twXnzvTmxs2MJu/R9nPrTvq+u82125n75siia3nrH2b+HtA7jP9jPY+3ADe3\nCXN78tyjqo4ddmftfKlfAP5uYDBV76qqfwX8OHAI8IYZ4pwp/n5P79l3aIqire3o1H3seKxr5tDv\n7cA+fX3vxexFoLRSLWRkuV/v+/rxNKNHW2dou7P38haa0287aOc/fQj4Y+BHq2pP4KMs7BiOpRnR\nuuYRAVZ9o6r+c1WtBf4f4Nzt89JmMMxFPk/vebwPTc6CvhyfpDfvDdP3Drmvr2+NgEXXynId8JIk\nT0zyY8Dre9b9A/Av7STJR6WZjP7jSQ6brdN28uW/Bv6a5lPt+wa0+an2Z1eaT7b/Amz/xLSNZm7U\nXK1L8kvtp8w3Ad8Bru051lck2SXJS4Cf7dluG/CUNqEPcilwTJIXtH3/17bvq+cRo6QdzVbcHJ3k\nZ9ri6PeBf6iq+fzhPx94TZKfT+NpaS6I2a39uauqHkpyFPCiefRPkj2TvAI4B3hLO92gv82v9pwe\n/RZN3tue++5kfrnvpDQXPj0JeDPNPDlo5sAdkuS5aa4iP5MdC63Zcu0HgN9Kc3HRU4DfZkA+1/xZ\ndC0Pw97+4M+AG2mGjC+neYM1HTSjQ0fTTJy8BfgGzenA3XfS35vTXBl5F3AB8FngZ2eYP/ZEmiT4\nTeBrNJ9c396uew9waDvUv33C/6Bj6l/2V8C/pzn98FLgl3uGvk8Ffrnd36/QTHTdfqxfoZl4f0t7\nKnWH0wpVdQPNFZjvbl+HFwHHtK/RTLFJK9nftFfEbf/58E7aDpzo3eP9wAaaU3U/SfMen6ntjH1X\n1TU0k+TPBr4NTAP7VNW9wCnAB5PcQzNv9SOP7Gqn+/hSku8Am2jmjp1aVb87Q5w/BVzVtv9r4JTt\n88lojvOiNg/96hz2/36aeWhfbWP4g/aYNwG/R3Pxz83Ap/u2PZ+mKLsnyV8OiPW/0XxwvZ6mgLt2\ne987iUVzMNTNUZMcSfOLuwvNxMSz+tYfQPNH9zDgzVX19p51e9D8Uf1xmur+hKq6amRHIEl9kpwP\n/FtgW1U9t2f564HX0dzI82+r6vR2+Rk0fzwfoPkDekW7/DCaDyuPBi6vqv+3y+NYaeLNO7XMzTrS\n1V6Cfw7NpfuHAMcnObCv2d00p6reOqCLd9Ikq4NoLkHdOKCNJI3SBTQ562FJpmhuF/KcqnoO8N/b\n5QcBLwMOoplQfW47jw+aCz9eW1X7A/sn2aFPSZqLYU4vrqP5ipbN7RUVlwA73N+jqu6qqs/TfEp8\nWDux+ueq6oK23QPtfZIkadFU1WdoTi33+nWaeTcPtG22X0G3HrikzU+30JyuWddOQt69PU0Fzb3b\nhr6wRPPi6Sota8MUXWvZ8bLc/kvnd+YZwF1p7hL8hSTnJXnMXIOUpBHYH3hBks+luWP4v2qX9+e4\nre2ytex4xepccp/moapO8NSilrPFnki/imae159U1WE09/Q4fZH3KUmDrAL2rKrDaa5I/eAs7SVp\npFYN0WYrzY0zt9uLme+Z0u82mkmR2y/j/xBw2qCGSRxWllaYqhrl/Z1mswX4y3a/1yR5MMmTmTnH\nbWXH+yHNmPvMX9LKNNccNsxI1zXAs5Ls09435TiaLwyeycMBVNU2YEt++GXBRwA3zLRhVU3Mz5ln\nnjn2GIxnacdkPDv/6UD/F8H/Nc3Ne9l+v6ZqvurkMuDX2vvNPYPmK2murqo7gW8nWddOrH8lO7m1\nwLhfz+X6e7LSj8Njmdyf+Zh1pKuqHkxyMs09QbbfMmJjkhOb1XVektU09/PYHXgoyanAwfXD+6Fc\nnOabyr9Gc98USVo0Sd4PTAFPTnIrzU0i3wtckOTLNN9Y8Epo7svW3h/uBpq7ir+ufphRT2LHW0Z8\nrMvjkLS8DHN6kTbRHNC37H/2PN7GjsPwve2+xA+/hFiSFl1VvXyGVf9h0MKq+iPgjwYs/zzwnBGG\nJmkF8470M5iamhp3CDswntlNWkzGo6VoVL8na9bsS5JF+VmzZt/OjmMSeCzLx1B3pO9CkpqUWCQt\nviRUtxPpF43565GaaXCL9Zpk3nNqpFGZTw5zpEuSJKkDFl2SJEkdsOiSJEnqgEWXJElSByy6JEmS\nOmDRtYyM6hLtYS7HXqp8jSRJ4+ItI5aR0V2ivXwvx/Y1mhzeMmJ585YRWu68ZYQkSdKEsuiSJEnq\ngEWXJElSByy6JEla4sb9XZcajhPplxEnic/O12hyOJF+eXMifbd8vbvnRHpJkqQJZdElSZLUAYsu\nSZKkDlh0SZIkdcCiS5IkqQMWXZIkSR2w6JIkSeqARZckSVIHLLokSZI6MFTRleTIJDcmuTnJaQPW\nH5Dks0l+kOQNA9bvkuQLSS4bRdCStDNJzk+yLcn1A9a9MclDSZ7Us+yMJJuSbEzyop7lhyW5vs19\nZ3cVv6TladaiK8kuwDnAi4FDgOOTHNjX7G7g9cBbZ+jmVOCGBcQpSXNxAU3O2kGSvYBfBDb3LDsI\neBlwEHAUcG6a71QB+FPgtVW1P7B/kkf0KUnDGmakax2wqao2V9X9wCXA+t4GVXVXVX0eeKB/4zbJ\nHQ28ZwTxStKsquozwDcHrHoH8Ka+ZeuBS6rqgaq6BdgErEuyBti9qq5p210EHLtIIUtaAYYputYC\nW3qe39YuG9b2JOe3ZUoamyTHAFuq6st9q/pz3NZ22VqafLfdXHOfJO1gUSfSJ3kJsK2qrgPS/khS\np5I8BngzcOa4Y5G0cq0aos1WYO+e53u1y4bxfOCYJEcDjwF2T3JRVb1yUOMNGzY8/Hhqaoqpqakh\ndyNp0k1PTzM9PT2u3e8H7At8qZ2vtRfwhSTrmDnHbQWePmD5QOYvaXkbRQ5L1c7P+iXZFbgJOAK4\nA7gaOL6qNg5oeyZwb1W9bcC6FwJvrKpjZthPzRaLdq75WzKK1zAs1/8LX6PJkYSqWrTR7yT7An9T\nVc8ZsO7rwGFV9c0kBwMXA8+jOX34CeDZVVVJPgecAlwD/C3wrqr62ID+zF99RvdeG9i7778+vt7d\nm08Om3Wkq6oeTHIycAXN6cjzq2pjkhOb1XVektXAtcDuwENJTgUOrqp7534YkrQwSd4PTAFPTnIr\ncGZVXdDTpGinO1TVDUkupbnC+n7gdT0V1EnAnwGPBi4fVHBJ0rBmHenqip8UF85RnNn5Gk2OxR7p\n6pL565EceemWr3f35pPDvCO9JElSByy6JEmSOmDRJUmS1AGLLkmSpA5YdEmSJHXAokuSJKkDFl2S\nJEkdsOiSJEnqgEWXJElSByy6JEmSOmDRJUmS1AGLLkmSpA5YdEmSJHXAokuSJKkDFl2SJEkdsOiS\nJEnqgEWXJElSByy6JEmSOmDRJUmS1AGLrgmwZs2+JFnwz6QZ1XGtWbPvuA9lgEct42OTpF6jyXfm\nQEhVjTsGAJLUpMTStaZgGsWxj66fUfxfjPK4RvW7sVxf66UoCVU1eZ8W5mEl56+ZjO69NrD3Ffu+\nmcliv97+Xz7SfHKYI12SJEkdsOiSJEnqwFBFV5Ijk9yY5OYkpw1Yf0CSzyb5QZI39CzfK8knk3wl\nyZeTnDLK4CVpkCTnJ9mW5PqeZX+cZGOS65J8OMkTetadkWRTu/5FPcsPS3J9m/vO7vo4JC0vsxZd\nSXYBzgFeDBwCHJ/kwL5mdwOvB97at/wB4A1VdQjw08BJA7aVpFG7gCZn9boCOKSqDgU2AWcAJDkY\neBlwEHAUcG5+eGXKnwKvrar9gf2T9Pe5pI3qYpelcGGPNAmGGelaB2yqqs1VdT9wCbC+t0FV3VVV\nn6cpsnqX31lV17WP7wU2AmtHErkkzaCqPgN8s2/ZlVX1UPv0c8Be7eNjgEuq6oGquoWmIFuXZA2w\ne1Vd07a7CDh20YPv0LZtm2kmSC/Gj6R+wxRda4EtPc9vYx6FU5J9gUOBq+a6rSSN2AnA5e3j/hy3\ntV22libfbTev3CdJ263qYidJHg98CDi1HfEaaMOGDQ8/npqaYmpqatFjk9SN6elppqenxx0GSX4T\nuL+qPjDKfs1f0vI2ihw26326khwObKiqI9vnpwNVVWcNaHsm8N2qenvPslXA/wY+WlXv3Ml+Vux9\nbpbrvaO8T9dw/azk3/vFvE9Xkn2Av6mq5/YsezXwn4BfqKr72mU75LQkHwPOBDYDn6qqg9rlxwEv\nrKpfH7CvJZm/vLfT8uH/ZfcW6z5d1wDPSrJPkt2A44DLdhZH3/P3AjfsrOCSpEUQevJRkiOBNwHH\nbC+4WpcBxyXZLckzgGcBV1fVncC3k6xrJ9a/EvhId+FLWm5mPb1YVQ8mOZnmyp9dgPOramOSE5vV\ndV6S1cC1wO7AQ0lOBQ4GfgJ4BfDlJF+kKZXfXFUfW6TjkSSSvB+YAp6c5Faakas3A7sBn2ivrvtc\nVb2uqm5IcilwA3A/8LqeYauTgD8DHg1cbu6StBB+DdAEWK6nvDy9OFw/K/n33q8BGi9PSS0f/l92\nz68BkiRJmlAWXZIktRbzhrFr1uw77sPTmHl6cQIs11Nenl4crp+V/Hvv6cXx8pTUgJ4X+TVZqnEv\nxddksXl6UZIkaUJZdEmSJHXAokuSJKkDFl2SJEkdsOiSJEnqgEWXJElSByy6JEmSOmDRJUmS1AGL\nLkmSpA5YdEmSJHXAokuSJKkDFl2SJEkdsOiSJEnqgEWXJElSByy6JEmSOmDRJUmS1IFV4w5AkqS5\neRRJxh2ENGcWXZKkJeY+oBapb4s5LR5PL0qSJHVgqKIryZFJbkxyc5LTBqw/IMlnk/wgyRvmsq0k\njVqS85NsS3J9z7I9k1yR5KYkH0+yR8+6M5JsSrIxyYt6lh+W5Po2f53d9XFIWl5mLbqS7AKcA7wY\nOAQ4PsmBfc3uBl4PvHUe20rSqF1Ak3d6nQ5cWVUHAJ8EzgBIcjDwMuAg4Cjg3PxwwtCfAq+tqv2B\n/ZP09ylJQxtmpGsdsKmqNlfV/cAlwPreBlV1V1V9HnhgrttK0qhV1WeAb/YtXg9c2D6+EDi2fXwM\ncElVPVBVtwCbgHVJ1gC7V9U1bbuLeraRpDkbpuhaC2zpeX5bu2wYC9lWkkbpqVW1DaCq7gSe2i7v\nz1Nb22VraXLWduYvSQviRHpJK9ViXf4mSQMNc8uIrcDePc/3apcNY07bbtiw4eHHU1NTTE1NDbkb\nSZNuenqa6enpcYawLcnqqtrWnjr8Rrt8K/D0nnbb89RMywcyf0nL2yhyWKp2/mEvya7ATcARwB3A\n1cDxVbVxQNszgXur6m3z2LZmi2W5aubsjuLYR9fPKP4vRnlco/rdWK6v9VKUhKpatJsiJdkX+Juq\nek77/Czgnqo6q72Ses+qOr2dSH8x8Dya04efAJ5dVZXkc8ApwDXA3wLvqqqPDdjXksxfo3s/DOzd\nvh/h0TT3GFssS/E1Wbo5cD45bNaRrqp6MMnJwBU0pyPPr6qNSU5sVtd5SVYD1wK7Aw8lORU4uKru\nHbTtHI9LkuYkyfuBKeDJSW4FzgTeAnwwyQnAZporFqmqG5JcCtwA3A+8rqeCOgn4M5q/lpcPKrik\n4XlT15Vu1pGurizVT4qjsFxHXxzpGq6flfx7v5gjXV1aqvnLkS77noS+l+J7BxZppEsr0aR9r9mk\nxSNJ0txZdGmAUQ2Bj6pQGuWQvMWbJGk8vGWEJElSByy6JEmSOmDRJUmS1AGLLkmSpA5YdEmSJHXA\nokuSJKkDFl2SJEkdsOiSJEnqgEWXJElSByy6JEmSOmDRJUmS1AGLLkmSpA5YdEmSJHXAokuSJKkD\nFl2SJEkdsOiSJEnqgEWXJElSByy6JEmSOmDRJUmS1AGLLkmSpA5YdEmSJHVgqKIryZFJbkxyc5LT\nZmjzriSbklyX5NCe5b+R5B+TXJ/k4iS7jSp4SZqLQfkoyZ5JrkhyU5KPJ9mjp/0ZbV7bmORF44xd\n0tI3a9GVZBfgHODFwCHA8UkO7GtzFLBfVT0bOBF4d7v8acDrgcOq6rnAKuC4kR6BJA1hhnx0PHA6\ncGVVHQB8EjijbX8w8DLgIOAo4NwkGUfskpaHYUa61gGbqmpzVd0PXAKs72uzHrgIoKquAvZIsrpd\ntyvwuCSrgMcCt48kckmau9589BhgK03+urBdfyFwbPv4GOCSqnqgqm4BNtHkQ0mal2GKrrXAlp7n\nt7XLdtZmK7C2qm4H3gbc2i77VlVdOf9wJWl+BuSjb7f5aHVVbWvb3Ak8td1kYF7rLmJJy82iTqRP\n8kSaT5H7AE8DHp/k5Yu5T0kaZEA+elySVwDV17T/uSSNxKoh2mwF9u55vle7rL/N0we0+TfA16rq\nHoAkfwn8DPD+QTvasGHDw4+npqaYmpoaIjxJS8H09DTT09PjDKE/H/0VTT7almR1VW1Lsgb4Rtt+\nprw2kPlLWt5GkcNStfMPdUl2BW4CjgDuAK4Gjq+qjT1tjgZOqqqXJDkcOLuqDk+yDjgf+CngPuAC\n4Jqq+pMB+6nZYlmumrm5ozh2++mur9H1s5J/76uqs4npM+Ujmg+V91TVWe3V2XtW1entRPqLgefR\nnFb8BPDsQYlqqeav0eWegb3bt30P1fdSfO/A/HLYrCNdVfVgkpOBK2hOR55fVRuTnNisrvOq6vIk\nRyf5KvA94DXttlcn+RDwReD+9t/z5nZYkrRwO8lHuwOXJjkB2ExzxSJVdUOSS4Eb2vavW5KVlaSJ\nMetIV1eW6ifFUXCkq6t+RtmXI10L1fVI12JaqvnLkS77noS+l+J7B+aXw7wjvSRJUgcsuiRJkjpg\n0SVJktQBiy5JkqQOWHRJkiR1wKJLkiSpAxZdkiRJHbDokiRJ6oBFlyRJUgcsuiRJkjpg0SVJktQB\niy5JkqQOWHRJkiR1wKJLkiSpAxZdkiRJHbDokiRJ6oBFlyRJUgcsuiRJkjpg0SVJktQBiy5JkqQO\nWHRJkiR1wKJLkiSpAxZdkiRJHRiq6EpyZJIbk9yc5LQZ2rwryaYk1yU5tGf5Hkk+mGRjkq8ked6o\ngpekuRqUk5LsmeSKJDcl+XiSPXran9Hmto1JXjTO2CUtbbMWXUl2Ac4BXgwcAhyf5MC+NkcB+1XV\ns4ETgXf3rH4ncHlVHQT8BLBxRLFL0nz056QbgdOBK6vqAOCTwBkASQ4GXgYcBBwFnJskY4la0pI3\nzEjXOmBTVW2uqvuBS4D1fW3WAxcBVNVVwB5JVid5AvBzVXVBu+6BqvrO6MKXpOHNkJO+TZPDLmyb\nXQgc2z4+BrikbXcLsIkmJ0rSnA1TdK0FtvQ8v61dtrM2W9tlzwDuSnJBki8kOS/JYxYSsCQtwKCc\n9FhgdVVtA6iqO4Gntu1nym2SNGerOuj/MOCkqro2ydk0w/hnDmq8YcOGhx9PTU0xNTW1yOFJ6sr0\n9DTT09PjDqM/J72DJidVX7v+57Myf0nL2yhyWKp2nluSHA5sqKoj2+enA1VVZ/W0eTfwqar6i/b5\njcAL29X/UFXPbJf/LHBaVf3SgP3UbLEsV80UkVEcu/1019fo+lnJv/dV1en8qCSreWROOh3YD5iq\nqm1J1tDks4P6812SjwFnttMoevtdkvlrdLlnYO/2bd9D9b0U3zswvxw2zOnFa4BnJdknyW7AccBl\nfW0uA17ZBnE48K2q2tYO129Jsn/b7gjghrkEKEmjMkNO+gpNDnt1u+xVwEfax5cBxyXZLckzgGcB\nV3cXsaTlZNbTi1X1YJKTgStoirTzq2pjkhOb1XVeVV2e5OgkXwW+B7ymp4tTgIuT/Ajwtb51ktS1\nQTlpV+DSJCcAm2muWKSqbkhyKc2HxfuB1y3JIS1JE2HW04tdWarD86Pg6cWu+hllX55eXKhxnF5c\nLEs1f3l60b4noe+l+N6BxTu9KEmSpAWy6JIkSeqARZckSVIHLLokSZI6YNElSZLUAYsuSZKkDlh0\nSZIkdcCiS5IkqQMWXZIkSR2w6JIkSeqARZckSVIHLLokSZI6YNElSZLUAYsuSZKkDlh0SZIkdcCi\nS5IkqQMWXZIkSR2w6JIkSeqARZckSVIHLLokSZI6YNElSZLUAYsuSZKkDgxVdCU5MsmNSW5OctoM\nbd6VZFOS65Ic2rdulyRfSHLZKIKWpPnqz0dJ9kxyRZKbknw8yR49bc9o89rGJC8aX9SSloNZi64k\nuwDnAC8GDgGOT3JgX5ujgP2q6tnAicC7+7o5FbhhJBFL0sL056PTgSur6gDgk8AZAEkOBl4GHAQc\nBZybJB3HKmkZGWakax2wqao2V9X9wCXA+r4264GLAKrqKmCPJKsBkuwFHA28Z2RRS9I8zJCP1gMX\nto8vBI5tHx8DXFJVD1TVLcAmmnwoSfMyTNG1FtjS8/y2dtnO2mztafMO4E1AzTNGSRqVQflodVVt\nA6iqO4Gntst3ltckac4WdSJ9kpcA26rqOiDtjyR1bkA+mokfECUtilVDtNkK7N3zfK92WX+bpw9o\n86vAMUmOBh4D7J7koqp65aAdbdiw4eHHU1NTTE1NDRGepKVgenqa6enpcYbwfB6Zj94H3JlkdVVt\nS7IG+Ebbfqa8NpD5S1reRpHDUrXzD3VJdgVuAo4A7gCuBo6vqo09bY4GTqqqlyQ5HDi7qg7v6+eF\nwBur6pgZ9lOzxbJcNXNzR3Hs9tNdX6PrZyX/3lfVWEa/e/NRkj8G7q6qs9qrs/esqtPbifQXA8+j\nOa34CeDZgxLVUs1fo8s9A3u3b/sequ+l+N6B+eWwWUe6qurBJCcDV9Ccjjy/qjYmObFZXedV1eVJ\njk7yVeAmo1HDAAAgAElEQVR7wGvmcwCSNAZvAS5NcgKwmeaKRarqhiSX0lzpeD/wuiVZWUmaGLOO\ndHVlqX5SHAVHurrqZ5R9OdK1UOMc6Rq1pZq/HOmy70noeym+d2B+Ocw70kuSJHXAokuSJKkDFl2S\nJGlMHkWSRftZs2bfcR/gDoa5ZYQkSdIiuI/FvDXetm2TNW3Uka4FWLNm35FU4lrJRvMpb9I+zWl0\nRpVnzD3S+Hn14gJ41eFS62eUfU1eP0vx/ePVi0P1zVK9Ks2+7Xu8fTf9L+Z706sXJUmSJpBFlyRJ\nUgcsuiRJkjpg0SVJktQBiy5JkqQOWHRJkiR1wKJLkiSpAxZdkiRJHfBrgCRpBI4//j+OOwRJE25F\nFl1r1uzLtm2bxx2GNEKPGsnXuqxevQ933nnLwsNZgS655PBF6PUji9CnpHFZkV8D5Nf3rNR+RtnX\n8u2ny/fhcvoaoMX5KpMzgd9jaX4Fi33b97j7bvr3a4AkSZJWGIsuSZKkDqzIOV2SJGklGM1811Gx\n6JIkScvUfSzufLS58fSiJElSByy6JEmSOjBU0ZXkyCQ3Jrk5yWkztHlXkk1JrktyaLtsrySfTPKV\nJF9Ocsoog5ekuZgpJyXZM8kVSW5K8vEke/Rsc0ab2zYmedH4ope01M1adCXZBTgHeDFwCHB8kgP7\n2hwF7FdVzwZOBN7drnoAeENVHQL8NHBS/7aS1KGZctLpwJVVdQDwSeAMgCQHAy8DDgKOAs7NJM3K\nlbSkDDPStQ7YVFWbq+p+4BJgfV+b9cBFAFV1FbBHktVVdWdVXdcuvxfYCKwdWfSSNAcz5KS9aHLY\nhW2zC4Fj28fHAJdU1QNVdQuwiSYnStKcDVN0rQW29Dy/jUcWTv1ttva3SbIvcChw1VyDlKRR68lJ\nnwNWV9U2aAoz4Klts1lzmyQNq5OJ9EkeD3wIOLX9dClJYzMgJ/VfUz4Z348maVkZ5j5dW4G9e57v\n1S7rb/P0QW2SrKJJbu+rqp1+e+uGDRsefjw1NcXU1NQQ4UlaCqanp5menh53GDPlpG3tlIhtSdYA\n32iXz5jbHmlDz+Op9kfS8jHd/szfrF94nWRX4CbgCOAO4Grg+Kra2NPmaOCkqnpJksOBs6vq8Hbd\nRcBdVfWGWfbjF17bzyL3M8q+lm8/y/0LrwflpCRnAfdU1VntFdp7VtXp7UT6i4Hn0ZxW/ATw7P5k\n5Rde27d9T2Lfi93/3HPYrCNdVfVgkpOBK2hOR55fVRuTnNisrvOq6vIkRyf5KvA94NUASZ4PvAL4\ncpIv0hz5m6vqY3M6LkkagZlyEnAWcGmSE4DNNFcsUlU3JLkUuAG4H3hdZ58OJS07s450dcWRLvtZ\n/H5G2dfy7We5j3QtBke67Nu+J7Hvxe5/7jnMO9JLkiR1wKJLkiSpAxZdkiRJHbDokiRJ6oBFlyRJ\nUgcsuiRJkjpg0SVJktQBiy5JkqQOWHRJkiR1wKJLkiSpAxZdkiRJHbDokiRJ6oBFlyRJUgcsuiRJ\nkjpg0SVJktQBiy5JkqQOWHRJkiR1wKJLkiSpAxZdkiRJHbDokiRJ6oBFlyRJUgcsuiRJkjpg0SVJ\nktSBoYquJEcmuTHJzUlOm6HNu5JsSnJdkkPnsu1kmh53AH2mxx1An+lxBzDA9LgD6DM97gD6TI87\ngCVp6eaw+ZoedwAjMj3uAEZoetwBjND0uAMYq1mLriS7AOcALwYOAY5PcmBfm6OA/arq2cCJwLuH\n3XZyTY87gD7T4w6gz/S4AxhgetwB9JkedwB9pscdwJKztHPYfE2PO4ARmR53ACM0Pe4ARmh63AGM\n1TAjXeuATVW1uaruBy4B1ve1WQ9cBFBVVwF7JFk95LaSNKnMYZJGZtUQbdYCW3qe30aTiGZrs3bI\nbSVpUs0hh31rEXb/g0XoU9K4DFN0zUfmtVHmtdk8DbOv3x1RP8MwntH0M2kxLb14un0fLid7LmLf\ni/l/MqjvYX5v59v3qIzq/Tffvudrvn13mUsWu+/+Y1nsnDM5OW2YomsrsHfP873aZf1tnj6gzW5D\nbAtAVU3OqyJJjWHyn/lL0lCGmdN1DfCsJPsk2Q04Drisr81lwCsBkhwOfKuqtg25rSRNKnOYpJGZ\ndaSrqh5McjJwBU2Rdn5VbUxyYrO6zquqy5McneSrwPeA1+xs20U7GkkaIXOYpFFKVY07BkmSpGVv\n7Hekn6QbDybZK8knk3wlyZeTnDLOeLZLskuSLySZiNMaSfZI8sEkG9vX6nljjuc3kvxjkuuTXNye\nBupy/+cn2Zbk+p5leya5IslNST6eZI8JiOmP2/+z65J8OMkTxhlPz7o3JnkoyZO6imdUJjVnzNek\n5Zr5mrQctRDjzm8LMYm5cT5GmU/HWnRN4I0HHwDeUFWHAD8NnDQhN0I8Fbhh3EH0eCdweVUdBPwE\nMLbTLUmeBrweOKyqnktzyvy4jsO4gOZ3uNfpwJVVdQDwSeCMCYjpCuCQqjoU2NRxTIPiIclewC8C\nmzuMZZQmNWfM16TlmvmamBy1EBOS3xZiEnPjfIwsn457pGuibjxYVXdW1XXt43tp3qhrxxUPPPxH\n6WjgPeOMY7u2mv+5qroAoKoeqKrvjDmsXYHHJVkFPBa4vcudV9VngG/2LV4PXNg+vhA4dtwxVdWV\nVfVQ+/RzNFfijS2e1juAN3UVx6hNYs6Yr0nLNfM1oTlqIcaa3xZiEnPjfIwyn4676Jrppqpjl2Rf\n4FDgqvFG8vAfpUmZfPcM4K4kF7SnIc5L8phxBVNVtwNvA26luZT/W1V15bji6fHU9gpequpO4Klj\njqffCcBHxxlAkmOALVX15XHGMSoTlDPma9JyzXxNVI5aiAnObwsx6blxPobOp+MuuiZSkscDHwJO\nbT+9jiuOlwDb2k/SYTLu8LYKOAz4k6o6DPg+zXDxWCR5Is0np32ApwGPT/LyccWzExPzhyzJbwL3\nV9X7xxjDY4A3A2f2Lh5TOAs2KTljviY018zXROWohVhC+W0hJiY3zsdc8+m4i66hbjzYpXYI90PA\n+6rqI+OMBXg+cEySrwEfAH4+yUVjjuk2mtGJa9vnH6JJcOPyb4CvVdU9VfUg8JfAz4wxnu22pfn+\nUZKsAb4x5ngASPJqmlNI407c+wH7Al9K8nWa9/7nkyy5T70TljPmaxJzzXxNWo5aiEnNbwsxkblx\nPuaTT8dddE3ijQffC9xQVe8ccxxU1Zurau+qeibNa/PJqnrlmGPaBmxJsn+76AjGO/H2VuDwJI9O\nkjaecUya7R8duAx4dfv4VcA4/hjvEFOSI2lOHx1TVfeNM56q+seqWlNVz6yqZ9D8ofzJqlqKCXhi\ncsZ8TWKuma8JzFELMSn5bSEmMTfOx0jy6ViLrrZy337jwa8Al4zzxoNJng+8AviFJF9s5wMcOa54\nJtgpwMVJrqO5MugPxxVIVV1N80n2i8CXaN4U53UZQ5L3A58F9k9ya5LXAG8BfjHJTTSJ8i0TENP/\nAB4PfKL93T53zPH0KpbgKS1zxsSamBy1EJOQ3xZiEnPjfIwyn3pzVEmSpA6M+/SiJEnSimDRJUmS\n1AGLLkmSpA5YdEmSJHXAokuSJKkDFl2SJEkdsOiSJEnqgEWXJElSByy6JEmSOmDRJUmS1AGLLkmS\npA5YdEmSJHXAokuSJKkDFl2SJEkdsOiSJEnqgEWXJElSByy6JEmSOmDRJUmS1AGLLkmSpA5YdEmS\nJHXAokuSJKkDFl2SJEkdsOiSJEnqgEWXFlWSVyX59AL7+MckLxhRPC9P8rGe5w8leeYo+m77+26S\nfUfVnyRp+bDo6liSW5J8P8l3ktye5IIkjx13XIusBi1Msk9b9Hyn/bkjyWVJ/s0OG1f9eFX93c52\n0NPXTn+nq+r9VXXkbLENI8mnkpzQ1//uVXXLfPuUJC1fFl3dK+AlVfUE4FDgJ4EzxhvScJLsugjd\nFrBH+3r8BHAl8FdJXjnHftL2lRkbDI5/xvaSJI2SRdd4BKCqvgF8nKb4alYkuyX570k2tyM/5yZ5\nVM/69Um+mOTbSTYleVG7/MeSfCTJ3UluTvIfe5Z/P8kTe/r4yST/vL0ISXJCkhvabT+aZO+etg8l\neV2Sm4Gb22UHJrmibb8xyUt72j+pHa36dpLPAfvN5fWoqncBG4A/7unz60l+oX38U0muafu/I8l/\nb5v93/bfb7WjZs9rT21+Jsnbk9wFnDnD6c6XJPmnJN9I0rvfM5O8r+f5w6NpSf4b8HPAOe3+3tXz\nej2zffyEJBe1/X49yW/29PWqJJ9O8tYk97T77x2BkyQtMxZdY5RkL+AoYFPP4rOAZwHPbf9dC/xO\n234dcCHwxqraA3gBcEu73V8AtwJrgJcCf5hkqqruAD4L/ErPPo4HPlhVDyZZD5wOHAv8KPBp4AN9\noa4H1gEHt6dCrwD+HHgKcBxwbpID27bnAt8HVgOvBU5g7v4SeGqSAwaseydwdnv8+wGXtsu3z/l6\nQlU9oaquap8/D/gq8FTgD9pl/acUjwUOa3/W950y7G9bAFX1WzSv1cnt/k4Z0P4cYHdgX2AKeGWS\n1/SsXwdsBJ4MvBU4f8DxSpKWCYuu8fjrJN+hKZK20YzsbPefgN+oqm9X1feAt9AUSdAUMOdX1ScB\nquqOqrq5Ld5+Gjitqu6vqi8B7wG2n6L7APDynn0cB1zcPj4R+KOqurmqHmr3d2iSp/e0/8Oq+lZV\n3Qf8W+DrVXVRNb4EfBh4aTuf6peB366qH1TVV2iKxLm6vf33SQPW/QvwrCRPrqrvV9XVfev7Txdu\nrapzq+qhNv5B3tK+3rcBZ/PD13s+AtC+Fr8GnN7GuRl4G/Afetpurqr3VlXRvE5rkjx1AfuWJE0w\ni67xWN/OYXohcCDNiBFJfhR4LPD59pTTPcBHaUZCAJ4O/NOA/p4G3FNV3+9ZtplmlAyaoujwJKuT\nvBB4sKr+vl23D/DOnv3dTTNas7anr9t6Hu/T9nVP+/NNmoJuNc1I2aq+9puHe0l2sH3fdw9Y91rg\nAODGJFclecksfW0ZYn/98T5tiG1m8xSa1+LWvr57X9c7tz+oqv+PpmB7/Aj2LUmaQKvGHcAKtX0O\n06eTXEgzAvLvgLtoTs0d0p4W7LeFwXOkbgeelORx7egYwN7A1nY/30pyBc0I10HAJT3b3gr8t6rq\nP6XYq/eU2RZguqpe/IiDakZ37qcpDm/uiWOufhnYVlU396+oqn+iHbVL8ivAh5I8iZmvQhzm6sSn\n05zmgybe7SNt36Mpgrf7sTn0fRfNa7EPcGO7bB/a/xNJ0srjSNf4nQ38YpLntKeZ/hdwdjvqRZK1\n2yfL08z5eU2Sn0/jaUkOaE+LfRb4oySPSvJcmhGh9/Xs5wM0pxt/BXh/z/L/Cbw5ycHt/vZI8qs7\nifd/A/sn+fdJViX5kST/uo3jIZr5WBuSPKbt81WzHH/44Sm5pyY5Gfhtmnlmj2ycvCLJU9qn36Yp\nfB4C/rn9d5iJ+/3elOSJ7SnVU/lhUXod8IIkT0+yx4CYtgED7/HVvhaXAn+Q5PFJ9gF+gx3/TyRJ\nK4hFV/d2GB2pqrto5vP8TrvodJqJ359L8i2aSev7t22vAV5DU6h9G5jmhyNJLweeQTNK82GaeVWf\n6tnVZcCzgTuq6ss9+/9rmnlcl7T7ux6Y8T5WVXUv8CKaUbPb25+3ANuvsHw9zeTxO4D3tj+zvR7f\nTPLdnn3/alVd2NdmuyOBr7Rz4t4B/FpV3deenvsD4O/b057rZtlvb98fAT4PfAH4m+0xV9WVNBco\nXA9c067r9U6auWx3Jzl7QKyn0Ixcfg34O+DPq+qCWWKRJC1TaQZXZmnUXMp+Nk2Rdn5VndW3/gDg\nApqrv95cVW/vWbcHzaTuH6cZiTih58oySZKkFWHWOV3tPJ1zgCNoRjWuSfKRqrqxp9ndNCMcxw7o\n4p3A5VX10iSr2HGOjCRJ0oowzOnFdcCmqtpcVffTzHdZ39ugqu6qqs8DD/QuT/IE4Oe2n1Kpqgeq\n6jujCV2SJGnpGKboWsuOl93fxo6Xve/MM4C70ny/4BeSnJfkMXMNUpIkaalb7FtGrKKZ53VSVV3b\nTjY+HTizv2ESJxFLK0xV+d2XklaMYUa6trLjvZb2Yvh7Dd0GbKmqa9vnH6Ipwgaqqon5OfPMM8ce\ng/Es7ZiMZ+c/krTSDFN0XUPztSv7JNmN5lYBl+2k/cOfXKtqG7Alyf7toiOAG+YbrCRJ0lI16+nF\nar4U+WSa+0Vtv2XExiQnNqvrvCSrgWtp7s/0UJJTgYOruafTKcDFSX6E5n5Frxm8J0mSpOVrqDld\nVfUxmu+76132P3seb6P5KpVB234J+KkFxDgWU1NT4w5hB8Yzu0mLyXgkSb2GujlqF5LUpMQiafEl\noZxIL2kF8WuAJEmSOmDRJUmS1AGLLkmSpA5YdEmSJHXAokuSJKkDFl2SJEkdsOiSJEnqgEWXJElS\nByy6JEmSOmDRtYysWbMvSRb8s2bNvuM+FEmSlh2/BmgZSQKM4jUM/l9osfk1QJJWGke6JEmSOmDR\nJUmS1AGLLkmSpA5YdEmSJHXAokuSJKkDFl2SJEkdsOiSJEnqgEWXJElSByy6JEmSOmDRJUmS1IGh\niq4kRya5McnNSU4bsP6AJJ9N8oMkbxiwfpckX0hy2SiCliRJWmpmLbqS7AKcA7wYOAQ4PsmBfc3u\nBl4PvHWGbk4FblhAnFqC/AJuSZJ+aJiRrnXApqraXFX3A5cA63sbVNVdVfV54IH+jZPsBRwNvGcE\n8WoJ2bZtM80XcC/sp+lHkqSlbZiiay2wpef5be2yYb0DeBPNX1BJkqQVaVEn0id5CbCtqq4D0v5I\nkiStOKuGaLMV2Lvn+V7tsmE8HzgmydHAY4Ddk1xUVa8c1HjDhg0PP56ammJqamrI3UiadNPT00xP\nT487DEkam1Tt/Kxfkl2Bm4AjgDuAq4Hjq2rjgLZnAvdW1dsGrHsh8MaqOmaG/dRssWjnkjCas7hh\nFP8XkxaPJksSqsrRb0krxqwjXVX1YJKTgStoTkeeX1Ubk5zYrK7zkqwGrgV2Bx5KcipwcFXdu5jB\nS3O1Zs2+I5mYv3r1Ptx55y0LD0iStGLMOtLVFUe6Fm7SRpYmLR6YzJhWKke6JK003pFekiSpAxZd\nkiRJHbDokiRJ6oBFlyRJUgcsuiRJkjpg0SVJktQBiy5JkqQOWHRJkiR1wKJLkiSpAxZdkiRJHbDo\nkiRJ6oBFlyRJUgcsuiRJkjpg0SVJktQBiy5JkqQOWHRJkiR1wKJLkiSpAxZdkiRJHbDokiRJ6oBF\nlyRJUgcsuiRJkjpg0SVJktQBiy5JkqQODFV0JTkyyY1Jbk5y2oD1ByT5bJIfJHlDz/K9knwyyVeS\nfDnJKaMMXpIkaalIVe28QbILcDNwBHA7cA1wXFXd2NPmKcA+wLHAN6vq7e3yNcCaqrouyeOBzwPr\ne7ft6aNmi0U7lwQYxWsYRvF/MWnxwGTGtFIloaoy7jgkqSvDjHStAzZV1eaquh+4BFjf26Cq7qqq\nzwMP9C2/s6quax/fC2wE1o4kckmSpCVkmKJrLbCl5/ltzKNwSrIvcChw1Vy3lSRJWuo6mUjfnlr8\nEHBqO+IlSZK0oqwaos1WYO+e53u1y4aSZBVNwfW+qvrIztpu2LDh4cdTU1NMTU0NuxtJE256eprp\n6elxhyFJYzPMRPpdgZtoJtLfAVwNHF9VGwe0PRO4t6re1rPsIuCuqnpDf/u+bZ1Iv0CTNkl80uKB\nyYxppXIivaSVZtaiC5pbRgDvpDkdeX5VvSXJiUBV1XlJVgPXArsDDwH3AgcDPwH8HfBlmr90Bby5\nqj42YB8WXQs0aQXF6OJ5NHDfCPrZbnJeo5XMokvSSjNU0dUFi66FW75F16j6GWVfFl0LZdElaaXx\njvSSJEkdsOiSJEnqgEWXJElSByy6JEmSOmDRJUmS1AGLLkmSpA5YdEnz8iiSLPhnzZp9x30gkqSO\neJ+uZcT7dHXZ12S91kuR9+mStNI40iVJktQBiy5JkqQOWHRJkiR1wKJLkiSpAxZdE2DNmn1HciWc\nJEmaXF69OAEm7yq/RwP3jaAfmKzjGmVfXr24UF69KGmlWTXuADSJ7mN0hYkkSQJPL0qSJHXCokuS\nJKkDFl2SJEkdsOiSJEnqgEWXJElSByy6JEmSOmDRJUmS1AGLLkmSpA4MVXQlOTLJjUluTnLagPUH\nJPlskh8kecNctpUkSVoJZv0aoCS7ADcDRwC3A9cAx1XVjT1tngLsAxwLfLOq3j7stj19+DVAC+/J\nfjrry68BWii/BkjSSjPMSNc6YFNVba6q+4FLgPW9Darqrqr6PPDAXLeVJElaCYYputYCW3qe39Yu\nG8ZCtpUkSVo2JuoLrzds2PDw46mpKaampsYWi6TRmp6eZnp6etxhSNLYDDOn63BgQ1Ud2T4/Haiq\nOmtA2zOB7/bM6ZrLts7pWnhP9tNZX87pWijndElaaYY5vXgN8Kwk+yTZDTgOuGwn7XuT6Fy3lSRJ\nWpZmPb1YVQ8mORm4gqZIO7+qNiY5sVld5yVZDVwL7A48lORU4OCqunfQtot2NJIkSRNq1tOLXfH0\n4mSd8lqe/YyyL08vLpSnFyWtNN6RXpIkqQMWXZIkSR2w6JIkSeqARZckSVIHLLokSZI6YNElSZLU\nAYsuSZKkDlh0SZIkdcCiS5IkqQMWXZIkSR2w6JIkSeqARZckSVIHLLokSZI6YNElSZLUAYsuSZKk\nDlh0SZIkdcCiS5IkqQMWXZIkSR2w6JIkSeqARZckSVIHLLokSZI6YNElSZLUgaGKriRHJrkxyc1J\nTpuhzbuSbEpyXZJDe5b/RpJ/THJ9kouT7Daq4CVJkpaKWYuuJLsA5wAvBg4Bjk9yYF+bo4D9qurZ\nwInAu9vlTwNeDxxWVc8FVgHHjfQIJEmSloBhRrrWAZuqanNV3Q9cAqzva7MeuAigqq4C9kiyul23\nK/C4JKuAxwK3jyRySZKkJWSYomstsKXn+W3tsp212QqsrarbgbcBt7bLvlVVV84/XEmS/v/27jDm\nzvKu4/j3VyqOiev0xdpAKWWMyULiKolQRxaPsoVSEupLuhkEE9MXVIgzC4gv9vjGTBMzQDCkWW3W\nBWRZJRkvqlaCx8QYCxt0Y9DSEhRKgRoyyTKWkNL9fXEOzfGs9Dmz57nu8zzP95M0nPu+r/O//6ec\n0+fX67rPXWlxWtAL6ZN8mMEs2MXABcD5ST63kOeUJEmaRSsnGHMMWDeyvXa4b3zMRacZ8xngpar6\nAUCSR4FPAQ+f7kRzc3OnHvd6PXq93gTtSVoM+v0+/X6/6zYkqTOpqjMPSM4BXgCuBV4HngS2VtXB\nkTGbgduq6oYkG4F7qmpjkquAncCvA+8Au4CnquqB05yn5utlqUoCTOO1W6ddrenVWc7v+6pK131I\nUivzznRV1ckk24F9DJYjd1bVwSTbBodrR1XtTbI5yYvA28Ctw+c+mWQP8AxwYvjfHQv1YiRJkmbV\nvDNdrTjTNVuzL0uzzjRrOdN1tpzpkrTceEd6SZKkBgxdkiRJDRi6JEmSGjB0SZIkNWDokiRJasDQ\nJUmS1IChS5IkqQFDlyRJUgOGLkmSpAYMXZIkSQ0YuiRJkhowdEmSJDVg6JIkSWrA0CVJktSAoUuS\nJKkBQ5ckSVIDhi5JkqQGDF2SJEkNGLokSZIaMHRJkiQ1YOiSJElqwNAlSZLUgKFLkiSpgYlCV5JN\nSQ4lOZzkzvcZc1+SI0kOJNkwsn9Vkm8mOZjkuSRXT6t5SZKkxWLe0JVkBXA/cB1wBbA1yeVjY64H\nLq2qy4BtwIMjh+8F9lbVJ4BPAgen1LskSdKiMclM11XAkap6uapOAI8AW8bGbAF2A1TVfmBVktVJ\nPgR8uqp2DY+9W1U/nF77kiRJi8MkoetC4OjI9qvDfWcac2y47xLgzSS7kjydZEeS886mYUmSpMVo\noS+kXwlcCTxQVVcCPwbuWuBzSpIkzZyVE4w5Bqwb2V473Dc+5qL3GXO0qr49fLwHOO2F+ABzc3On\nHvd6PXq93gTtSVoM+v0+/X6/6zYkqTOpqjMPSM4BXgCuBV4HngS2VtXBkTGbgduq6oYkG4F7qmrj\n8Ni/An9QVYeTfAn4YFX9VPBKUvP1slQlAabx2q3Trtb06izn931Vpes+JKmVeWe6qupkku3APgbL\nkTur6mCSbYPDtaOq9ibZnORF4G3g1pEStwMPJfk54KWxY5IkScvCvDNdrTjTNVuzL0uzzjRrOdN1\ntpzpkrTceEd6SZKkBgxdkiRJDRi6JEmSGjB0SZIkNWDokiRJasDQJUmS1IChS5IkqQFDlyRJUgOG\nLkmSpAYMXZIkSQ0YuiRJkhowdEmSJDVg6JIkSWrA0CVJktSAoUuSJKkBQ5ckSVIDhi5JkqQGDF2S\nJEkNGLokSZIaMHRJkiQ1YOiSJElqwNAlSZLUgKFLkiSpgYlCV5JNSQ4lOZzkzvcZc1+SI0kOJNkw\ndmxFkqeTPDaNpiVJkhabeUNXkhXA/cB1wBXA1iSXj425Hri0qi4DtgEPjpW5A3h+Kh1LkiQtQpPM\ndF0FHKmql6vqBPAIsGVszBZgN0BV7QdWJVkNkGQtsBn46tS6liRJWmQmCV0XAkdHtl8d7jvTmGMj\nY74CfBGo/2ePkiRJi97KhSye5AbgeFUdSNIDcqbxc3Nzpx73ej16vd5CtiepoX6/T7/f77oNSepM\nqs48AZVkIzBXVZuG23cBVVV/MTLmQeBfquobw+1DwG8yuJbrd4F3gfOAXwQeraqbT3Oemq+XpSoJ\n05kItE67WtOrs5zf91V1xr+ISdJSMsny4lPAx5JcnORc4CZg/FuIjwE3w6mQ9lZVHa+qu6tqXVV9\ndPi8J04XuCRJkpa6eZcXq+pkku3APgYhbWdVHUyybXC4dlTV3iSbk7wIvA3curBtS5IkLS7zLi+2\n4vzXcKMAAAfsSURBVPLibC15Lc0606zl8uLZcnlR0nLjHeklSZIaMHRJkiQ1YOg6C2vWrCfJWf+S\nJElLn9d0nQWvxVpsdaZZa1p1PgC8c9ZVVq++mDfe+K+zrtOS13RJWm4MXWfB0LXY6kyz1uzVWYyf\nH0OXpOXE5UVJkqQGDF2SJEkNGLokSZIaMHRJkiQ1YOiSJElqwNAlSZLUgKFLkiSpAUOXJElSA4Yu\nSZKkBgxdkiRJDRi6JEmSGjB0SZIkNWDokiRJasDQJUmS1IChS5IkqYFlGbrWrFlPkrP+JUmSNKlU\nVdc9AJCkWvUyCEzTOJd1FledadaavTqz8lmeVBKqyr+9SFo2JprpSrIpyaEkh5Pc+T5j7ktyJMmB\nJBuG+9YmeSLJc0meTXL7NJuX9J6fn8rs7Zo167t+IZK0ZM0705VkBXAYuBZ4DXgKuKmqDo2MuR7Y\nXlU3JLkauLeqNiZZA6ypqgNJzge+A2wZfe5IDWe6rLPAdaZZa+nWafk5dKZL0nIyyUzXVcCRqnq5\nqk4AjwBbxsZsAXYDVNV+YFWS1VX1RlUdGO7/EXAQuHBq3UuSJC0Sk4SuC4GjI9uv8tPBaXzMsfEx\nSdYDG4D9P2uTkiRJi12Tby8Olxb3AHcMZ7wkSZKWlZUTjDkGrBvZXjvcNz7motONSbKSQeD6elV9\n60wnmpubO/W41+vR6/UmaE/SYtDv9+n3+123IUmdmeRC+nOAFxhcSP868CSwtaoOjozZDNw2vJB+\nI3BPVW0cHtsNvFlVX5jnPF5Ib50FrjPNWku3jhfSS9LCmHemq6pOJtkO7GOwHLmzqg4m2TY4XDuq\nam+SzUleBN4GbgFIcg3weeDZJM8w+Klwd1X94wK9HkmSpJnkzVHPrpJ1FlWdadZaunWc6ZKkhbEs\n/xkgSZKk1gxdkiRJDRi6JEmSGjB0SZIkNWDokiRJasDQJUmS1IChS5IkqQFDlyRJUgOGLkmSpAYM\nXZIkSQ0YuiRJkhowdEmSJDVg6JIkSWrA0CVJktSAoUuSJKkBQ5ckSVIDhi5JkqQGDF2SJEkNGLok\nSZIaMHRJkiQ1YOiSJElqwNAlSZLUgKFLkiSpgYlCV5JNSQ4lOZzkzvcZc1+SI0kOJNnwszxXkiRp\nqZs3dCVZAdwPXAdcAWxNcvnYmOuBS6vqMmAb8OCkz51d/a4bGNPvuoEx/a4bOI1+1w2M6XfdwJh+\n1w1I0rI2yUzXVcCRqnq5qk4AjwBbxsZsAXYDVNV+YFWS1RM+d0b1u25gTL/rBsb0u27gNPpdNzCm\n33UDY/pdNyBJy9okoetC4OjI9qvDfZOMmeS5kiRJS95CXUifBaorSZK0KK2cYMwxYN3I9trhvvEx\nF51mzLkTPPeUpGVWm+RcfzalOpOwn+nUmbWeFl8/bT+HkrR8TBK6ngI+luRi4HXgJmDr2JjHgNuA\nbyTZCLxVVceTvDnBcwGoKv+klyRJS9a8oauqTibZDuxjsBy5s6oOJtk2OFw7qmpvks1JXgTeBm49\n03MX7NVIkiTNqFRV1z1IkiQteZ3fkX6Wbp6aZG2SJ5I8l+TZJLd32c97kqxI8nSSx7ruBSDJqiTf\nTHJw+Ht1dcf9/FGS7yf5XpKHkpzb+Pw7kxxP8r2Rfb+UZF+SF5L8U5JVM9DTXw7/nx1I8vdJPtRl\nPyPH/jjJT5L8cqt+JKkLnYauGbx56rvAF6rqCuA3gNtm5GaudwDPd93EiHuBvVX1CeCTQGdLxkku\nAP4QuLKqfpXBkvlNjdvYxeA9POou4PGq+hXgCeBPZqCnfcAVVbUBONK4p9P1Q5K1wGeBlxv2Ikmd\n6Hqma6ZunlpVb1TVgeHjHzEIE53eV2z4Q2kz8NUu+3jPcHbk01W1C6Cq3q2qH3bc1jnALyRZCXwQ\neK3lyavq34D/Gdu9Bfja8PHXgN/puqeqeryqfjLc/A8G3yburJ+hrwBfbNWHJHWp69A1szdPTbIe\n2ADs77aTUz+UZuXiu0uAN5PsGi557khyXlfNVNVrwF8BrzC4HclbVfV4V/2M+EhVHYdBmAc+0nE/\n434f+IcuG0hyI3C0qp7tsg9JaqXr0DWTkpwP7AHuGM54ddXHDcDx4exbmI2bzq4ErgQeqKorgR8z\nWErrRJIPM5hVuhi4ADg/yee66ucMZiU0k+RPgRNV9XCHPZwH3A18aXR3R+1IUhNdh65Jbrza1HCJ\nag/w9ar6Vpe9ANcANyZ5Cfg74LeS7O64p1cZzE58e7i9h0EI68pngJeq6gdVdRJ4FPhUh/285/jw\n3x8lyRrgvzvuB4AktzBYru46mF4KrAe+m+Q/GXz2v5Nk1mYEJWlqug5dp268OvzG2U0MbrTapb8F\nnq+qezvug6q6u6rWVdVHGfzePFFVN3fc03HgaJKPD3ddS7cX+b8CbEzygQxupX4t3VzYPz4T+Rhw\ny/Dx7wFdBPj/01OSTQyWqm+sqne67Keqvl9Va6rqo1V1CYMw/2tVNRPhVJIWQqehazgz8d7NU58D\nHuny5qlJrgE+D/x2kmeG1yxt6qqfGXY78FCSAwy+vfjnXTVSVU8ymG17Bvgugx/qO1r2kORh4N+B\njyd5JcmtwJeBzyZ5gUEQ/PIM9PTXwPnAPw/f23/TcT+jCpcXJS1x3hxVkiSpga6XFyVJkpYFQ5ck\nSVIDhi5JkqQGDF2SJEkNGLokSZIaMHRJkiQ1YOiSJElqwNAlSZLUwP8CHn/r6AGrAPcAAAAASUVO\nRK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "simulate_casino([1/3, 1/12, 1/12, 1/12, 1/12, 1/3],\n", + " [1/12, 1/12, 1/3, 1/3, 1/12, 1/12])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Attempt 4\n", + "\n", + "We'll now finally go to a fair casino to make sure that we can still recognize a positive result." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simulated Annealing time: 0.02s\n" + ] + }, + { + "data": { + "image/png": "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\nhoSz1PA0AAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "simulate_casino(np.repeat(1/6, 6), np.repeat(1/6, 6))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Attempt 5\n", + "\n", + "We've so far been working with a large amount of data - 10,000 data points. Can we now scale things back to only 250 throws? We'll start with two dice biased high." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iteration: 1000; Current score (higher is better): -551.6995384525453\n", + "Iteration: 2000; Current score (higher is better): -547.7803673440676\n", + "Iteration: 3000; Current score (higher is better): -547.9805613193807\n", + "Iteration: 4000; Current score (higher is better): -546.7574874775273\n", + "Iteration: 5000; Current score (higher is better): -549.5798007672656\n", + "Iteration: 6000; Current score (higher is better): -545.0354060154496\n", + "Iteration: 7000; Current score (higher is better): -550.1134504086606\n", + "Iteration: 8000; Current score (higher is better): -549.9306537114975\n", + "Iteration: 9000; Current score (higher is better): -550.7075182119111\n", + "Iteration: 10000; Current score (higher is better): -549.400679551826\n", + "Simulated Annealing time: 1.94s\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "simulate_casino([1/9, 1/9, 1/9, 2/9, 2/9, 2/9],\n", + " [1/9, 1/9, 1/9, 2/9, 2/9, 2/9],\n", + " n=250)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The results are surprisingly good. While the actual optimization process took much longer to finish than in the other examples, we still have a very good guess. As a caveat though: the recovered distribution tends to overfit the data. That is, if the data doesn't fit the underlying distribution well, the model will also fail.\n", + "\n", + "# Conclusion\n", + "\n", + "Given the results above, we can see that we have indeed come up with a very good algorithm to determine the distribution of two dice given their results. As a benefit, we have even seen that results come back very quickly; it's not uncommon for the optimization to converge within a tenth of a second.\n", + "\n", + "Additionally, we have seen that the algorithm can intuit the distribution even when there is not much data. While the final example shows that we can 'overfit' on the dataset, we can still get valuable information from a relatively small dataset.\n", + "\n", + "We can declare at long last: **the mathematicians have again triumphed over the casino**.\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Justification of Simulated Annealing\n", + "\n", + "## Why Simulated Annealing?\n", + "\n", + "So why even use an algorithm with a fancy title like Simulated Annealing? First of all, because the title is sexy. Second of all, because this is a reasonably complicated problem to try and solve. We have a parameter space where each value $p_{ij} \\in (0, 1); i, j \\in \\{1, \\ldots, 6\\}$, for a total of 12 different variables we are trying to optimize over. Additionally, given a 12-dimensional function we are trying to optimize, simulated annealing makes sure that we don't fall into a local minimum.\n", + "\n", + "## Why not something else?\n", + "\n", + "This is a fair question. There are two classes of algorithms that can also be used to solve this problem: [Non-linear optimization](https://en.wikipedia.org/wiki/Nonlinear_programming) methods, and the [EM algorithm](https://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm).\n", + "\n", + "1. I chose not to use non-linear optimization simply because I'm a bit concerned that it will trap me in a local maximum. Instead of running multiple different optimizations from different starting points, I can just use simulated annealing to take that into account. In addition, throughout the course of testing the simulated annealing code converged *incredibly* quickly - far more quickly than any non-linear solver would be able to accomplish. \n", + "\n", + "2. The EM Algorithm was originally what I intended to write this blog post with. Indeed, the post was inspired by the [crooked casino](http://web.stanford.edu/class/stats366/hmmR2.html) example which uses the EM algorithm to solve it. However, after modeling the likelihood function I realized that the algebra would very quickly get out of hand. Trying to compute all the polynomial terms would not be fun, which would be needed to actually optimize for each parameter. So while the EM algorithm would likely be much faster in raw speed terms, the amount of time needed to program and verify it meant that I was far better off using a different method for optimization." + ] + } + ], + "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.5.1" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/blog/2016-05-15-the-unfair-casino/_notebook.md b/blog/2016-05-15-the-unfair-casino/_notebook.md new file mode 100644 index 0000000..2c2029a --- /dev/null +++ b/blog/2016-05-15-the-unfair-casino/_notebook.md @@ -0,0 +1,497 @@ +Or, how to get thrown out of a casino because you're a mathematician. + +--- + +In the ongoing eternal cycle of mathematicians asking generally useless questions about probability, I dreamt up another one. The scenario is as follows: + +**You're playing a game with two die, and you do not get to see what the outcome of the die are on each roll. All you get to see is their sum. Given an arbitrarily long list of the sum of two rolls, can you determine if one or both die are loaded, and what those loadings are?** + +# Proving we can detect cheating + +My first question is simply, is this possible? There's a lot of trivial cases that make it obvious that there's cheating going on. But there are some edge cases that might give us more difficulty. First though, let's get a picture of what the fair distribution looks like. In principle, we can only detect cheating if the distribution of the fair die differs from the distribution of the loaded die. + + +```python +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +%matplotlib inline + +fair_1 = np.random.randint(1, 7, 10000) +fair_2 = np.random.randint(1, 7, 10000) + +pd.Series(fair_1 + fair_2).plot(kind='hist', bins=11); +plt.title('Fair Distribution'); +``` + + + +![png](_notebook_files/_notebook_1_0.png) + + + +This distribution makes sense: there are many ways to make a 7 (the most frequent observed value) and very few ways to make a 12 or 2; an important symmetry. As a special note, you can notice that the sum of two fair dice is a discrete case of the [Triangle Distribution][1], which is itself a special case of the [Irwin-Hall Distribution][2]. + +# The Edge Cases + +Given that we understand how the results of two fair dice are distributed, let's see some of the interesting edge cases that come up. This will give us assurance that when a casino is cheating, it is detectable (given sufficient data). To make this as hard as possible, we will think of scenarios where the expected value of the sum of loaded dice is the same as the expected value of the sum of fair dice. + +### Edge Case 1 +What happens when one die is biased low, and one die is biased high? That is, where: + +\begin{align} +\begin{array}{cc} +D_1 = \left\{ +\begin{array}{lr} +1 & w.p. 1/3\\ +2 & w.p. 1/3\\ +3 & w.p. 1/12\\ +4 & w.p. 1/12\\ +5 & w.p. 1/12\\ +6 & w.p. 1/12 +\end{array} +\right. & +D_2 = \left\{ +\begin{array}{lr} +1 & w.p. 1/12\\ +2 & w.p. 1/12\\ +3 & w.p. 1/12\\ +4 & w.p. 1/12\\ +5 & w.p. 1/3\\ +6 & w.p. 1/3 +\end{array} +\right. \\ +\mathbb{E}[D_1] = 2.5 & \mathbb{E}[D_2] = 4.5 +\end{array}\\ +\mathbb{E}[D_1 + D_2] = 7 = \mathbb{E}[D_{fair} + D_{fair}] +\end{align} + +[1]: https://en.wikipedia.org/wiki/Triangular_distribution +[2]: https://en.wikipedia.org/wiki/Irwin%E2%80%93Hall_distribution + + +```python +def unfair_die(p_vals, n): + x = np.random.multinomial(1, p_vals, n) + return x.nonzero()[1] + 1 + +d1 = [1/3, 1/3, 1/12, 1/12, 1/12, 1/12] +d2 = [1/12, 1/12, 1/12, 1/12, 1/3, 1/3] + +x1 = unfair_die(d1, 10000) +x2 = unfair_die(d2, 10000) + +pd.Series(x1 + x2).plot(kind='hist', bins=11); +plt.title('$D_1$ biased low, $D_2$ biased high'); +``` + + + +![png](_notebook_files/_notebook_3_0.png) + + + +We can see that while the 7 value remains the most likely (as expected), the distribution is not so nicely shaped any more. + +**Edge Case 2:** When one die is loaded low, and one is loaded high, we've seen how we can detect them. How about when two die are loaded both low and high? That is, we have the following distribution: + +\begin{align} +\begin{array}{cc} +D_1 = \left\{ +\begin{array}{lr} +1 & w.p. 1/3\\ +2 & w.p. 1/12\\ +3 & w.p. 1/12\\ +4 & w.p. 1/12\\ +5 & w.p. 1/12\\ +6 & w.p. 1/3 +\end{array} +\right. & +D_2 = \left\{ +\begin{array}{lr} +1 & w.p. 1/3\\ +2 & w.p. 1/12\\ +3 & w.p. 1/12\\ +4 & w.p. 1/12\\ +5 & w.p. 1/12\\ +6 & w.p. 1/3 +\end{array} +\right. \\ +\mathbb{E}[D_1] = 3.5 & \mathbb{E}[D_2] = 3.5 +\end{array}\\ +\mathbb{E}[D_1 + D_2] = 7 = \mathbb{E}[D_{fair} + D_{fair}] +\end{align} + +We can see even that the expected value of each individual die is the same as the fair die! However, the distribution (if we are doing this correctly) should still be skewed: + + +```python +d1 = [1/3, 1/12, 1/12, 1/12, 1/12, 1/3] +d2 = d1 + +x1 = unfair_die(d1, 10000) +x2 = unfair_die(d2, 10000) + +pd.Series(x1 + x2).plot(kind='hist', bins=11) +plt.title("$D_1$ and $D_2$ biased to 1 and 6"); +``` + + + +![png](_notebook_files/_notebook_5_0.png) + + + +In a very un-subtle way, we have of course made the values 2 and 12 far more likely. + +# Detection Conclusion + +There are some trivial examples of cheating that are easy to detect: whenever the expected value of the sum of two fair dice deviates from the expected value for the sum of two fair dice, we can immediately conclude that there is cheating at stake. + +The interesting edge cases occur when the expected value of the sum of loaded dice matches the expected value of the sum of fair dice. Considering the above examples (and a couple more I ran through in developing this), we have seen that in every circumstance having two unfair dice leads to a distribution of results different from the fair results. + +We can thus finally state: **just by looking at the distribution of results from this game, we can immediately conclude whether there is cheating.** + +# Simulated Annealing + +What we really would like to do though, is see if there is any way to determine how exactly the dice are loaded. This is significantly more complicated, but we can borrow some algorithms from Machine Learning to figure out exactly how to perform this process. I'm using the Simulated Annealing algorithm, and I discuss why this works and why I chose it over some of the alternatives in the [justification](#Justification-of-Simulated-Annealing). If you don't care about how I set up the model and just want to see the code, check out [the actual code](#The-actual-code). + +[Simulated Annealing][3] is a variation of the [Metropolis-Hastings Algorithm][4], but the important thing for us is: Simulated Annealing allows us to quickly optimize high-dimensional problems. But what exactly are we trying to optimize? Ideally, we want a function that can tell us whether one distribution for the dice better explains the results than another distribution. This is known as the **likelihood** function. + +## Deriving the Likelihood function + +To derive our likelihood function, we want to know: **what is the probability of seeing a specific result given those hidden parameters?** This is actually a surprisingly difficult problem. While we can do a lot of calculations by hand, we need a more general solution since we will be working with very some interesting die distributions. + +We first note that the sum of two dice can take on 11 different values - 2 through 12. This implies that each individual sum follows a [Categorical distribution](https://en.wikipedia.org/wiki/Categorical_distribution). That is: + +\begin{align} +\mathcal{L(x)} = \left\{ +\begin{array}{lr} +p_2 & x = 2\\ +p_3 & x = 3\\ +\ldots & \\ +p_{11} & x = 11\\ +p_{12} & x = 12 +\end{array} +\right. +\end{align} + +Where each $p_i$ is the probability of seeing that specific result. However, we need to calculate what each probability is! I'll save you the details, but [this author](http://math.stackexchange.com/a/1646360/320784) explains how to do it. + +Now, we would like to know the likelihood of our entire data-set. This is trivial: + +\begin{align} +\mathcal{L(\mathbf{X})} &= \prod_{i=1}^n L(x) +\end{align} + +However, it's typically much easier to work with the $\log(\mathcal{L})$ function instead. This is critically important from a computational perspective: when you multiply so many small numbers together (i.e. the product of $L(x)$ terms) the computer suffers from rounding error; if we don't control for this, we will find that no matter the distributions we choose for each die, the "likelihood" will be close to zero because the computer is not precise enough. + +\begin{align} +\log(\mathcal{L}) &= \sum_{i=1}^n \log(L) +\end{align} + +## The process of Simulated Annealing + +The means by which we optimize our likelihood function is the simulated annealing algorithm. The way it works is as follows: + +1. Start with a random guess for the parameters we are trying to optimize. In our case we are trying to guess the distribution of two dice, and so we "optimize" until we have a distribution that matches the data. + +2. For each iteration of the algorithm: + + 1. Generate a new "proposed" set of parameters based on the current parameters - + i.e. slightly modify the current parameters to get a new set of parameters. + 2. Calculate the value of $\log(\mathcal{L})$ for each set of parameters. If the function value for the + proposed parameter set is higher than for the current, automatically switch to the new parameter set + and continue the next iteration. + 3. Given the new parameter set performs worse, determine a probability of switching to the new parameter set anyways: $\mathcal{P}(p_{current}, p_{proposed})$ + 4. Switch to the new parameter set with probability $\mathcal{P}$. If you fail to switch, begin the next iteration. + +3. The algorithm is complete after we fail to make a transition $n$ times in a row. + +If everything goes according to plan, we will have a value that is close to the true distribution of each die. + +# The actual code + +We start by defining the score function. This will tell us how well the proposed die densities actually explain the results. + +[3]:https://en.wikipedia.org/wiki/Simulated_annealing +[4]:https://en.wikipedia.org/wiki/Metropolis%E2%80%93Hastings_algorithm + + +```python +import numpy as np +from numpy import polynomial + +def density_coef(d1_density, d2_density): + # Calculating the probabilities of each outcome was taken + # from this author: http://math.stackexchange.com/a/1710392/320784 + d1_p = polynomial.Polynomial(d1_density) + d2_p = polynomial.Polynomial(d2_density) + coefs = (d1_p * d2_p).coef + return coefs + +def score(x, d1_density, d2_density): + # We've now got the probabilities of each event, but we need + # to shift the array a bit so we can use the x values to actually + # index into it. This will allow us to do all the calculations + # incredibly quickly + coefs = density_coef(d1_density, d2_density) + coefs = np.hstack((0, 0, coefs)) + return np.log(coefs[x]).sum() +``` + +Afterward, we need to write something to permute the proposal densities. We make random modifications, and eventually the best one survives. + + +```python +def permute(d1_density, d2_density): + # To ensure we have legitimate densities, we will randomly + # increase one die face probability by `change`, + # and decrease one by `change`. + # This means there are something less than (1/`change`)^12 possibilities + # we are trying to search over. + change = .01 + + d1_index1, d1_index2 = np.random.randint(0, 6, 2) + d2_index1, d2_index2 = np.random.randint(0, 6, 2) + + # Also make sure to copy. I've had some weird aliasing issues + # in the past that made everything blow up. + new_d1 = np.float64(np.copy(d1_density)) + new_d2 = np.float64(np.copy(d2_density)) + + # While this doesn't account for the possibility that some + # values go negative, in practice this never happens + new_d1[d1_index1] += change + new_d1[d1_index2] -= change + new_d2[d2_index1] += change + new_d2[d2_index2] -= change + + return new_d1, new_d2 +``` + +Now we've got the main algorithm code to do. This is what brings all the pieces together. + + +```python +def optimize(data, conv_count=10, max_iter=1e4): + switch_failures = 0 + iter_count = 0 + + # Start with guessing fair dice + cur_d1 = np.repeat(1/6, 6) + cur_d2 = np.repeat(1/6, 6) + cur_score = score(data, cur_d1, cur_d2) + + # Keep track of our best guesses - may not be + # what we end with + max_score = cur_score + max_d1 = cur_d1 + max_d2 = cur_d2 + + # Optimization stops when we have failed to switch `conv_count` + # times (presumably because we have a great guess), or we reach + # the maximum number of iterations. + while switch_failures < conv_count and iter_count < max_iter: + iter_count += 1 + if iter_count % (max_iter / 10) == 0: + print('Iteration: {}; Current score (higher is better): {}'.format( + iter_count, cur_score)) + + new_d1, new_d2 = permute(cur_d1, cur_d2) + new_score = score(data, new_d1, new_d2) + + if new_score > max_score: + max_score = new_score + max_d1 = new_d1 + max_d2 = new_d2 + + if new_score > cur_score: + # If the new permutation beats the old one, + # automatically select it. + cur_score = new_score + cur_d1 = new_d1 + cur_d2 = new_d2 + switch_failures = 0 + else: + # We didn't beat the current score, but allow + # for possibly switching anyways. + accept_prob = np.exp(new_score - cur_score) + coin_toss = np.random.rand() + if coin_toss < accept_prob: + # We randomly switch to the new distribution + cur_score = new_score + cur_d1 = new_d1 + cur_d2 = new_d2 + switch_failures = 0 + else: + switch_failures += 1 + + # Return both our best guess, and the ending guess + return max_d1, max_d2, cur_d1, cur_d2 +``` + +And now we have finished the hard work! + +# Catching the Casino + +Let's go through a couple of scenarios and see if we can catch the casino cheating with some loaded dice. **In every scenario we start with an assumption of fair dice**, and then try our hand to figure out what the *actual* distribution was. + +## Attempt 1 + + +The casino is using two dice that are both biased low. How well can we recover the distribution? + + +```python +import time +def simulate_casino(d1_dist, d2_dist, n=10000): + d1_vals = unfair_die(d1_dist, n) + d2_vals = unfair_die(d2_dist, n) + + start = time.perf_counter() + max_d1, max_d2, final_d1, final_d2 = optimize(d1_vals + d2_vals) + end = time.perf_counter() + print("Simulated Annealing time: {:.02f}s".format(end - start)) + + coef_range = np.arange(2, 13) - .5 + plt.subplot(221) + plt.bar(coef_range, density_coef(d1_dist, d2_dist), width=1) + plt.title('True Distribution') + + plt.subplot(222) + plt.hist(d1_vals + d2_vals, bins=11) + plt.title('Empirical Distribution') + + plt.subplot(223) + plt.bar(coef_range, density_coef(max_d1, max_d2), width=1) + plt.title('Recovered Distribution') + + plt.gcf().set_size_inches(10, 10) + + +simulate_casino([2/9, 2/9, 2/9, 1/9, 1/9, 1/9], + [2/9, 2/9, 2/9, 1/9, 1/9, 1/9]) +``` + + Iteration: 1000; Current score (higher is better): -22147.004400281654 + Simulated Annealing time: 0.30s + + + + +![png](_notebook_files/_notebook_14_1.png) + + + +## Attempt 2 + +The casino now uses dice that are both biased towards 1 and 6. + + +```python +simulate_casino([1/3, 1/12, 1/12, 1/12, 1/12, 1/3], + [1/3, 1/12, 1/12, 1/12, 1/12, 1/3]) +``` + + Simulated Annealing time: 0.08s + + + + +![png](_notebook_files/_notebook_16_1.png) + + + +## Attempt 3 + +The casino will now use one die biased towards 1 and 6, and one die towards 3 and 4. + + +```python +simulate_casino([1/3, 1/12, 1/12, 1/12, 1/12, 1/3], + [1/12, 1/12, 1/3, 1/3, 1/12, 1/12]) +``` + + Simulated Annealing time: 0.09s + + + + +![png](_notebook_files/_notebook_18_1.png) + + + +## Attempt 4 + +We'll now finally go to a fair casino to make sure that we can still recognize a positive result. + + +```python +simulate_casino(np.repeat(1/6, 6), np.repeat(1/6, 6)) +``` + + Simulated Annealing time: 0.02s + + + + +![png](_notebook_files/_notebook_20_1.png) + + + +## Attempt 5 + +We've so far been working with a large amount of data - 10,000 data points. Can we now scale things back to only 250 throws? We'll start with two dice biased high. + + +```python +simulate_casino([1/9, 1/9, 1/9, 2/9, 2/9, 2/9], + [1/9, 1/9, 1/9, 2/9, 2/9, 2/9], + n=250) +``` + + Iteration: 1000; Current score (higher is better): -551.6995384525453 + Iteration: 2000; Current score (higher is better): -547.7803673440676 + Iteration: 3000; Current score (higher is better): -547.9805613193807 + Iteration: 4000; Current score (higher is better): -546.7574874775273 + Iteration: 5000; Current score (higher is better): -549.5798007672656 + Iteration: 6000; Current score (higher is better): -545.0354060154496 + Iteration: 7000; Current score (higher is better): -550.1134504086606 + Iteration: 8000; Current score (higher is better): -549.9306537114975 + Iteration: 9000; Current score (higher is better): -550.7075182119111 + Iteration: 10000; Current score (higher is better): -549.400679551826 + Simulated Annealing time: 1.94s + + + + +![png](_notebook_files/_notebook_22_1.png) + + + +The results are surprisingly good. While the actual optimization process took much longer to finish than in the other examples, we still have a very good guess. As a caveat though: the recovered distribution tends to overfit the data. That is, if the data doesn't fit the underlying distribution well, the model will also fail. + +# Conclusion + +Given the results above, we can see that we have indeed come up with a very good algorithm to determine the distribution of two dice given their results. As a benefit, we have even seen that results come back very quickly; it's not uncommon for the optimization to converge within a tenth of a second. + +Additionally, we have seen that the algorithm can intuit the distribution even when there is not much data. While the final example shows that we can 'overfit' on the dataset, we can still get valuable information from a relatively small dataset. + +We can declare at long last: **the mathematicians have again triumphed over the casino**. + +--- + +# Justification of Simulated Annealing + +## Why Simulated Annealing? + +So why even use an algorithm with a fancy title like Simulated Annealing? First of all, because the title is sexy. Second of all, because this is a reasonably complicated problem to try and solve. We have a parameter space where each value $p_{ij} \in (0, 1); i, j \in \{1, \ldots, 6\}$, for a total of 12 different variables we are trying to optimize over. Additionally, given a 12-dimensional function we are trying to optimize, simulated annealing makes sure that we don't fall into a local minimum. + +## Why not something else? + +This is a fair question. There are two classes of algorithms that can also be used to solve this problem: [Non-linear optimization](https://en.wikipedia.org/wiki/Nonlinear_programming) methods, and the [EM algorithm](https://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm). + +1. I chose not to use non-linear optimization simply because I'm a bit concerned that it will trap me in a local maximum. Instead of running multiple different optimizations from different starting points, I can just use simulated annealing to take that into account. In addition, throughout the course of testing the simulated annealing code converged *incredibly* quickly - far more quickly than any non-linear solver would be able to accomplish. + +2. The EM Algorithm was originally what I intended to write this blog post with. Indeed, the post was inspired by the [crooked casino](http://web.stanford.edu/class/stats366/hmmR2.html) example which uses the EM algorithm to solve it. However, after modeling the likelihood function I realized that the algebra would very quickly get out of hand. Trying to compute all the polynomial terms would not be fun, which would be needed to actually optimize for each parameter. So while the EM algorithm would likely be much faster in raw speed terms, the amount of time needed to program and verify it meant that I was far better off using a different method for optimization. diff --git a/blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_14_1.png b/blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_14_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d47c41f168a39432edc5c348e91106ceb646be7a GIT binary patch literal 18634 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 KzjCkl&;J*&HW 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 bbw2s{@vrE76c_oDAQWI?^)2P3>v#VTXg524 literal 0 HcmV?d00001 diff --git a/blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_1_0.png b/blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..2206d3fc96d952ecdccd0daa53e16cb2ca803519 GIT binary patch literal 7602 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 literal 0 HcmV?d00001 diff --git a/blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_20_1.png b/blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_20_1.png new file mode 100644 index 0000000000000000000000000000000000000000..3ad1f116c10b0071d20d42322354e901091599ac GIT binary patch literal 19569 zcmch<2Ut_-);*pOib@+BNOv@Vg(A}XC<+`Y5#fMz6aib{wD#8ZOEU9Z7x3|zi;<7wDw1#xOZ*+pxXzc z)={YaDB#oyi;&dGf$&t9z{pWnw}?~-$En+jS1Uq?lMh`WCfZH?a0;!;lX41E6^B-B zmcPmD$V0bWSLnq)&VBmrgG;B`^synpE8ZhTeK#5pJ>K;r&vAVrC%hE?>1P~cc4gzL zsk4chw*7#8BwRhZ5TP}$0FFkqE=9mu;~nX%X*25g;FAy*i1UcO%C#SWO0)|1GRac=5B^1_+K6E+_4_n!l!)w;cuh2sNc&B0QC zaOxabjY=U1F3E&jyu9bqWEP8B2f(Qv>&KX9=%aX?bZE<=;F4`GaI6b=N__X+BXQ&ec~WsKUqU>p@qcIH;eyMvD>- ztzW>U=+S&kIug32R?b4m6SRe_c#G%Y)hN)OcYQ}8XUJ*V&{1LpT$_%aF+6^ckphr_ zB1dS5GYS);2l+^@IMFumV_DjiQgWnrb6D(4iF5`ORDG1VewpUogyokGWu%PH`{RnZ zeGeD9g+Kpj3#9ecIgBoquy9j_YuW(Gun5;$Wee4)P)dQiL`E$Tb@@T}8Jj1^eJ{-3 z#HItYU5mxDomkyYxq5Yq7!W_@9vv0_BXf4KcqON<^-BYg*4wd|ij5wMU&oa+Z$8i7 zSj9S?@$-R90EZqq78ToFzP5Y?VyQHZ3gh9bYBe9-b- zQRM?ev9yH*QIc_yIaCaJ0)8G)xyfi*T8~5b$QM~4%AcrJp7fU3)%7vuz6Z@GkFXman`lA0Q0vr|pa8sHhyZU9qpFVS6Piz6nvL9vWnE z$Wgn7G#uGPcWCWi-tL5*Q_b9aS&aH^g*0XcBbT+(q7^sd?;iv;EtNzIG4<(($@Qq2 zDeG=lr4HxvFx)4!oISV~=xV!la>FzQ6P@NN%ue3pdrH$LP?TAQ<&veVN9{Y`snZ=5 z%@a{W4X?&T^PL6dFL$%fr^F5p={V>S=N8$s;$Ci!ZX8b*-H=IcD;t`z?j9=Z+t~0) z?w&Q7+U(;0abbxz%Cw`0PHha>|KJZQ(I|KWEL!kc@ED|+ZVG5 zk8;Ob;IQY9oSELqA1}*!X8@!Paa0hR&k%yEp1{+o&kBm+@kO{QI%Xlg05-}U|CUbm zV(IphM3$-HhV|%(3V8F$)EbYI6@5k9YtRy8IeSe$lN?sp<&iDquERT z8)C^3$2&&DY}LK_=|i0PhJGPXv^Rfi zPkB}y?Zf@nYm9n3MaX0@V`_B7Yd$hK#UuOS+Q^%y9+xI0TsQgNY2IQT)L!yIdwcF4 z37G9Kh2w>T+@>OO9N9OoIvoRNp2IBE`XS%_%qpResfRbC!sjP7l}@+a4+y= z$p+Rv{%SW}PffrE9Onbwz>RX)hI?I?tllx#?s}{R&5->$E6*fCJCEXKRo-*_`%+&KpT` zA`n$KwH8dPD@ZlC1(m7TUiCi(rF+L^=yGmW!XtCBEG>Ekw*F3IM@Q;6#pdDFxv;pY zpBnS0(0Lp*0M&@9iKt~f@_sio(jCs15Ji-lF&VAXeBd}89+0?NV(7{Fvn<(XUSX&m-`gGpRZlAdn=*6< zr(Hd{@HEDhZ7`i7o*bGh5fxxX>u;*Zt_T#~aGmaYCbp!EVvu&qUJ?TSc4dP!^OZl-~fG^>AGM3oP1?()r|a46#PcX_O9BXJX@N*w*2 z9g#i<1*k923L2RB?W2kWb0y!n;kKARlr)ks{gNyKkLPPoI2if!X2%jH@Wb%<+QD#6 z=)E*0lpM{T1&>!w6^*v-X-{~jzGog@JSUA+zde#LdQB<%J9(cZ3FEm-pI(qJfeWml zb&Im2Up_vv`QR!xb_MrRH)Z7g28Q4aO?G!rdME3FKGU?tv8mZ>v{&UfE7N(U0slZ9 zlegmwQpv?XMWv1uHm9H=QB=*Io^;of3+hu^I+sn?LoR_+m`P%0Jq{4=I~FV0-L`(J zd1Ud{%{W3nX~ql;20H~W*GVqYc7~kPR2})Eb{N-wAQx_ZCu%djaE$s)_py4vwzm43 zA^js9R;WE$e8aVlE}Y!_+!z;McgOXo5`l!++>)pH!cVC-WjeA;mYj~LX)}1d4D0hm zonxVz{0R(votkks^Ln@}^NWh~^^v}ScZ`bYY4`GH_KW*%(_i#O_kMHxJaxF-;@Kw` zGwF8e&|TE$Jq}9Ut05PmB-s%iNq5eA6GcZ4Tr%6_fOEV-dywmcM3StM;M>$PO+`n= zXG8L6$6PoZ)mJPTl|0fCmyf-A-n#FtMdzV{8Ko2}i%!Z^l_f9UBWfZiFuoyX8xk`$_v+tEz{X8a;s?NG*s!Uwpju2!diVV!<% zSBKC-r)MPP$ArKYEo{C_gQ!EMiPGAl?3$zYQg%<+zPj=O5%(x1b4bGsRHTY++z{$x z2{GL;_oLCvFLuUAxoeK>9dkRTprA1QP1!}QV%sYULJ9XX?#=30A8y4&$Q`AewaT11 z3E3QZVQ3QpJolDvmlvK(D%p65wm}5;j({@>|Mnz*ML(Y6zQdGFyu+ zn6NGPfR?0tA26DMG+mf3>3#=0D*5n?pV!cAcS+^vDy-YQjIJytD`tSG5Z z>;$Cnj_9a7IErUEeQI`tki@oziN%a&KJ39TP3iZ*QvO05l)rj6vvQwnriWNz4y`{tiir)Pv7_@H#@)aDno@YY7N#Rr?4g1!sFwMU%2oFCa==VE;Pg#Oyi7= zw}On}jg<`~5{bs9rtykD*y8!o7M&m)Wfgcx_G@i8t$#`JNeXE)+Y6DpTUg zR(L%Ejc}CU43C@b{zy#a>$d`Z#;h0l$v$A`?Wxr!tIo%Y`)e!cJBDAImCD9NUVV=Z z$4IzKQ;Cdvv`6mvJa!G0{v58|nk5B8bf_O1aH!TC_{^+29ZNq#pCJTWbT)BLHm{eS z47qB->!G9W*_B9w!wykykUuHK9&F8pk@&f6*IX|SuDZ2dqZ~Y#wZ-%r|7G}^ro+4yU|OSCN_)C1wal>;u1$Wbef;26<$6{f1%`d z0SP=P^TLYacQ#7#0q(ZzLi=S;BOlIh^4$4H2>)Ij|I6I@`+EAn+{Nkn)1#CNfVZKa zGi1)0H>65&BSy$mCXkQcB2ibiC_ zzp0;B%G%rUBT>N7j=a-WkQlz0Ac*E-Yr^&x6!Z>|J@Bfn@2C{=0{4&R(8$M#?nJ)93Q#9R|o{Dw1s^9%9k}=F8&$JiD2#wirdBQLiTtN9M6xNlW00%(O z5hXr3RAJ(0fSM6LQ3EOE!mB*Y+vwau&YC)(-mtF_279xqpeLX_bPx&7?F$lQGmt&^ z1}eie?6LPC*oKJ@^~s5J1wgs#o(F-0_ZWus`*0P>2mC`WC?mOGX({VEicmRYuu~aH zZO`0|7+w+aN?iqom#<#Ex)>v!qxWlQUm60$xoQX_?>;^~77ZMw9r8O5muaK!F}`uq z1I4;@boM@nHT=J$br5{4I&Eo9(L2`Nk{jX^FhQI;7GM)!Pnm1n>1HEES=T+R?3YW8 zKNEj|`$hy`a4gmfG85r2Z%BfJgsL-|`{WaxyfZ(L`~?LD>Q@gm;XB+%A|qjV5g{48 zHILz_aB^LXLQ)JsR-MELa}grMLn_+d5C1{j(K_m@NzJkAT2x`Eoo1JlH7 zJLF_#J-Q}MAdVsZQH6syq_-o#Y5!DF^6FWw8OX8$J>c<&-~vyw-gR9EFu0vjJY9mm{6o=nVKMZ(t znijxw;mLb+54|Db{I*kty7*BA<3eR&$_SBlCN#t2&I4MQeB+GfOB*d-%?)|6g4G|H z>+K3ZH+*lDo1P^<yvj~pU}6h7Ab~f3#V6UL85#{?S6i#@ zi&JmRhwYJW&*e7F?2eEfrA(VMt<#wt|euj_%#`|n+NZ@I71###4(DT_JpZXQI0+9 zr?gL8(v@Y@NVmX^ErL)iU=IYL-f}vyi*6Goy42UX24f1)gZ<^}C+LA-;C`k#IhV`x zD3B4f#WDlceVsrtc271_jG-UuADLMmD$V>E?&Io_2BHx-C_(sC7di#L;ty)0?0E8K zyw3i@F>mG#enO^K<*AJ|{B3ey;wd>m@j2Xz8v1M-bQ;v|*I5@W3=e1h!ZTs-r-$Ek zNm^qj?Le#2DLM9dn|Zoq{`udN^k=Od*~r|^g-%bOD1($PHer%Vm)89I?+5kTBuA)v zIaK1Hto-qd(m>j_2$Wi-*cai;4Kch4{pk-LI9aEmat^XzZ#rswF)!E20 zCF~RUczAQ@(y!^+S~SES#l8F*uBx{$15J%)73cv@ip(6iuiidNiTOReI)z?49vyf& zK>do-Ommsf(6xbN9G}Pt^CL(uCQjaSk)~g!w|l*ATUs6^5gg!bWg z0K+VyxlpZ`&7BqTSvB%>UU1>q%e9)r$|{ou(~0m5&e`kl3wqYPZpl zsd|6?wN6cs9rT+jpDN8gwEWhkMWw`Hh1fiidPtgrcs=R5LPy8%{uRU?<-eMN2uED z(yBT1Rb3|Sb+Pb2WLeg9i=k{&>^gH*cPG$(d^i>P{?psn!c(avv)7EZzzeAzrA6x5 z9+wuT*4El;4%GgaAbiZC?H;2LtBS2upd7|@&7?4jfx09{pntC=q%TVe1+pMJTCrz2 zHc5Kr43r?vRLdq3ww7yog=|+J~~Syk1D@6o|;%eRd!}N)R&r0fB=-0m_%^05?JF^S*i@!$E7MozIz4m9q2XR%>!GzB zb&i5k+rfLiwr{IhwS)wV&VnRir8A1n0u$v>Wp?9BDZJW#(?OKMX?=d}`Y( zb}Wa}#l9xS@#qC1dmZ7P>d4^!@|hWf6dYg5Z}pt7I`zYwIrxe*v^%*o&>QL`caq9%KK;17KhzWQ3m}aN(^MEY22iZte(? z@$G&5y%7|nJYi^MwVqYs8y^tZn>4g8aOH(TRh7$Tn36%2rR7jvy@Z#JdJFP&|NF}8 zccA%~-I(9f@n6?>f5N61l^MgL!xUwJZ`^vb56ens^kHXAiaMTu?|8T?uQvtDU6*5& zAVgvHey#Ctcv^9O%D`4jR%%hKpa?ArNqY+CG1u3Kl^1oJjJse_*%X20l?F?vI4OMO z+vF!?FEU7O0|WJNDGh|(x#O>aH2#`em=Bl@pevH2z=aJgqMk>B_G(VL$lxCZiI4Ta z^iO41*Xeh+F0R)Vz;8D-TJI#tVfawfBv`f7@yOPw6SwMtWxy$zzJsoQZC9rs)iI-4 z8xvkWv-kayUqrNg88Wl{71%tA#Vfu+L}LEQWS78dZv*;vz!II1eYhX%E*du1HjI~5 zTABDhXoG`nHnnk(5SKgt5=N@BQ$&7AcZWaJVP*L$w)j#oP=qN!9|`JJ%^knF5_=Sw zQ`|2xKpV;E1eH6>Dz_4fLaynuf7O0YA$e?%>5KD>8}mTgsX19cdHNW6H?hW3Vd*e% zjpvO4&T!UGJkq#v_)xp$boR>mTbnA%rIpRn$AfZXE*Eq36pwzHo+{c@3Fo;yXGHFX z$Hnnj3AQNVip%ffRXlr`Z#Hh+*e)d{6|)W3?sx3BO#Iwx5N$+E$b#}na1Pc3uSr`} z{8UP4`2{dlT28Hs5enWJXV!~V>{82uRTfLs*+K#}6F0x1=LH?u(4cE2-*~=+8O2zE zosK*`twpInYV0u0oPpEL7C)U@y)N8vYL&3^6UYFR-B^|V1tlhKf5T7n~zQ#x&K^J$ze~~Bu%U%AYU_5+6)r36H_?bZ0 z!tT!`Gd2JfsTDtHG~q}Hkequ${V>HFki*U1!%Eda4GT}VyG zNA4xZ;eVADM||nl;DRWfoh~14iHu$zyvUWt(dcS0nSFyd6ug3yR$sI@2FFHj!rYw-Jqrinwr*3R6aguG_4tz933NM7~ zl&hGM?jeed%y4(V9uBW!ZhS`HngN?&`4m!-wJ}Zs$;B6Ll1j<4+6g{hNnW{Bgv%-7 ztD)3%MjY_gWVYfuy9~g6?2xp!_<4KK9I0}+m?dQ!#+4=r61|XaFJR;2+0r z-jWA~-=!1lkRl8&uxB{~Hie*GNiW-E?_9`Ikacv5w(DhoBhY?ekcB$tdq9W$$Lj5y z4}c9HLJS|KriupdD=!K(UEOcerhLyO5Hvw3X@4(i$kLm3bH&J}S3j}gTF2}f$6_nt5EET}d8W?I2( zW2Az%g<|dc8ARCu#;*CDs~%5-HHx+M!VzJm^pPRUfxe;?yH^*jm91+n+r6$_)vs6> zyjC{z1pnW=H7d?!Qri0BzRZt1GMWem*-ltWQt9wMp#=oYkVfV?~9+@5rGTrN+ z43i?|uh%6FyK#*qHGCyYUz_^w+iiXCybkiLX^l}3`{qei;^^+4LF7(yJQ%G!g zq$ikike9Ib5jgtLAG81&HQm?sfSKbzAGpmv((3GLxiH_@#3%=O#-cM(aWdOA?oy8X$ou#Mu4`ji2%?nEuUf~ar^CX{pM!mL z&df^Dr?*l{^Pf`6?d(&V79^##eo3jl{lOiqi%}}0$qh&o28Lsy)NOXA{%W(os}#0i zlBD_piWOl7)kGcLZrHvr6>SGGLYx$-LUCUOz9;G(U$&BGI^{{G|@;LhGuv0X)6 z86s-ime=jBA!#*10n#yBiKTR12*Ir0JOs01Iw^rwkk-y+l&{~~l;2}s5fv@J=!+M> zzj5Qn=>(H=s=p%;Im7=PwAsAUIy}265;l!PlJIDgOL$5>lE|{;H0^|7pQMHIUgxtZ z*xbtyEgT+ip!J#gv`M;O8e<(;XjHAcDs#2v4l%3m@J@4}3x$+YZY^F3Wf#mo-Yc;% zE?h{;sT?i5z$fp(p`}T20D=%Birkck|6yO5?;t(Ak12mAW`>hg0GGF_YXHKvC)CHz z(N$?{1t^{V;`M(>4eX>R1w8pU~I*({g&&`0Qup+gdwn$=_rs?V*m3wiUgq1e2FSFl+ly4 zAyW{g-`oB3RCaUg1u*}|W_cz5p9F>jHN}<>3S|52n{sQen+nfasO{Nk)s7849rphS zAN~`h{F~sXUZOp7_v=T`KNJl{MM^b^kx|59zQ?VM3e0Ck^=Z`oXP;6UMm&%$ZoNUi z+xLWWmFw6^WD}>ne^LXy__z=QQ7hUMwdvR6l|(`|edqSuu`$N+ns}Yxj(tApelTB3 z!PdbJY#r=}tut>kK{k0I{Fla4oyr7(8x4=okx76he`P*a792SS94x-_qslKz`5EGm zt{%lfZ@eVkbCUJ=)Lpa(1Yp#%Gka^!(QNoa#{Bs7GC7@Ixbk>Y2^aq8@d(F-FN>!u-3G zM=?DDc-Tgx;3if%h7vs@59kTGns)zDE~`^XVrycNN+*$f&A1B-2lF6>_0hqe0>k>da#{~umayr@v!AftlIrfMUyO~4wn%{W zu2^Mg@+%K7E9jhS5^eP$u6sZp#F}z#p7)RzKNPw~`?FL_S#I6f6(`8P zQ3!Fw4FR*hkaY0g*5@*vsS1upvfVA+=bFv96{gqAzA;izecNb(g4srVFXKIq~Vh zBfh7>Dej0}YF^u41^g=Lj;m#z__D#^Yyp?>w;wpeZ z@-Tr`)gKB*axUu+eOw@OOl=_KzfsH_v^N9!%lUN;{G|qaKDyWPhD2Ijz14TFMQE<{ zy&p9~woSD38)vEy_lrIL!x6WRr^i=+P9A#-J14pL(D&2lhHoqNC9f1KC%{e@1T6#cw#GMS1HMg~xxoW`8BtR~J>24eMyVJ z#~aTo(<909*h=3Pg@H4Q8dn3?mN81(z3rm5FWZ0v<{&>BDdNL!eKAfsGq;w3MG6)5 zkr0&OY>HCsoyJEM=^T^1>qbyPN5o?N9hct73Hyuc&UN=Mk{%X3yPqL&F=wRw`gy4G zs?G=z*JK|c`rC>VikLqsf(LO@mJRs29IQ6W7|Y^G>YJ92{$cpp#Ut+g43+Q*2gP) zE5l%^=x!!NK}LIzKQh`ckf{ML;G);06ORoh;Pt+AZuEe;0A+?bPuYtROm_V-fK4hlcTr zct_LOy~(FS8+ZLU)=H3OOTRos8@;8T=J5KsR_3L*=Zo$e$J_k)?9PzD#ls_wEBh|# zEPQ;vrK#;(`dV5{eg8Lx<^S`d<3E9lfW3_c;E>4Z;GP_IB(AUj_%YNPN?6c}Qllsu zv<1_K%88TO@Fp^I#h$img8J_=s)4$Dj56$~bm)4;u#JoIy2vw-rCc0odN1=M+{b|s zoU8PbFEL7~SWUT;giU5^7V0^1^>o+RO3bi{g8FQZ3CpYXi6Ve zdTmvFp!YC^Wn5G#wxTXgaSrP$z|B6xE=eK0@cPuO1Tgyn8!U~;=FwBun*&(f_}Fk0 zaeXadC&XAr+`Y6YB}$sMmxSpoj8$b*Eo)vh@(ZO!IYUYFCDDF}S=9$>MYkq5Pndx- zC>4~?_}Cm`2S*&5M1XW0%uWNGL z3@pc_b42C4Ni?Bm3XqZ`kIR%Jo-JzMvJ$hd?rb+^0*~p_dy<5S=GEG(Cafk+iSnZP z<7e1%2}oU}7%ah-cHdBndCJ_HA$(H+%`0v4l?)9spL>hS^?Jm zdf{i`gnFY{+2jN6H(g!a`h3s@`EYpdxF%Uh>GUooj+Rhx0YGH`TG-n&t~{O1GzaE_ z#~ty(=#JRWgIqOvZW0EV8Lydi)Veh|a2}cS*EA1N#I>hbC2*ZJxP)QtTn+>6&)<$l z>ujsZe1u!bB}-UzF2Uo?N~b^C4Rmd;G0+or{0KcYhsUeIz)M4`n+?|yYe^~`R&hJ} zj$&W;nk8K(iW$~wfa>f1sERkIsi|Uo(3?g$8sZU{hL0q7yPH7SvQ9%#rew=g53R0p z{|64JNdv`;ryvPVasG%W+Kd2xrde|0H+XG)w8*=m4gx}@tF@a|I&MKH%=d^vE`g9B ziXZIMEuC0o8yqaIuXfk>=vtf)^l06v?W>!1_d$HcpDjCX-OV5Os1L13ayixI<-i2JhscbmI?1*uOeF|>y7H@q(}MRRC)Y3b0Dni`yi(uL0kT2+a5riwq6 z>iS-7EmOs?GT>GI!;9nEEv(_rxpu!Qzh(^Z88Pa3)3VMXGs`H7kqG`nLE! z$rWWf21sjZar>6fKj@>lQtZm(8^K|jQ;6}FSt9XJZz#B}Mj#xmTGG7ubVD~0>lH0J zCR|^o!TQTvtj~SOL8qGeywmuWu8HQ_( z8Z_{)_|lD!3%k!kT8#kTRR79#bZ_ zO7|Y5kT4gM**G1Bb0cNt(3@DwZsH_I&Ha294hztBB6FCRvc@?uxUFS$r6H&-2hlWi zlNc#V#I7ZGngfTZf%)?RZsXZ&iJ3|0*2hB6R`yeCVBEsw_&K^dc?t})Z{1|YyNY+e zp4udFxYopj-~d<69oP4hWs5w!3Dcy zbr*w#{oY#}UwY6GH-R?+ODkdV#}8+U{^7O}E!>DF??&9<5AR0M@G4tOx$oHNZo~;X zwP}g`6{(N(HK-3mRXb8k7pOsLw~$t9&?Pf@p~R7Fx2}%VBhm8Iu?_iLIF7R$8L*Uq&EId2&}JtOm<4G3-8=+(1FKpPA~W;g zmK#kK=o{oQ53oNyS9~;FviFATf%Rv!%R_6_1=r-k!xS_ZN?g1Lq2!$i??v$Cg@LOe|T3 z&YET>m56V59V_yo0pZ!uxTjp-c`V@U|u=3VMI;#_5bi_I1LX*F!l(fEJ%sO*D3pYb~ni9r1i7W-Mc-JxMO;;wHVXD5CA+=b_5&9Qyep_VoP@%sRmVfJL z1lng6jN3{DDxQsg$)75^poOV8N?8Hw9x(c`2`L_TkQhURpjbhJcdVD>+}!bTtQ$I; zEt~&J%^%E#FW!6r#(!oou!sq3m`@LCbnS}EkWy#wISa;?Cg3<=_^s%>#Q-`DTI3pHwR+3UEBGe}_hhkQ9g?*$gm6z%p^@*Pv@(}hmu zUfEG0Nzs{lsz;a@70E;5+E4j?D@s!R)`-k2G5j1nehVx8?pDYnTKr{u1Y5Ou`niy} zT9OPEXUfrI@dfB6u(KAk_`$Gy$FN~i+3Q3(fF=?hZWh=0)QENw5pTkW_l_X}``5K` z|Jz{MqO||XpvwaWNUFwo(2Qj00DeIeyK)gSGT2$Nb;F7tZTDQb z=$^4QL@>6Z0ez^OH@sk*#5=8NK= z73j0Wf7I2!4bHeX6{W9yRzvyHfUexH4n0jCKsW`_n-i@6qBo5a5>NUB{q66 zJpM-LtKsL9H>y;Kc@P~PmD zti@@0%h{s3;pH`q?RxA*kzwzid-f;xNVdrWJ4+kg+Y0k?CM0ut?+s3JY)fqXZj2*a z^|s21>lgJ@yl?E2)xUB;@cp@K#H<&e((?{X{` zrwyel&RF^Vv>r9LUN`q>z+WvrGO9K7Z6$d(d4S9TmPWg@*y5>VX@VoznG`dsiV}gZ z_#pk_aDrGycl`V3&%(?^0KEIUeT&Vb6SBIku6n!RBlb(*0{O=GQhzv^$w^jf?JVhS0y|_n0I#MN&_Yr|cGrbjerK4+lnmOObmFUkQd5$l7EPf*`?- zu!NeyZ1Ps5zYM0bkzja6epWb!By{2PIqn!aV9xdFyUy>Qcm(aMdjI_sqxPDs23w*j zC(o9vpLgHZN?qY&Tgaj8^cnf)3i;hL^*LckX3e=FM%KO_F;g8GzQ1!-)+4g{NB0HB z=)`Qrr5`dwhmE&Z`eKk1d_9)On;2f(tRe^GI40>HRb6*Vs|A{s?L87bs<2cMw|{XK zd#WH$qas~O13)^@SP7O~F@snpek(^SEs-ZLE>n3h5-I;< z3H}6Wd^Ld^zQTI*pd49ii({*YVR@6VDMQ}iOh>8UOdsoJv9ToN2YHTwYt>s$K8wx_ zFp#}Ms7FELF`Pz%!wI8~W2MMR=bWH-r90Ks{MMJ5{n-2d`N;g0{Nd!+ht*|rY~&l? zpWl4RLQHlwPd)xH!rPG%&ifZ59QWa`BV2RS!``soSZ?d0uFp4rLJmFWN_mJ_(Z8ig zlBamQ4G=mM2?X(`kp_S+%o56n-ND#Th?xe51-#ZxKJ+KStxz;12SolMtfNnM-- zcj1`saoP)UpUR7O%&$eRZbWr^8J=^y-+%l7f9!o886~^=)JJRYU!32x$@8 z3|=}@E3|c6pGKZ5k{^;R1GD}SPhYxGf1DBiIShVH`~L@lM!0d(3i1LLr9;&yd*u~J zs<2$pq)AaAV;unMh%Sy07gQ7dKM0uF`BJhMxZsWGt96GLkn1hE@>e8yp`eLR`6^#! zVkd|-+m{i_s}?c60WK;e3y?EE!}OLX|Yd3V)Q4D=1P^Sm--{wV*qrdm`UA9I_ev2LNQk@!I>GM zv68LZ50eQEe*rrf`fc~symqH78(x&`RSu~Nvg-5#%A`ZtL-;B#XTEwyRwb_UG3Q>4 zBET^66I3o}`(^Q?=fJE@3KAe5Hh~V@>#n_ESHVz=Id0=(Z=lWW;?vAf=g-OLn6EM9 zu{fSrRv@95gkVGg8VL{tQGSUZ4eb`rW2Z3tzSwkq2<({1uPE!~n!T?^h`Szo};6kkqH-`#Vug*E_Wk?rf|Ta|JY0ydoJDHc9mfz>tjn@~!=kBqk0eI9!t z9z)`Ki+Rf)B&F``*|I`*2Lm+n{6{vG{R-j5y9r{n&ib$2QG>EN2t^sqN09F(`&C zqJhWn!Ww}g17dL;Te)89O`*ks3nvjjD^2K!66CcQ@)Xj`j?!w_+o(vJa**s#K7Eu{ zhD@^KMU1J}mNm7PAKfcZq}mi)xhY3&goK;5YyC&!@jshpJbv;pESgN<6)6kY(8sz{ zX9XSPuhlcdN;@CA=9k)LcXmIiXWAf`nDqy8;V)E$1mE#{3-U-v5t9*WLVBIttGG(>fS*yN$phrG@uqh>Gw6Uqi>xBZ)rLfIz2zm8_*u-^#e^AryeZ&&sKLHZ5 z9`A1f>4U#28fVq{$*3kiCBw$;`h;D2Qkv%z9g4! z`dFVmST5O{#@I<$rz@fW9rg&}3SCMhPu)>F5FB!RvUCuDl!)uf-!5_KC+qUth-Z7leN{8vA|arse0j z$BIt|ZcQ`K0(ak1XHPxuSK}Vy9nnG)5c29O(W1XAIT0J ztpG8MNf3V^RTB`?4v*G$JJh78i2qSv1?CiX6xC|c`2mZ=`O2cePb@^NXiqM6`TQTo z_NlXd^~IU3!e0LwTs3_H`9PhBFj%$j(^95nVS}-u`zafM+*DCI;?|Wz;IqFkP#y)C zo|%1wU5kmfoSCUeZ+IlsF)&0Mv!vUpLk3=J8Hj)$$DmA8n67RfOoP_}B7;6i!I#+i~|> zf(TM_1q3y#Q7B|L0^%>K zHf5NW14{&Sw*FXd*?D2#525sYu_eXnRzmc25doWy;RJ> zQFO3h_;Qub^j(x~Y0N5~z!&2SEIX~qtYa1Tx^7^7T#x0J2&oCFDNwSj#z*(LN-7Z< z1^9#DLOx%3h?wtQ--XX(@qLMzQdNBRM9-SO_e_CKS+XiT9&W$L7O`y^dD#VqwQb!D zO3|1eyUJO-dxVMaod!bz{!oaVw~(=Yf| zS4}vD2^VrK0}$&XvozWVvQF7~H#28UBS35*Byf4Ro8YmY%cVvvl-7B$JE)%v3~;MZoCsINz4W9-l5zVY%!dYwVzEPPQS3E} z6lY}7RUIlqhN8#wJzdcCaW?Y$3ii#w<;smEWWZo1LZg)5Qq7Qb7XG}txV6sR?$34k f-@@a%MEZf4ABx{Im5_Iap@7q-r${HAzW@IKoOOJV literal 0 HcmV?d00001 diff --git a/blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_22_1.png b/blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_22_1.png new file mode 100644 index 0000000000000000000000000000000000000000..8566bf7c6f4c7b39e3b0c2193d8d861b9703e4e4 GIT binary patch literal 18865 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 literal 0 HcmV?d00001 diff --git a/blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_3_0.png b/blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_3_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0f20b9234bcc097abb04a410724d61712745ff30 GIT binary patch literal 7106 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 RcnAl=+Pk8wjtBnre*pwqNhtsT literal 0 HcmV?d00001 diff --git a/blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_5_0.png b/blog/2016-05-15-the-unfair-casino/_notebook_files/_notebook_5_0.png new file mode 100644 index 0000000000000000000000000000000000000000..9ebd3e1b598512e9e1dee519940a2ac52c7f48d2 GIT binary patch literal 6982 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 literal 0 HcmV?d00001 diff --git a/blog/2016-05-15-the-unfair-casino/index.mdx b/blog/2016-05-15-the-unfair-casino/index.mdx new file mode 100644 index 0000000..a9cf07e --- /dev/null +++ b/blog/2016-05-15-the-unfair-casino/index.mdx @@ -0,0 +1,487 @@ +--- +slug: 2016/05/the-unfair-casino +title: The unfair casino +date: 2016-05-15 12:00:00 +authors: [bspeice] +tags: [] +--- + +Trying to figure out how exactly two dice are loaded in a cheating casino. + + + +In the ongoing eternal cycle of mathematicians asking generally useless questions about probability, I dreamt up another one. The scenario is as follows: + +**You're playing a game with two die, and you do not get to see what the outcome of the die are on each roll. All you get to see is their sum. Given an arbitrarily long list of the sum of two rolls, can you determine if one or both die are loaded, and what those loadings are?** + +## Proving we can detect cheating + +My first question is simply, is this possible? There's a lot of trivial cases that make it obvious that there's cheating going on. But there are some edge cases that might give us more difficulty. First though, let's get a picture of what the fair distribution looks like. In principle, we can only detect cheating if the distribution of the fair die differs from the distribution of the loaded die. + + +```python +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +%matplotlib inline + +fair_1 = np.random.randint(1, 7, 10000) +fair_2 = np.random.randint(1, 7, 10000) + +pd.Series(fair_1 + fair_2).plot(kind='hist', bins=11); +plt.title('Fair Distribution'); +``` + +![png](_notebook_files/_notebook_1_0.png) + +This distribution makes sense: there are many ways to make a 7 (the most frequent observed value) and very few ways to make a 12 or 2; an important symmetry. As a special note, you can notice that the sum of two fair dice is a discrete case of the [Triangle Distribution][1], which is itself a special case of the [Irwin-Hall Distribution][2]. + +## The Edge Cases + +Given that we understand how the results of two fair dice are distributed, let's see some of the interesting edge cases that come up. This will give us assurance that when a casino is cheating, it is detectable (given sufficient data). To make this as hard as possible, we will think of scenarios where the expected value of the sum of loaded dice is the same as the expected value of the sum of fair dice. + +### Edge Case 1 +What happens when one die is biased low, and one die is biased high? That is, where: + +$$ +\begin{align*} +\begin{array}{cc} +D_1 = \left\{ +\begin{array}{lr} +1 & w.p. 1/3\\ +2 & w.p. 1/3\\ +3 & w.p. 1/12\\ +4 & w.p. 1/12\\ +5 & w.p. 1/12\\ +6 & w.p. 1/12 +\end{array} +\right. & +D_2 = \left\{ +\begin{array}{lr} +1 & w.p. 1/12\\ +2 & w.p. 1/12\\ +3 & w.p. 1/12\\ +4 & w.p. 1/12\\ +5 & w.p. 1/3\\ +6 & w.p. 1/3 +\end{array} +\right. \\ +\mathbb{E}[D_1] = 2.5 & \mathbb{E}[D_2] = 4.5 +\end{array}\\ +\mathbb{E}[D_1 + D_2] = 7 = \mathbb{E}[D_{fair} + D_{fair}] +\end{align*} +$$ + +[1]: https://en.wikipedia.org/wiki/Triangular_distribution +[2]: https://en.wikipedia.org/wiki/Irwin%E2%80%93Hall_distribution + + +```python +def unfair_die(p_vals, n): + x = np.random.multinomial(1, p_vals, n) + return x.nonzero()[1] + 1 + +d1 = [1/3, 1/3, 1/12, 1/12, 1/12, 1/12] +d2 = [1/12, 1/12, 1/12, 1/12, 1/3, 1/3] + +x1 = unfair_die(d1, 10000) +x2 = unfair_die(d2, 10000) + +pd.Series(x1 + x2).plot(kind='hist', bins=11); +plt.title('$D_1$ biased low, $D_2$ biased high'); +``` + +![png](_notebook_files/_notebook_3_0.png) + +We can see that while the 7 value remains the most likely (as expected), the distribution is not so nicely shaped any more. + +### Edge Case 2 + +When one die is loaded low, and one is loaded high, we've seen how we can detect them. How about when two die are loaded both low and high? That is, we have the following distribution: + +$$ +\begin{align*} +\begin{array}{cc} +D_1 = \left\{ +\begin{array}{lr} +1 & w.p. 1/3\\ +2 & w.p. 1/12\\ +3 & w.p. 1/12\\ +4 & w.p. 1/12\\ +5 & w.p. 1/12\\ +6 & w.p. 1/3 +\end{array} +\right. & +D_2 = \left\{ +\begin{array}{lr} +1 & w.p. 1/3\\ +2 & w.p. 1/12\\ +3 & w.p. 1/12\\ +4 & w.p. 1/12\\ +5 & w.p. 1/12\\ +6 & w.p. 1/3 +\end{array} +\right. \\ +\mathbb{E}[D_1] = 3.5 & \mathbb{E}[D_2] = 3.5 +\end{array}\\ +\mathbb{E}[D_1 + D_2] = 7 = \mathbb{E}[D_{fair} + D_{fair}] +\end{align*} +$$ + +We can see even that the expected value of each individual die is the same as the fair die! However, the distribution (if we are doing this correctly) should still be skewed: + +```python +d1 = [1/3, 1/12, 1/12, 1/12, 1/12, 1/3] +d2 = d1 + +x1 = unfair_die(d1, 10000) +x2 = unfair_die(d2, 10000) + +pd.Series(x1 + x2).plot(kind='hist', bins=11) +plt.title("$D_1$ and $D_2$ biased to 1 and 6"); +``` + +![png](_notebook_files/_notebook_5_0.png) + +In a very un-subtle way, we have of course made the values 2 and 12 far more likely. + +## Detection Conclusion + +There are some trivial examples of cheating that are easy to detect: whenever the expected value of the sum of two fair dice deviates from the expected value for the sum of two fair dice, we can immediately conclude that there is cheating at stake. + +The interesting edge cases occur when the expected value of the sum of loaded dice matches the expected value of the sum of fair dice. Considering the above examples (and a couple more I ran through in developing this), we have seen that in every circumstance having two unfair dice leads to a distribution of results different from the fair results. + +We can thus finally state: **just by looking at the distribution of results from this game, we can immediately conclude whether there is cheating.** + +## Simulated Annealing + +What we really would like to do though, is see if there is any way to determine how exactly the dice are loaded. This is significantly more complicated, but we can borrow some algorithms from Machine Learning to figure out exactly how to perform this process. I'm using the Simulated Annealing algorithm, and I discuss why this works and why I chose it over some of the alternatives in the [justification](#Justification-of-Simulated-Annealing). If you don't care about how I set up the model and just want to see the code, check out [the actual code](#The-actual-code). + +[Simulated Annealing][3] is a variation of the [Metropolis-Hastings Algorithm][4], but the important thing for us is: Simulated Annealing allows us to quickly optimize high-dimensional problems. But what exactly are we trying to optimize? Ideally, we want a function that can tell us whether one distribution for the dice better explains the results than another distribution. This is known as the **likelihood** function. + +### Deriving the Likelihood function + +To derive our likelihood function, we want to know: **what is the probability of seeing a specific result given those hidden parameters?** This is actually a surprisingly difficult problem. While we can do a lot of calculations by hand, we need a more general solution since we will be working with very some interesting die distributions. + +We first note that the sum of two dice can take on 11 different values - 2 through 12. This implies that each individual sum follows a [Categorical distribution](https://en.wikipedia.org/wiki/Categorical_distribution). That is: + +$$ +\begin{align*} +\mathcal{L(x)} = \left\{ +\begin{array}{lr} +p_2 & x = 2\\ +p_3 & x = 3\\ +\ldots & \\ +p_{11} & x = 11\\ +p_{12} & x = 12 +\end{array} +\right. +\end{align*} +$$ + +Where each $p_i$ is the probability of seeing that specific result. However, we need to calculate what each probability is! I'll save you the details, but [this author](http://math.stackexchange.com/a/1646360/320784) explains how to do it. + +Now, we would like to know the likelihood of our entire data-set. This is trivial: + +$$ +\begin{align*} +\mathcal{L(\mathbf{X})} &= \prod_{i=1}^n L(x) +\end{align*} +$$ + +However, it's typically much easier to work with the $\log(\mathcal{L})$ function instead. This is critically important from a computational perspective: when you multiply so many small numbers together (i.e. the product of $L(x)$ terms) the computer suffers from rounding error; if we don't control for this, we will find that no matter the distributions we choose for each die, the "likelihood" will be close to zero because the computer is not precise enough. + +$$ +\begin{align*} +\log(\mathcal{L}) &= \sum_{i=1}^n \log(L) +\end{align*} +$$ + +### The process of Simulated Annealing + +The means by which we optimize our likelihood function is the simulated annealing algorithm. The way it works is as follows: + +1. Start with a random guess for the parameters we are trying to optimize. In our case we are trying to guess the distribution of two dice, and so we "optimize" until we have a distribution that matches the data. + +2. For each iteration of the algorithm: + + 1. Generate a new "proposed" set of parameters based on the current parameters - + i.e. slightly modify the current parameters to get a new set of parameters. + 2. Calculate the value of $\log(\mathcal{L})$ for each set of parameters. If the function value for the + proposed parameter set is higher than for the current, automatically switch to the new parameter set + and continue the next iteration. + 3. Given the new parameter set performs worse, determine a probability of switching to the new parameter set anyways: $\mathcal{P}(p_{current}, p_{proposed})$ + 4. Switch to the new parameter set with probability $\mathcal{P}$. If you fail to switch, begin the next iteration. + +3. The algorithm is complete after we fail to make a transition $n$ times in a row. + +If everything goes according to plan, we will have a value that is close to the true distribution of each die. + +## The actual code + +We start by defining the score function. This will tell us how well the proposed die densities actually explain the results. + +[3]:https://en.wikipedia.org/wiki/Simulated_annealing +[4]:https://en.wikipedia.org/wiki/Metropolis%E2%80%93Hastings_algorithm + + +```python +import numpy as np +from numpy import polynomial + +def density_coef(d1_density, d2_density): + # Calculating the probabilities of each outcome was taken + # from this author: http://math.stackexchange.com/a/1710392/320784 + d1_p = polynomial.Polynomial(d1_density) + d2_p = polynomial.Polynomial(d2_density) + coefs = (d1_p * d2_p).coef + return coefs + +def score(x, d1_density, d2_density): + # We've now got the probabilities of each event, but we need + # to shift the array a bit so we can use the x values to actually + # index into it. This will allow us to do all the calculations + # incredibly quickly + coefs = density_coef(d1_density, d2_density) + coefs = np.hstack((0, 0, coefs)) + return np.log(coefs[x]).sum() +``` + +Afterward, we need to write something to permute the proposal densities. We make random modifications, and eventually the best one survives. + + +```python +def permute(d1_density, d2_density): + # To ensure we have legitimate densities, we will randomly + # increase one die face probability by `change`, + # and decrease one by `change`. + # This means there are something less than (1/`change`)^12 possibilities + # we are trying to search over. + change = .01 + + d1_index1, d1_index2 = np.random.randint(0, 6, 2) + d2_index1, d2_index2 = np.random.randint(0, 6, 2) + + # Also make sure to copy. I've had some weird aliasing issues + # in the past that made everything blow up. + new_d1 = np.float64(np.copy(d1_density)) + new_d2 = np.float64(np.copy(d2_density)) + + # While this doesn't account for the possibility that some + # values go negative, in practice this never happens + new_d1[d1_index1] += change + new_d1[d1_index2] -= change + new_d2[d2_index1] += change + new_d2[d2_index2] -= change + + return new_d1, new_d2 +``` + +Now we've got the main algorithm code to do. This is what brings all the pieces together. + + +```python +def optimize(data, conv_count=10, max_iter=1e4): + switch_failures = 0 + iter_count = 0 + + # Start with guessing fair dice + cur_d1 = np.repeat(1/6, 6) + cur_d2 = np.repeat(1/6, 6) + cur_score = score(data, cur_d1, cur_d2) + + # Keep track of our best guesses - may not be + # what we end with + max_score = cur_score + max_d1 = cur_d1 + max_d2 = cur_d2 + + # Optimization stops when we have failed to switch `conv_count` + # times (presumably because we have a great guess), or we reach + # the maximum number of iterations. + while switch_failures < conv_count and iter_count < max_iter: + iter_count += 1 + if iter_count % (max_iter / 10) == 0: + print('Iteration: {}; Current score (higher is better): {}'.format( + iter_count, cur_score)) + + new_d1, new_d2 = permute(cur_d1, cur_d2) + new_score = score(data, new_d1, new_d2) + + if new_score > max_score: + max_score = new_score + max_d1 = new_d1 + max_d2 = new_d2 + + if new_score > cur_score: + # If the new permutation beats the old one, + # automatically select it. + cur_score = new_score + cur_d1 = new_d1 + cur_d2 = new_d2 + switch_failures = 0 + else: + # We didn't beat the current score, but allow + # for possibly switching anyways. + accept_prob = np.exp(new_score - cur_score) + coin_toss = np.random.rand() + if coin_toss < accept_prob: + # We randomly switch to the new distribution + cur_score = new_score + cur_d1 = new_d1 + cur_d2 = new_d2 + switch_failures = 0 + else: + switch_failures += 1 + + # Return both our best guess, and the ending guess + return max_d1, max_d2, cur_d1, cur_d2 +``` + +And now we have finished the hard work! + +## Catching the Casino + +Let's go through a couple of scenarios and see if we can catch the casino cheating with some loaded dice. **In every scenario we start with an assumption of fair dice**, and then try our hand to figure out what the *actual* distribution was. + +### Attempt 1 + + +The casino is using two dice that are both biased low. How well can we recover the distribution? + + +```python +import time +def simulate_casino(d1_dist, d2_dist, n=10000): + d1_vals = unfair_die(d1_dist, n) + d2_vals = unfair_die(d2_dist, n) + + start = time.perf_counter() + max_d1, max_d2, final_d1, final_d2 = optimize(d1_vals + d2_vals) + end = time.perf_counter() + print("Simulated Annealing time: {:.02f}s".format(end - start)) + + coef_range = np.arange(2, 13) - .5 + plt.subplot(221) + plt.bar(coef_range, density_coef(d1_dist, d2_dist), width=1) + plt.title('True Distribution') + + plt.subplot(222) + plt.hist(d1_vals + d2_vals, bins=11) + plt.title('Empirical Distribution') + + plt.subplot(223) + plt.bar(coef_range, density_coef(max_d1, max_d2), width=1) + plt.title('Recovered Distribution') + + plt.gcf().set_size_inches(10, 10) + + +simulate_casino([2/9, 2/9, 2/9, 1/9, 1/9, 1/9], + [2/9, 2/9, 2/9, 1/9, 1/9, 1/9]) +``` + +``` + Iteration: 1000; Current score (higher is better): -22147.004400281654 + Simulated Annealing time: 0.30s +``` + +![png](_notebook_files/_notebook_14_1.png) + +### Attempt 2 + +The casino now uses dice that are both biased towards 1 and 6. + +```python +simulate_casino([1/3, 1/12, 1/12, 1/12, 1/12, 1/3], + [1/3, 1/12, 1/12, 1/12, 1/12, 1/3]) +``` + +``` + Simulated Annealing time: 0.08s +``` + +![png](_notebook_files/_notebook_16_1.png) + +### Attempt 3 + +The casino will now use one die biased towards 1 and 6, and one die towards 3 and 4. + + +```python +simulate_casino([1/3, 1/12, 1/12, 1/12, 1/12, 1/3], + [1/12, 1/12, 1/3, 1/3, 1/12, 1/12]) +``` + +``` + Simulated Annealing time: 0.09s +``` + +![png](_notebook_files/_notebook_18_1.png) + +### Attempt 4 + +We'll now finally go to a fair casino to make sure that we can still recognize a positive result. + +```python +simulate_casino(np.repeat(1/6, 6), np.repeat(1/6, 6)) +``` + +``` + Simulated Annealing time: 0.02s +``` + +![png](_notebook_files/_notebook_20_1.png) + +### Attempt 5 + +We've so far been working with a large amount of data - 10,000 data points. Can we now scale things back to only 250 throws? We'll start with two dice biased high. + + +```python +simulate_casino([1/9, 1/9, 1/9, 2/9, 2/9, 2/9], + [1/9, 1/9, 1/9, 2/9, 2/9, 2/9], + n=250) +``` + +``` + Iteration: 1000; Current score (higher is better): -551.6995384525453 + Iteration: 2000; Current score (higher is better): -547.7803673440676 + Iteration: 3000; Current score (higher is better): -547.9805613193807 + Iteration: 4000; Current score (higher is better): -546.7574874775273 + Iteration: 5000; Current score (higher is better): -549.5798007672656 + Iteration: 6000; Current score (higher is better): -545.0354060154496 + Iteration: 7000; Current score (higher is better): -550.1134504086606 + Iteration: 8000; Current score (higher is better): -549.9306537114975 + Iteration: 9000; Current score (higher is better): -550.7075182119111 + Iteration: 10000; Current score (higher is better): -549.400679551826 + Simulated Annealing time: 1.94s +``` + +![png](_notebook_files/_notebook_22_1.png) + +The results are surprisingly good. While the actual optimization process took much longer to finish than in the other examples, we still have a very good guess. As a caveat though: the recovered distribution tends to overfit the data. That is, if the data doesn't fit the underlying distribution well, the model will also fail. + +## Conclusion + +Given the results above, we can see that we have indeed come up with a very good algorithm to determine the distribution of two dice given their results. As a benefit, we have even seen that results come back very quickly; it's not uncommon for the optimization to converge within a tenth of a second. + +Additionally, we have seen that the algorithm can intuit the distribution even when there is not much data. While the final example shows that we can 'overfit' on the dataset, we can still get valuable information from a relatively small dataset. + +We can declare at long last: **the mathematicians have again triumphed over the casino**. + +--- + +## Justification of Simulated Annealing + +### Why Simulated Annealing? + +So why even use an algorithm with a fancy title like Simulated Annealing? First of all, because the title is sexy. Second of all, because this is a reasonably complicated problem to try and solve. We have a parameter space where each value $p_{ij} \in (0, 1); i, j \in \{1, \ldots, 6\}$, for a total of 12 different variables we are trying to optimize over. Additionally, given a 12-dimensional function we are trying to optimize, simulated annealing makes sure that we don't fall into a local minimum. + +### Why not something else? + +This is a fair question. There are two classes of algorithms that can also be used to solve this problem: [Non-linear optimization](https://en.wikipedia.org/wiki/Nonlinear_programming) methods, and the [EM algorithm](https://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm). + +1. I chose not to use non-linear optimization simply because I'm a bit concerned that it will trap me in a local maximum. Instead of running multiple different optimizations from different starting points, I can just use simulated annealing to take that into account. In addition, throughout the course of testing the simulated annealing code converged *incredibly* quickly - far more quickly than any non-linear solver would be able to accomplish. + +2. The EM Algorithm was originally what I intended to write this blog post with. Indeed, the post was inspired by the [crooked casino](http://web.stanford.edu/class/stats366/hmmR2.html) example which uses the EM algorithm to solve it. However, after modeling the likelihood function I realized that the algebra would very quickly get out of hand. Trying to compute all the polynomial terms would not be fun, which would be needed to actually optimize for each parameter. So while the EM algorithm would likely be much faster in raw speed terms, the amount of time needed to program and verify it meant that I was far better off using a different method for optimization. \ No newline at end of file