From 0ba3723cd2a9c3914812f984469171b6c1d0a898 Mon Sep 17 00:00:00 2001 From: Bradlee Speice Date: Sun, 15 May 2016 09:52:27 -0400 Subject: [PATCH] Add new unfair casino post --- archives.html | 2 + author/bradlee-speice.html | 2 + author/bradlee-speice2.html | 143 ++ authors.html | 2 + categories.html | 2 + category/blog.html | 2 + category/blog2.html | 144 ++ feeds/all.atom.xml | 2798 +++++++++++++++++++++++++++++++- feeds/blog.atom.xml | 2798 +++++++++++++++++++++++++++++++- index.html | 9 +- index2.html | 129 ++ tag/casino.html | 123 ++ tag/em.html | 123 ++ tag/machine-learning.html | 2 + tag/probability.html | 123 ++ tag/simulated-annealing.html | 123 ++ tags.html | 10 +- the-unfair-casino.html | 2869 +++++++++++++++++++++++++++++++++ tweet-like-me.html | 12 +- welcome-and-an-algorithm.html | 38 +- 20 files changed, 9356 insertions(+), 98 deletions(-) create mode 100644 author/bradlee-speice2.html create mode 100644 category/blog2.html create mode 100644 index2.html create mode 100644 tag/casino.html create mode 100644 tag/em.html create mode 100644 tag/probability.html create mode 100644 tag/simulated-annealing.html create mode 100644 the-unfair-casino.html diff --git a/archives.html b/archives.html index 29db6e3..98dcbb6 100644 --- a/archives.html +++ b/archives.html @@ -82,6 +82,8 @@

+
Sun 15 May 2016
+
The Unfair Casino
Wed 06 April 2016
Tick Tock...
Mon 28 March 2016
diff --git a/author/bradlee-speice.html b/author/bradlee-speice.html index d90f0a6..2295db2 100644 --- a/author/bradlee-speice.html +++ b/author/bradlee-speice.html @@ -82,6 +82,8 @@

+
Sun 15 May 2016
+
The Unfair Casino
Wed 06 April 2016
Tick Tock...
Mon 28 March 2016
diff --git a/author/bradlee-speice2.html b/author/bradlee-speice2.html new file mode 100644 index 0000000..2295db2 --- /dev/null +++ b/author/bradlee-speice2.html @@ -0,0 +1,143 @@ + + + + + + + + + + + Bradlee Speice - Bradlee Speice + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+
+ + + +
+
+
+
+

Bradlee Speice

+
+

+
+
+
+
+ + +
+ + + + +
+
+

+
+
Sun 15 May 2016
+
The Unfair Casino
+
Wed 06 April 2016
+
Tick Tock...
+
Mon 28 March 2016
+
Tweet Like Me
+
Sat 05 March 2016
+
Predicting Santander Customer Happiness
+
Fri 26 February 2016
+
Profitability using the Investment Formula
+
Wed 03 February 2016
+
Guaranteed Money Maker
+
Sat 23 January 2016
+
Cloudy in Seattle
+
Fri 01 January 2016
+
Complaining about the Weather
+
Sat 26 December 2015
+
Testing Cramer
+
Fri 27 November 2015
+
Autocallable Bonds
+
Thu 19 November 2015
+
Welcome, and an algorithm
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/authors.html b/authors.html index 454fe92..9b1aa87 100644 --- a/authors.html +++ b/authors.html @@ -82,6 +82,8 @@

Bradlee Speice

+
Sun 15 May 2016
+
The Unfair Casino
Wed 06 April 2016
Tick Tock...
Mon 28 March 2016
diff --git a/categories.html b/categories.html index 9afb7e8..2e0e432 100644 --- a/categories.html +++ b/categories.html @@ -82,6 +82,8 @@

Blog

+
Sun 15 May 2016
+
The Unfair Casino
Wed 06 April 2016
Tick Tock...
Mon 28 March 2016
diff --git a/category/blog.html b/category/blog.html index 51e5d2a..0365414 100644 --- a/category/blog.html +++ b/category/blog.html @@ -83,6 +83,8 @@

Blog

+
Sun 15 May 2016
+
The Unfair Casino
Wed 06 April 2016
Tick Tock...
Mon 28 March 2016
diff --git a/category/blog2.html b/category/blog2.html new file mode 100644 index 0000000..0365414 --- /dev/null +++ b/category/blog2.html @@ -0,0 +1,144 @@ + + + + + + + + + + + Blog - Bradlee Speice + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+
+ + + +
+
+
+
+

: Blog

+
+

"Blog"

+
+
+
+
+ + +
+ + + + +
+
+

Blog

+
+
Sun 15 May 2016
+
The Unfair Casino
+
Wed 06 April 2016
+
Tick Tock...
+
Mon 28 March 2016
+
Tweet Like Me
+
Sat 05 March 2016
+
Predicting Santander Customer Happiness
+
Fri 26 February 2016
+
Profitability using the Investment Formula
+
Wed 03 February 2016
+
Guaranteed Money Maker
+
Sat 23 January 2016
+
Cloudy in Seattle
+
Fri 01 January 2016
+
Complaining about the Weather
+
Sat 26 December 2015
+
Testing Cramer
+
Fri 27 November 2015
+
Autocallable Bonds
+
Thu 19 November 2015
+
Welcome, and an algorithm
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/feeds/all.atom.xml b/feeds/all.atom.xml index 275e6be..f436db0 100644 --- a/feeds/all.atom.xml +++ b/feeds/all.atom.xml @@ -1,5 +1,2733 @@ -Bradlee Speicehttps://bspeice.github.io/2016-04-06T00:00:00-04:00Tick Tock...2016-04-06T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-04-06:tick-tock.html<p> +Bradlee Speicehttps://bspeice.github.io/2016-05-15T00:00:00-04:00The Unfair Casino2016-05-15T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-05-15:the-unfair-casino.html<p> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>Or, how to get thrown out of a casino because you're a mathematician.</p> +<hr> +<p>In the ongoing eternal cycle of mathematicians asking generally useless questions about probability, I dreamt up another one. The scenario is as follows:</p> +<p><strong>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?</strong></p> +<h1 id="Proving-we-can-detect-cheating">Proving we can detect cheating<a class="anchor-link" href="#Proving-we-can-detect-cheating">&#182;</a></h1><p>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.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[1]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> +<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> +<span class="o">%</span><span class="k">matplotlib</span> inline + +<span class="n">fair_1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> +<span class="n">fair_2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> + +<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">fair_1</span> <span class="o">+</span> <span class="n">fair_2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s1">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Fair Distribution&#39;</span><span class="p">);</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAEKCAYAAAA8QgPpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz +AAALEgAACxIB0t1+/AAAHVRJREFUeJzt3X20XXV95/H3hyBPEhB1yK2JkCANBgtq1PiA1KMoD1pD +OrOKWFtEGGeVYKE6y1WCayZ3OmsUnDI+tIOjgjGwQBrwgTDFACkcK1MwKNCgQUyrCUkglyIUH7CQ +Sz7zx943HC65ybk795x97zmf11pnZe/f2Wd/v+esm/M9v99vP8g2ERER47VX3QlERMTUlAISERGV +pIBEREQlKSAREVFJCkhERFSSAhIREZWkgERfkPRlSRdM8D7nSPrFBO5vR46STpD0swnc99sk3TdR ++4sAUM4DialE0gbgUGAYEGBgru2tExznbOCLwJNl078ATeBTtv+pwr7+yPbbx/GaE4Av2z5iPLHK +104DtgGzbT843tdHtCs9kJhqDLzH9kG2p5f/7lHxKL9wd+bvbR8EHAy8k+JL+fuSjhpvCIq8d5XD +RP5f3G28iImQAhJTkZ7XULhW0sOSHpN0q6RXtjx/paT/Wi6fIOlnkpZIehj40q6CufAz238C3AEs +LffzCknbW2KcXe73F5L+SdJpkn4H+CvgeEm/lPRISz5/Lenbkn4JvLU1x5a39V8kPSrpnyW9r+WJ +70o6Y1Ts28rV75T/ritz+f3RQ2KSjpbUlPS4pH+U9O5Rn9XnJN1Yvv7/STp8V59R9KcUkOglNwCv +AAaAHwJX7mLbWcABwMuBxeOI8Q3g+JZ1A0iaDlwCnFD2Wo4D1tr+IfAR4Ltlj+nQlte+H1hqezpw +5xg5vhD4LeA/Al+RtKshrZFex+9SFNl5ZQ/tm6NyfQHwfyk+r5cCHwP+ZtS+3w98AjgE2AT8913E +jT6VAhJT0bfKXsZjkr4BO3oJV9h+0vbTwF8Ar5O0/xj72AYM2h62/dQ4Yj8EvHiM57YDx0ja1/aQ +7R/vZl/ftL2mzP/pnTz/TJnjNtu3AauAPxhHrs/rqZXeCrzA9iW2n7H9d8C3gdNbtrnO9j22nwGu +Al4zjrjRJ1JAYio61faLy8e/h2IOQdKny6GefwXWU/zifukY+xgqvxzHaybw2OhG27+k+NX+EWCr +pJWSfns3+9q0m+d/bvvfWtY3Ai8bT7Jj+C1g9OT6Ror3NqJ1XulJ4MAJiBs9JgUkpqKd/bI+AzgZ +aNh+EXBkud1Yv8KrTjIvAr670x3aN9l+F8UQ2j8D/2c3sXaXw0sk7duyfhhFDwjg1xRDcCMGxrHf +hyiG7lodBmzZzesiniMFJHrFdOAp4HFJLwQ+yZ4fiSTY0buZI+lSirmNv9jJNgOSfq8cMhum+IIf +mWAfAmZJ2nuc8acBg5JeIKlBUSCvLZ+7F/gPkvaTNBc4a+RFtrcDjwJjzZf8AzAs6WOS9pb0DuAU +4Jpx5hd9LgUkppqxisIy4GGKX9f3Abe3+bpdeWt5ouATwN8B+wGvHzW3MbLfacDHy/j/ArwZOLd8 +7haKIbUhSQ8xttE5bqIoRA9TvL+zbf+0fO4vy3+HgMt4/gEDS4GvlfNEi54TpJhveS9Fb+pR4LPA ++1v2nUOAoy0dPZFQ0uXA71GMNx9btr2aomu/H8VE5mLb3y+fW0LxS2oYON/2zWX7fOCr5WtutP1n +HUs6IiLa0ukeyDLgpFFtn6Y4dPG1FL+S/icUx6UDpwHzKLrTl0oaGb/+AsWvr7nAXEmj9xkREV3W +0QJi+3bg8VHN2ynO7AV4Ec9O3C0ErikPq9xA0eVfIGkAmG77rnK7Kyi63hERUaPxTupNhI8CN0m6 +hGIC8i1l+0yKs3xHbCnbhoHNLe2bee7hhhERUYM6JtHPoZjfOIyimHylhhwiImIP1dED+aDt8wFs +XyfpsrJ9C889Nn1W2TZW+05JyhEkEREV2B7rvKmd6kYPZPTJXFskvQ12XLJ6fdm+Ejhd0j6S5lCc +CLamvNLqE5IWlJPqZwDX7yqg7Txsli5dWnsOk+WRzyKfRT6LXT+q6GgPRNLVQIPijNoHKY66+jDw ++fIS2v8G/CcA2+skrQDW8ezhvSPv6lyeexjvqk7mHRERu9fRAmL7D8d46vVjbP8p4FM7af8BcMwE +phYREXsoZ6L3sEajUXcKk0Y+i2fls3hWPos903O3tJXkXntPERGdJglPwkn0iIjoQSkgERFRSQpI +RERUkgISERGVpIBEjMPAwGwkdf0xMDC77rce8Tw5CitiHIqLIdTx96XKZwtHtCNHYUVERNekgERE +RCUpIBERUUkKSEREVJICEhERlaSAREREJSkgERFRSQpIRERU0tECIulySUOS1o5q/1NJ90u6T9JF +Le1LJK0vnzuxpX2+pLWSfiLps53MOSIi2tPpHsgy4KTWBkkN4L3AMbaPAf6ybJ8HnAbMA04BLi3v +gQ7wBeBs23OBuZKes8+IiOi+jhYQ27cDj49qPge4yPZwuc2jZfupwDW2h21vANYDCyQNANNt31Vu +dwWwqJN5R0TE7tUxBzIX+F1Jd0q6TdLryvaZwKaW7baUbTOBzS3tm8u2iIio0d41xTzE9pskvQG4 +FjhiIgMMDg7uWG40GrnvcUTEKM1mk2azuUf76PjVeCUdDtxg+9hy/UbgYtvfKdfXA28CPgxg+6Ky +fRWwFNgI3GZ7Xtl+OvA22+eMES9X442OydV4o1dN1qvxqnyM+BbwDgBJc4F9bP8cWAm8T9I+kuYA +RwJrbG8FnpC0oJxUPwO4vgt5R0TELnR0CEvS1UADeImkByl6FF8Blkm6D3iKoiBge52kFcA6YBuw +uKUrcS7wVWA/4EbbqzqZd0RE7F5uKBUxDhnCil41WYewIiKiB6WAREREJSkgERFRSQpIRERUkgIS +ERGVpIBEREQlKSAREVFJCkhERFSSAhIREZWkgERERCUpIBERUUkKSEREVJICEhERlaSAREREJSkg +ERFRSQpIRERU0tECIulySUOS1u7kuf8sabukF7e0LZG0XtL9kk5saZ8vaa2kn0j6bCdzjoiI9nS6 +B7IMOGl0o6RZwLuAjS1t84DTgHnAKcCl5T3QAb4AnG17LjBX0vP2GRER3dXRAmL7duDxnTz1GeDj +o9pOBa6xPWx7A7AeWCBpAJhu+65yuyuARR1KOSIi2tT1ORBJC4FNtu8b9dRMYFPL+paybSawuaV9 +c9kWERE12rubwSTtD1xIMXzVMYODgzuWG40GjUajk+EiIqacZrNJs9nco33I9sRkM1YA6XDgBtvH +SvodYDXwJCBgFkVPYwFwFoDti8rXrQKWUsyT3GZ7Xtl+OvA22+eMEc+dfk/Rv4ppuTr+vkT+rqOT +JGFbu9/yWd0YwlL5wPYPbQ/YPsL2HIrhqNfafgRYCbxP0j6S5gBHAmtsbwWekLSgnFQ/A7i+C3lH +TCL7IqmWx8DA7LrffExSHR3CknQ10ABeIulBYKntZS2bmGeLyzpJK4B1wDZgcUtX4lzgq8B+wI22 +V3Uy74jJ5ynq6fnA0NC4fpRGH+n4EFa3ZQgrOqnOIay6CkiGz/pDlSGsrk6iR0yEgYHZDA1t3P2G +EdFR6YHElFNfLwDq6wmkBxKdNVkn0SMiogelgERERCUpIBERUUkKSEREVJICEhERlaSAREREJSkg +ERFRSQpIRERUkgISERGVpIBEREQlKSAREVFJCkhERFSSAhIREZWkgERERCUdLSCSLpc0JGltS9un +Jd0v6V5JX5d0UMtzSyStL58/saV9vqS1kn4i6bOdzDkiItrT6R7IMuCkUW03A6+y/RpgPbAEQNLR +wGnAPOAU4NLyHugAXwDOtj0XmCtp9D4jIqLLOlpAbN8OPD6qbbXt7eXqncCscnkhcI3tYdsbKIrL +AkkDwHTbd5XbXQEs6mTeERGxe3XPgZwF3FguzwQ2tTy3pWybCWxuad9ctkVERI1quye6pE8A22x/ +baL3PTg4uGO50WjQaDQmOkRExJTWbDZpNpt7tI+O3xNd0uHADbaPbWk7E/gw8A7bT5VtFwC2fXG5 +vgpYCmwEbrM9r2w/HXib7XPGiJd7ove43BO9+7Hzf6r3TdZ7oqt8FCvSycDHgYUjxaO0Ejhd0j6S +5gBHAmtsbwWekLSgnFQ/A7i+C3lHRMQudHQIS9LVQAN4iaQHKXoUFwL7ALeUB1ndaXux7XWSVgDr +gG3A4pauxLnAV4H9gBttr+pk3hERsXsdH8Lqtgxh9b4MYXU/dv5P9b7JOoQVERE9KAUkIiIqSQGJ +iIhKajsPJKa+gYHZDA1trDuNiKhJJtGjsvomszOJ3u3Y+T/V+zKJHhERXZMCEhERlaSAREREJW0V +EEnHdDqRiIiYWtrtgVwqaY2kxZIO7mhGERExJbRVQGwfD3wAeDnwA0lXS3pXRzOLiIhJbVyH8Uqa +RnE3wM8Dv6A4tvBC29/oTHrjl8N4uyeH8fZDXCiuYfrUbreaaDNmHM7WrRu6HrdfVTmMt60CIulY +4EPAe4BbgMtt3y3pZcAdtg+vknAnpIB0TwpIP8StM3bOP+mmThaQ7wCXAdfZ/s2o5/7Y9pXjyrSD +UkC6JwWkH+LWGTsFpJs6WUAOBH5j+5lyfS9gP9tPVsq0g1JAuicFpB/i1hk7BaSbOnkm+mpg/5b1 +A8q23SV0uaQhSWtb2g6RdLOkByTd1HpUl6QlktZLul/SiS3t8yWtlfQTSZ9tM+eIiOigdgvIfrZ/ +NbJSLh/QxuuWASeNarsAWG37KOBWYAmApKOB04B5wCkUhw6PVMMvAGfbngvMlTR6nxER0WXtFpBf +S5o/siLpdcBvdrE9ALZvBx4f1XwqsLxcXk5xVBfAQuAa28O2NwDrgQWSBoDptu8qt7ui5TUREVGT +di/n/mfAtZIeohgQHQDeVzHmobaHAGxvlXRo2T4TuKNluy1l2zCwuaV9c9keERE1aquA2L5L0iuB +o8qmB2xvm6AcMksWETEFjeeGUm8AZpevmV/O2F9RIeaQpBm2h8rhqUfK9i0UZ7qPmFW2jdU+psHB +wR3LjUaDRqNRIc2IiN7VbDZpNpt7tI92D+O9EngFcC/wTNls2+e18drZwA22jynXLwYes32xpD8H +DrF9QTmJfhXwRoohqluA37ZtSXcC5wF3AX8LfN72qjHi5TDeLslhvP0Qt87YOYy3m6ocxttuD+T1 +wNHj/WaWdDXQAF4i6UFgKXARxXzKWcBGiiOvsL1O0gpgHbANWNwS71zgqxTXVLhxrOIRERHd024P +5FrgPNsPdz6lPZMeSPekB9IPceuMnR5IN3WyB/JSYJ2kNbRcVc32wvEEi4iI3tFuARnsZBIRETH1 +tH05d0mHU0xqr5Z0ADDN9i87ml0FGcLqngxh9UPcOmNnCKubOnYtLEkfBq4Dvlg2zQS+Nb70IiKi +l7R7KZNzgeMobiKF7fXAobt8RURE9LR2C8hTtp8eWZG0NzmDPCKir7VbQL4j6UJg//Je6NcCN3Qu +rYiImOzaPQ9kL+Bs4ESKGbWbgMsm42x1JtG7J5Po/RC3ztiZRO+mjt2RcCpJAemeFJB+iFtn7BSQ +burYiYSSfsZO/oJsHzGeYBER0TvGcy2sEfsBfwC8eOLTiYiIqaLyEJakH9h+3QTns8cyhNU9GcLq +h7h1xs4QVjd1cghrfsvqXhQ9kvHcSyQiInpMu0XgkpblYWAD5WXYIyKiP+UorKgsQ1j9ELfO2BnC +6qZODmF9bFfP2/5f4wkaERFTX7tnor8eOIfiIoozgT8B5gPTy8e4SfqopB9KWivpKkn7SDpE0s2S +HpB0k6SDW7ZfImm9pPslnVglZkRETJx2z0T/e+A9I5dvlzQd+Fvbv1spqPQy4HbglbaflvQ3wI3A +0cDPbX96jPulvwGYBaymvF/6TvadIawuyRBWP8StM3aGsLqpY5dzB2YAT7esP1227YlpwAvLCzPu +D2wBTgWWl88vBxaVywuBa2wP294ArAcW7GH8iJjU9kVSLY+Bgdl1v/kpod2jsK4A1kj6Zrm+iGe/ +6MfN9kOSLgEeBJ4Ebi5vVDXD9lC5zVZJI5eMnwnc0bKLLWVbRPSsp6ir1zU0NK4f4n2rrQJi+39I ++jZwfNn0Idv3VA0q6UUUvY3DgSeAayV9gOf/taT/2oaBgdkMDW2sO42I6DPjORnwAOAXtpdJ+neS +5tj+WcW47wR+avsxgLJn8xZgaKQXImkAeKTcfgvw8pbXzyrbdmpwcHDHcqPRoNFoVExzaiiKR13j +8hExFTWbTZrN5h7to91J9KUUR2IdZXtuOQl+re3jKgWVFgCXU0yKPwUsA+4CDgMes33xGJPob6QY +urqFTKLv0H+T2f05oZz33N3Y/fg90pHzQIDfB14L3A075jAqHb5bvn6NpOuAe4Bt5b9fojgkeIWk +s4CNlGe7214naQWwrtx+cd9ViYiISabdHsga2wsk3W17vqQXAnfYPrbzKY5PeiBdjdxnceuMnffc +7dj9+D3SqcN4V0j6IvAiSR+mOA/jy+NNMCIiekfb18Iq74W+45a2tm/pZGJVpQfS1ch9FrfO2HnP +3Y7dj98jE35LW0nTgNW2374nyXVLCkhXI/dZ3Dpj5z13O3Y/fo9M+BCW7WeA7a3XpYqIiGj3KKxf +AfdJugX49Uij7fM6klVEREx67RaQb5SPiIgIYDdzIJIOs/1gF/PZY5kD6WrkPotbZ+y8527H7sfv +kYmeA/lWy86/XimriIjoSbsrIK3V6IhOJhIREVPL7gqIx1iOiIg+t7s5kGcojroSxU2fnhx5CrDt +gzqe4ThlDqSrkfssbp2x8567Hbsfv0cm9GKKtqftWUoREdGr2r0WVkRExHOkgERERCUpIBERUUkK +SEREVFJbAZF0sKRrJd0v6UeS3ijpEEk3S3pA0k2tF3CUtETS+nL7E+vKOyIiCnX2QD4H3Gh7HvBq +4MfABRSXjj8KuBVYAlDeE/00YB5wCnCpimNXIyKiJrUUEEkHAcfbXgZge9j2E8CpwPJys+XAonJ5 +IXBNud0GYD2woLtZR0REq7p6IHOARyUtk3S3pC9JOgCYYXsIwPZW4NBy+5nAppbXbynbIiKiJu1e +zr0TcecD59r+vqTPUAxfjT71s9KpoIODgzuWG40GjUajWpYRET2q2WzSbDb3aB9t3xN9IkmaAdxh ++4hy/a0UBeQVQMP2kKQB4Dbb8yRdQHHplIvL7VcBS21/byf7zqVMuhe5z+LWGTvvudux+/F7ZMJv +adsJ5TDVJklzy6YTgB8BK4Ezy7YPAteXyyuB0yXtI2kOcCSwpnsZR0TEaHUNYQGcB1wl6QXAT4EP +AdOAFZLOAjZSHHmF7XWSVgDrgG3A4r7rZkRETDK1DGF1Uoawuhq5z+LWGTvvudux+/F7ZEKvxhvt +GxiYzdDQxrrTiIjomvRAJi4u+YXY63HrjJ333O3YvfbduDvpgURETIh9qeNiFzNmHM7WrRu6Hreq +9EAmLi75hdjrceuMnffcH7Hr6/lMmcN4IyJi6ksBiYiISlJAIiKikhSQiIioJAUkIiIqSQGJiIhK +UkAiIqKSFJCIiKgkBSQiIipJAYmIiEpSQCIiopIUkIiIqKTWAiJpL0l3S1pZrh8i6WZJD0i6SdLB +LdsukbRe0v2STqwv64iIgPp7IOdT3KZ2xAXAattHAbcCSwAkHU1xe9t5wCnAparjWssREbFDbQVE +0izg3cBlLc2nAsvL5eXAonJ5IXCN7WHbG4D1wIIupRoRETtRZw/kM8DHee5F92fYHgKwvRU4tGyf +CWxq2W5L2RYRETWp5Y6Ekt4DDNm+V1JjF5tWurPK4ODgjuVGo0GjsasQERH9p9ls0mw292gftdyR +UNIngT8ChoH9genAN4HXAw3bQ5IGgNtsz5N0AWDbF5evXwUstf29new7dyRM3B6MnffcH7FzR8Ld +sn2h7cNsHwGcDtxq+4+BG4Azy80+CFxfLq8ETpe0j6Q5wJHAmi6nHRERLWoZwtqFi4AVks4CNlIc +eYXtdZJWUByxtQ1YXEs3IyIidqhlCKuTMoSVuL0ZO++5P2JnCCsiIvpACkhERFSSAhIREZWkgERE +RCUpIBERUUkKSEREVJICEhERlaSAREREJZPtTPQJ8eSTT9adQkREBfsylW511JNnou+99/5djbl9 ++zDbt2+jH8+a7a+4dcbOe+6P2PW+5/Geid6TPZDh4W73QK4EzuhyzIiIemUOJCIiKkkBiYiISlJA +IiKikhSQiIioJAUkIiIqqaWASJol6VZJP5J0n6TzyvZDJN0s6QFJN0k6uOU1SyStl3S/pBPryDsi +Ip5VVw9kGPiY7VcBbwbOlfRK4AJgte2jgFuBJQCSjqa4ve084BTgUk2ls20iInpQLQXE9lbb95bL +vwLuB2YBpwLLy82WA4vK5YXANbaHbW8A1gMLupp0REQ8R+1zIJJmA68B7gRm2B6CosgAh5abzQQ2 +tbxsS9kWERE1qfVMdEkHAtcB59v+laTR5/BXPKd/sGW5UT4iIuJZzfJRXW0FRNLeFMXjStvXl81D +kmbYHpI0ADxStm8BXt7y8lll2xgGJzzfiIje0uC5P67/27j3UOcQ1leAdbY/19K2EjizXP4gcH1L +++mS9pE0BzgSWNOtRCMi4vlq6YFIOg74AHCfpHsohqouBC4GVkg6C9hIceQVttdJWgGsA7YBi91r +lxGOiJhievJy7t2/HPLI1Xhz6enejltn7Lzn/og9tS7nXvtRWBERMTWlgERERCUpIBERUUkKSERE +VJICEhERlaSAREREJSkgERFRSQpIRERUkgISERGVpIBEREQlKSAREVFJCkhERFSSAhIREZWkgERE +RCUpIBERUcmUKiCSTpb0Y0k/kfTndecTEdHPpkwBkbQX8NfAScCrgPdLemW9WU12zboTmESadScw +iTTrTmASadadwJQ2ZQoIsABYb3uj7W3ANcCpNec0yTXrTmASadadwCTSrDuBSaRZdwJT2lQqIDOB +TS3rm8u2iIiowd51J9AJBx303q7G27ZtM7/5TVdDRkTUTnZdN3AfH0lvAgZtn1yuXwDY9sWjtpsa +bygiYpKxrfFsP5UKyDTgAeAE4GFgDfB+2/fXmlhERJ+aMkNYtp+R9BHgZoq5m8tTPCIi6jNleiAR +ETG5TKWjsMYkaZakWyX9SNJ9ks6rO6e6SdpL0t2SVtadS50kHSzpWkn3l38fb6w7p7pI+qikH0pa +K+kqSfvUnVO3SLpc0pCktS1th0i6WdIDkm6SdHCdOXbLGJ/Fp8v/I/dK+rqkg9rZV08UEGAY+Jjt +VwFvBs7NSYacD6yrO4lJ4HPAjbbnAa8G+nLYU9LLgD8F5ts+lmL4+vR6s+qqZRQnIbe6AFht+yjg +VmBJ17Oqx84+i5uBV9l+DbCeNj+Lniggtrfavrdc/hXFl0TfniMiaRbwbuCyunOpU/kr6njbywBs +D9v+Rc1p1Wka8EJJewMHAA/VnE/X2L4deHxU86nA8nJ5ObCoq0nVZGefhe3VtreXq3cCs9rZV08U +kFaSZgOvAb5Xbya1+gzwcaDfJ7jmAI9KWlYO531J0v51J1UH2w8BlwAPAluAf7W9ut6saneo7SEo +foQCh9acz2RxFvDtdjbsqQIi6UDgOuD8sifSdyS9Bxgqe2QqH/1qb2A+8L9tzweepBi26DuSXkTx +i/tw4GXAgZL+sN6sJp1+/8GFpE8A22xf3c72PVNAym75dcCVtq+vO58aHQcslPRT4GvA2yVdUXNO +ddkMbLL9/XL9OoqC0o/eCfzU9mO2nwG+Abyl5pzqNiRpBoCkAeCRmvOplaQzKYa+2/5h0TMFBPgK +sM725+pOpE62L7R9mO0jKCZJb7V9Rt151aEcntgkaW7ZdAL9e2DBg8CbJO0nSRSfRb8dUDC6R74S +OLNc/iDQTz88n/NZSDqZYth7oe2n2t1JTxQQSccBHwDeIemecrz75LrziknhPOAqSfdSHIX1yZrz +qYXtNRQ9sHuAf6T48vhSrUl1kaSrgX8A5kp6UNKHgIuAd0kaucLFRXXm2C1jfBZ/BRwI3FJ+f17a +1r5yImFERFTREz2QiIjovhSQiIioJAUkIiIqSQGJiIhKUkAiIqKSFJCIiKgkBSQiIipJAYmIiEr+ +P71BWn/o4C2PAAAAAElFTkSuQmCC +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>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 <a href="https://en.wikipedia.org/wiki/Triangular_distribution">Triangle Distribution</a>, which is itself a special case of the <a href="https://en.wikipedia.org/wiki/Irwin%E2%80%93Hall_distribution">Irwin-Hall Distribution</a>.</p> +<h1 id="The-Edge-Cases">The Edge Cases<a class="anchor-link" href="#The-Edge-Cases">&#182;</a></h1><p>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.</p> +<h3 id="Edge-Case-1">Edge Case 1<a class="anchor-link" href="#Edge-Case-1">&#182;</a></h3><p>What happens when one die is biased low, and one die is biased high? That is, where:</p> +\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} +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[2]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">unfair_die</span><span class="p">(</span><span class="n">p_vals</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> + <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">multinomial</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">p_vals</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> + <span class="k">return</span> <span class="n">x</span><span class="o">.</span><span class="n">nonzero</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span> + +<span class="n">d1</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">]</span> +<span class="n">d2</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">]</span> + +<span class="n">x1</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d1</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> +<span class="n">x2</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d2</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> + +<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">x1</span> <span class="o">+</span> <span class="n">x2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s1">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;$D_1$ biased low, $D_2$ biased high&#39;</span><span class="p">);</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>We can see that while the 7 value remains the most likely (as expected), the distribution is not so nicely shaped any more.</p> +<p><strong>Edge Case 2:</strong> 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:</p> +\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}<p>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:</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[3]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="n">d1</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">]</span> +<span class="n">d2</span> <span class="o">=</span> <span class="n">d1</span> + +<span class="n">x1</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d1</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> +<span class="n">x2</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d2</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> + +<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">x1</span> <span class="o">+</span> <span class="n">x2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s1">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s2">&quot;$D_1$ and $D_2$ biased to 1 and 6&quot;</span><span class="p">);</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +SwIkIiJq+f8KwJfCiHKoPQAAAABJRU5ErkJggg== +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>In a very un-subtle way, we have of course made the values 2 and 12 far more likely.</p> +<h1 id="Detection-Conclusion">Detection Conclusion<a class="anchor-link" href="#Detection-Conclusion">&#182;</a></h1><p>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.</p> +<p>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.</p> +<p>We can thus finally state: <strong>just by looking at the distribution of results from this game, we can immediately conclude whether there is cheating.</strong></p> + +</div> +</div> +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="Simulated-Annealing">Simulated Annealing<a class="anchor-link" href="#Simulated-Annealing">&#182;</a></h1><p>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 <a href="#Justification-of-Simulated-Annealing">justification</a>. If you don't care about how I set up the model and just want to see the code, check out <a href="#The-actual-code">the actual code</a>.</p> +<p><a href="https://en.wikipedia.org/wiki/Simulated_annealing">Simulated Annealing</a> is a variation of the <a href="https://en.wikipedia.org/wiki/Metropolis%E2%80%93Hastings_algorithm">Metropolis-Hastings Algorithm</a>, 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 <strong>likelihood</strong> function.</p> +<h2 id="Deriving-the-Likelihood-function">Deriving the Likelihood function<a class="anchor-link" href="#Deriving-the-Likelihood-function">&#182;</a></h2><p>To derive our likelihood function, we want to know: <strong>what is the probability of seeing a specific result given those hidden parameters?</strong> 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.</p> +<p>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 <a href="https://en.wikipedia.org/wiki/Categorical_distribution">Categorical distribution</a>. That is:</p> +\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}<p>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 <a href="http://math.stackexchange.com/a/1646360/320784">this author</a> explains how to do it.</p> +<p>Now, we would like to know the likelihood of our entire data-set. This is trivial:</p> +\begin{align} +\mathcal{L(\mathbf{X})} &= \prod_{i=1}^n L(x) +\end{align}<p>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.</p> +\begin{align} +\log(\mathcal{L}) &= \sum_{i=1}^n \log(L) +\end{align}<h2 id="The-process-of-Simulated-Annealing">The process of Simulated Annealing<a class="anchor-link" href="#The-process-of-Simulated-Annealing">&#182;</a></h2><p>The means by which we optimize our likelihood function is the simulated annealing algorithm. The way it works is as follows:</p> +<ol> +<li><p>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.</p> +</li> +<li><p>For each iteration of the algorithm:</p> +<ol> +<li>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.</li> +<li>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.</li> +<li>Given the new parameter set performs worse, determine a probability of switching to the new parameter set anyways: $\mathcal{P}(p_{current}, p_{proposed})$</li> +<li>Switch to the new parameter set with probability $\mathcal{P}$. If you fail to switch, begin the next iteration.</li> +</ol> +</li> +<li><p>The algorithm is complete after we fail to make a transition $n$ times in a row.</p> +</li> +</ol> +<p>If everything goes according to plan, we will have a value that is close to the true distribution of each die.</p> +<h1 id="The-actual-code">The actual code<a class="anchor-link" href="#The-actual-code">&#182;</a></h1><p>We start by defining the score function. This will tell us how well the proposed die densities actually explain the results.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[5]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<span class="kn">from</span> <span class="nn">numpy</span> <span class="k">import</span> <span class="n">polynomial</span> + +<span class="k">def</span> <span class="nf">density_coef</span><span class="p">(</span><span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">):</span> + <span class="c1"># Calculating the probabilities of each outcome was taken</span> + <span class="c1"># from this author: http://math.stackexchange.com/a/1710392/320784</span> + <span class="n">d1_p</span> <span class="o">=</span> <span class="n">polynomial</span><span class="o">.</span><span class="n">Polynomial</span><span class="p">(</span><span class="n">d1_density</span><span class="p">)</span> + <span class="n">d2_p</span> <span class="o">=</span> <span class="n">polynomial</span><span class="o">.</span><span class="n">Polynomial</span><span class="p">(</span><span class="n">d2_density</span><span class="p">)</span> + <span class="n">coefs</span> <span class="o">=</span> <span class="p">(</span><span class="n">d1_p</span> <span class="o">*</span> <span class="n">d2_p</span><span class="p">)</span><span class="o">.</span><span class="n">coef</span> + <span class="k">return</span> <span class="n">coefs</span> + +<span class="k">def</span> <span class="nf">score</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">):</span> + <span class="c1"># We&#39;ve now got the probabilities of each event, but we need</span> + <span class="c1"># to shift the array a bit so we can use the x values to actually</span> + <span class="c1"># index into it. This will allow us to do all the calculations</span> + <span class="c1"># incredibly quickly</span> + <span class="n">coefs</span> <span class="o">=</span> <span class="n">density_coef</span><span class="p">(</span><span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">)</span> + <span class="n">coefs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">hstack</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">coefs</span><span class="p">))</span> + <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="n">coefs</span><span class="p">[</span><span class="n">x</span><span class="p">])</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> +</pre></div> + +</div> +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>Afterward, we need to write something to permute the proposal densities. We make random modifications, and eventually the best one survives.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[6]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">permute</span><span class="p">(</span><span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">):</span> + <span class="c1"># To ensure we have legitimate densities, we will randomly</span> + <span class="c1"># increase one die face probability by `change`,</span> + <span class="c1"># and decrease one by `change`.</span> + <span class="c1"># This means there are something less than (1/`change`)^12 possibilities</span> + <span class="c1"># we are trying to search over.</span> + <span class="n">change</span> <span class="o">=</span> <span class="o">.</span><span class="mi">01</span> + + <span class="n">d1_index1</span><span class="p">,</span> <span class="n">d1_index2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> + <span class="n">d2_index1</span><span class="p">,</span> <span class="n">d2_index2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> + + <span class="c1"># Also make sure to copy. I&#39;ve had some weird aliasing issues</span> + <span class="c1"># in the past that made everything blow up.</span> + <span class="n">new_d1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">d1_density</span><span class="p">))</span> + <span class="n">new_d2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">d2_density</span><span class="p">))</span> + + <span class="c1"># While this doesn&#39;t account for the possibility that some</span> + <span class="c1"># values go negative, in practice this never happens</span> + <span class="n">new_d1</span><span class="p">[</span><span class="n">d1_index1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">change</span> + <span class="n">new_d1</span><span class="p">[</span><span class="n">d1_index2</span><span class="p">]</span> <span class="o">-=</span> <span class="n">change</span> + <span class="n">new_d2</span><span class="p">[</span><span class="n">d2_index1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">change</span> + <span class="n">new_d2</span><span class="p">[</span><span class="n">d2_index2</span><span class="p">]</span> <span class="o">-=</span> <span class="n">change</span> + + <span class="k">return</span> <span class="n">new_d1</span><span class="p">,</span> <span class="n">new_d2</span> +</pre></div> + +</div> +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>Now we've got the main algorithm code to do. This is what brings all the pieces together.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[7]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">optimize</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">conv_count</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">max_iter</span><span class="o">=</span><span class="mi">1</span><span class="n">e4</span><span class="p">):</span> + <span class="n">switch_failures</span> <span class="o">=</span> <span class="mi">0</span> + <span class="n">iter_count</span> <span class="o">=</span> <span class="mi">0</span> + + <span class="c1"># Start with guessing fair dice</span> + <span class="n">cur_d1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> + <span class="n">cur_d2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> + <span class="n">cur_score</span> <span class="o">=</span> <span class="n">score</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">cur_d1</span><span class="p">,</span> <span class="n">cur_d2</span><span class="p">)</span> + + <span class="c1"># Keep track of our best guesses - may not be</span> + <span class="c1"># what we end with</span> + <span class="n">max_score</span> <span class="o">=</span> <span class="n">cur_score</span> + <span class="n">max_d1</span> <span class="o">=</span> <span class="n">cur_d1</span> + <span class="n">max_d2</span> <span class="o">=</span> <span class="n">cur_d2</span> + + <span class="c1"># Optimization stops when we have failed to switch `conv_count`</span> + <span class="c1"># times (presumably because we have a great guess), or we reach</span> + <span class="c1"># the maximum number of iterations.</span> + <span class="k">while</span> <span class="n">switch_failures</span> <span class="o">&lt;</span> <span class="n">conv_count</span> <span class="ow">and</span> <span class="n">iter_count</span> <span class="o">&lt;</span> <span class="n">max_iter</span><span class="p">:</span> + <span class="n">iter_count</span> <span class="o">+=</span> <span class="mi">1</span> + <span class="k">if</span> <span class="n">iter_count</span> <span class="o">%</span> <span class="p">(</span><span class="n">max_iter</span> <span class="o">/</span> <span class="mi">10</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Iteration: </span><span class="si">{}</span><span class="s1">; Current score (higher is better): </span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> + <span class="n">iter_count</span><span class="p">,</span> <span class="n">cur_score</span><span class="p">))</span> + + <span class="n">new_d1</span><span class="p">,</span> <span class="n">new_d2</span> <span class="o">=</span> <span class="n">permute</span><span class="p">(</span><span class="n">cur_d1</span><span class="p">,</span> <span class="n">cur_d2</span><span class="p">)</span> + <span class="n">new_score</span> <span class="o">=</span> <span class="n">score</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">new_d1</span><span class="p">,</span> <span class="n">new_d2</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">new_score</span> <span class="o">&gt;</span> <span class="n">max_score</span><span class="p">:</span> + <span class="n">max_score</span> <span class="o">=</span> <span class="n">new_score</span> + <span class="n">max_d1</span> <span class="o">=</span> <span class="n">new_d1</span> + <span class="n">max_d2</span> <span class="o">=</span> <span class="n">new_d2</span> + + <span class="k">if</span> <span class="n">new_score</span> <span class="o">&gt;</span> <span class="n">cur_score</span><span class="p">:</span> + <span class="c1"># If the new permutation beats the old one,</span> + <span class="c1"># automatically select it.</span> + <span class="n">cur_score</span> <span class="o">=</span> <span class="n">new_score</span> + <span class="n">cur_d1</span> <span class="o">=</span> <span class="n">new_d1</span> + <span class="n">cur_d2</span> <span class="o">=</span> <span class="n">new_d2</span> + <span class="n">switch_failures</span> <span class="o">=</span> <span class="mi">0</span> + <span class="k">else</span><span class="p">:</span> + <span class="c1"># We didn&#39;t beat the current score, but allow</span> + <span class="c1"># for possibly switching anyways.</span> + <span class="n">accept_prob</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="n">new_score</span> <span class="o">-</span> <span class="n">cur_score</span><span class="p">)</span> + <span class="n">coin_toss</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">rand</span><span class="p">()</span> + <span class="k">if</span> <span class="n">coin_toss</span> <span class="o">&lt;</span> <span class="n">accept_prob</span><span class="p">:</span> + <span class="c1"># We randomly switch to the new distribution</span> + <span class="n">cur_score</span> <span class="o">=</span> <span class="n">new_score</span> + <span class="n">cur_d1</span> <span class="o">=</span> <span class="n">new_d1</span> + <span class="n">cur_d2</span> <span class="o">=</span> <span class="n">new_d2</span> + <span class="n">switch_failures</span> <span class="o">=</span> <span class="mi">0</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">switch_failures</span> <span class="o">+=</span> <span class="mi">1</span> + + <span class="c1"># Return both our best guess, and the ending guess</span> + <span class="k">return</span> <span class="n">max_d1</span><span class="p">,</span> <span class="n">max_d2</span><span class="p">,</span> <span class="n">cur_d1</span><span class="p">,</span> <span class="n">cur_d2</span> +</pre></div> + +</div> +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>And now we have finished the hard work!</p> +<h1 id="Catching-the-Casino">Catching the Casino<a class="anchor-link" href="#Catching-the-Casino">&#182;</a></h1><p>Let's go through a couple of scenarios and see if we can catch the casino cheating with some loaded dice. <strong>In every scenario we start with an assumption of fair dice</strong>, and then try our hand to figure out what the <em>actual</em> distribution was.</p> +<h2 id="Attempt-1">Attempt 1<a class="anchor-link" href="#Attempt-1">&#182;</a></h2><p>The casino is using two dice that are both biased low. How well can we recover the distribution?</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[8]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> +<span class="k">def</span> <span class="nf">simulate_casino</span><span class="p">(</span><span class="n">d1_dist</span><span class="p">,</span> <span class="n">d2_dist</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">10000</span><span class="p">):</span> + <span class="n">d1_vals</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d1_dist</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> + <span class="n">d2_vals</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d2_dist</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> + + <span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> + <span class="n">max_d1</span><span class="p">,</span> <span class="n">max_d2</span><span class="p">,</span> <span class="n">final_d1</span><span class="p">,</span> <span class="n">final_d2</span> <span class="o">=</span> <span class="n">optimize</span><span class="p">(</span><span class="n">d1_vals</span> <span class="o">+</span> <span class="n">d2_vals</span><span class="p">)</span> + <span class="n">end</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> + <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Simulated Annealing time: </span><span class="si">{:.02f}</span><span class="s2">s&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">start</span><span class="p">))</span> + + <span class="n">coef_range</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">13</span><span class="p">)</span> <span class="o">-</span> <span class="o">.</span><span class="mi">5</span> + <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">221</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">bar</span><span class="p">(</span><span class="n">coef_range</span><span class="p">,</span> <span class="n">density_coef</span><span class="p">(</span><span class="n">d1_dist</span><span class="p">,</span> <span class="n">d2_dist</span><span class="p">),</span> <span class="n">width</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;True Distribution&#39;</span><span class="p">)</span> + + <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">222</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">hist</span><span class="p">(</span><span class="n">d1_vals</span> <span class="o">+</span> <span class="n">d2_vals</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Empirical Distribution&#39;</span><span class="p">)</span> + + <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">223</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">bar</span><span class="p">(</span><span class="n">coef_range</span><span class="p">,</span> <span class="n">density_coef</span><span class="p">(</span><span class="n">max_d1</span><span class="p">,</span> <span class="n">max_d2</span><span class="p">),</span> <span class="n">width</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Recovered Distribution&#39;</span><span class="p">)</span> + + <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> + + +<span class="n">simulate_casino</span><span class="p">([</span><span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">],</span> + <span class="p">[</span><span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">])</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stdout output_text"> +<pre>Iteration: 1000; Current score (higher is better): -22147.004400281654 +Simulated Annealing time: 0.30s +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h2 id="Attempt-2">Attempt 2<a class="anchor-link" href="#Attempt-2">&#182;</a></h2><p>The casino now uses dice that are both biased towards 1 and 6.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[9]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">],</span> + <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">])</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stdout output_text"> +<pre>Simulated Annealing time: 0.08s +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h2 id="Attempt-3">Attempt 3<a class="anchor-link" href="#Attempt-3">&#182;</a></h2><p>The casino will now use one die biased towards 1 and 6, and one die towards 3 and 4.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[10]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">],</span> + <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">])</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stdout output_text"> +<pre>Simulated Annealing time: 0.09s +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +RK5CYII= +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h2 id="Attempt-4">Attempt 4<a class="anchor-link" href="#Attempt-4">&#182;</a></h2><p>We'll now finally go to a fair casino to make sure that we can still recognize a positive result.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[11]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="n">simulate_casino</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stdout output_text"> +<pre>Simulated Annealing time: 0.02s +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +hoSz1PA0AAAAAElFTkSuQmCC +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h2 id="Attempt-5">Attempt 5<a class="anchor-link" href="#Attempt-5">&#182;</a></h2><p>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.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[12]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">],</span> + <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">],</span> + <span class="n">n</span><span class="o">=</span><span class="mi">250</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stdout output_text"> +<pre>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 +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>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.</p> +<h1 id="Conclusion">Conclusion<a class="anchor-link" href="#Conclusion">&#182;</a></h1><p>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.</p> +<p>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.</p> +<p>We can declare at long last: <strong>the mathematicians have again triumphed over the casino</strong>.</p> +<hr> + +</div> +</div> +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="Justification-of-Simulated-Annealing">Justification of Simulated Annealing<a class="anchor-link" href="#Justification-of-Simulated-Annealing">&#182;</a></h1><h2 id="Why-Simulated-Annealing?">Why Simulated Annealing?<a class="anchor-link" href="#Why-Simulated-Annealing?">&#182;</a></h2><p>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.</p> +<h2 id="Why-not-something-else?">Why not something else?<a class="anchor-link" href="#Why-not-something-else?">&#182;</a></h2><p>This is a fair question. There are two classes of algorithms that can also be used to solve this problem: <a href="https://en.wikipedia.org/wiki/Nonlinear_programming">Non-linear optimization</a> methods, and the <a href="https://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm">EM algorithm</a>.</p> +<ol> +<li><p>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 <em>incredibly</em> quickly - far more quickly than any non-linear solver would be able to accomplish.</p> +</li> +<li><p>The EM Algorithm was originally what I intended to write this blog post with. Indeed, the post was inspired by the <a href="http://web.stanford.edu/class/stats366/hmmR2.html">crooked casino</a> 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.</p> +</li> +</ol> + +</div> +</div> +</div></p> +<script type="text/x-mathjax-config"> +//MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); +MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); +</script> + +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Tick Tock...2016-04-06T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-04-06:tick-tock.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -519,7 +3247,7 @@ Remaining heartbeats after that: 4760716 MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Tweet Like Me2016-03-28T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-03-28:tweet-like-me.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Tweet Like Me2016-03-28T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-03-28:tweet-like-me.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -952,7 +3680,7 @@ z: .17</code></pre> <div class="output_text output_subarea output_execute_result"> -<pre>&apos;My first all-nighter of friends #oldschool&apos;</pre> +<pre>&#39;My first all-nighter of friends #oldschool&#39;</pre> </div> </div> @@ -1030,7 +3758,7 @@ z: .17</code></pre> <div class="output_area"><div class="prompt"></div> <div class="output_subarea output_stream output_stdout output_text"> -<pre>Also , I&apos;m at 8 this morning. #thursdaysgohard #ornot +<pre>Also , I&#39;m at 8 this morning. #thursdaysgohard #ornot Turns out of us breathe the code will want to my undergraduate career is becoming more night trying ? Religion is now as a chane #HYPE @@ -1038,7 +3766,7 @@ You know what recursion is to review the UNCC. #ornot There are really sore 3 bonfires in my first writing the library ground floor if awesome. #realtalk #impressed -So we can make it out there&apos;s nothing but I&apos;m not let us so hot I could think I may be good. #SwingDance +So we can make it out there&#39;s nothing but I&#39;m not let us so hot I could think I may be good. #SwingDance Happy Christmas , at Harris Teeter to be be godly or Roman Catholic ). #4b392b#4b392b #Isaiah26 @@ -1046,7 +3774,7 @@ For context , I in the most decisive factor of the same for homework. #accomplis Freaking done. #loveyouall -New blog post : Don&apos;t jump in a quiz in with a knife fight. #haskell #earlybirthday +New blog post : Don&#39;t jump in a quiz in with a knife fight. #haskell #earlybirthday God shows me legitimately want to get some food and one day. @@ -1064,11 +3792,11 @@ Eric Whitacre is the wise creation. Ethics paper first , music in close to everyone who just be posting up with my sin , and Jerry Springr #TheLittleThings -Love that you know enough time I&apos;ve eaten at 8 PM. #deepthoughts #stillblownaway +Love that you know enough time I&#39;ve eaten at 8 PM. #deepthoughts #stillblownaway Lead. #ThinkingTooMuch #Christmas -Aamazing conference when you married #DepartmentOfRedundancyDepartment Yep , but there&apos;s a legitimate challenge. +Aamazing conference when you married #DepartmentOfRedundancyDepartment Yep , but there&#39;s a legitimate challenge. </pre> </div> @@ -1094,7 +3822,7 @@ Aamazing conference when you married #DepartmentOfRedundancyDepartment Yep , but MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Predicting Santander Customer Happiness2016-03-05T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-03-05:predicting-santander-customer-happiness.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Predicting Santander Customer Happiness2016-03-05T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-03-05:predicting-santander-customer-happiness.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -2016,7 +4744,7 @@ rkJggg== MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Profitability using the Investment Formula2016-02-26T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-02-26:profitability-using-the-investment-formula.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Profitability using the Investment Formula2016-02-26T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-02-26:profitability-using-the-investment-formula.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -8889,7 +11617,7 @@ JBKJRCJrRTQiRCKRSCQSiUQikUgkElkr/h9yZ17EmpnoFwAAAABJRU5ErkJggg== MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Guaranteed Money Maker2016-02-03T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-02-03:guaranteed-money-maker.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Guaranteed Money Maker2016-02-03T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-02-03:guaranteed-money-maker.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -9152,7 +11880,7 @@ Profit: 0.08304813163696423 MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Cloudy in Seattle2016-01-23T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-01-23:cloudy-in-seattle.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Cloudy in Seattle2016-01-23T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-01-23:cloudy-in-seattle.html<p> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In&nbsp;[1]:</div> @@ -9888,7 +12616,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Complaining about the Weather2016-01-01T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-01-01:complaining-about-the-weather.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Complaining about the Weather2016-01-01T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-01-01:complaining-about-the-weather.html<p> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In&nbsp;[1]:</div> @@ -10644,7 +13372,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Testing Cramer2015-12-26T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-12-26:testing-cramer.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Testing Cramer2015-12-26T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-12-26:testing-cramer.html<p> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In&nbsp;[1]:</div> @@ -11067,7 +13795,7 @@ S&amp;P 0.585821 0.608209 0.535055 0.535055 MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Autocallable Bonds2015-11-27T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-11-27:autocallable-bonds.html<p>My only non-core class this semester has been in Structure Products. We've been surveying a wide variety of products, and the final project was to pick one to report on. +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Autocallable Bonds2015-11-27T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-11-27:autocallable-bonds.html<p>My only non-core class this semester has been in Structure Products. We've been surveying a wide variety of products, and the final project was to pick one to report on. Because these are all very similar, we decided to demonstrate all 3 products at once.</p> <p>What follows below is a notebook demonstrating the usage of <a href="http://julialang.com">Julia</a> for Monte-Carlo simulation of some exotic products.</p> <p> @@ -14846,7 +17574,7 @@ Present value of Phoenix with memory note: $100.09</pre> MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Welcome, and an algorithm2015-12-05T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-11-19:welcome-and-an-algorithm.html<p>Hello! Glad to meet you. I'm currently a student at Columbia University +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Welcome, and an algorithm2015-12-05T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-11-19:welcome-and-an-algorithm.html<p>Hello! Glad to meet you. I'm currently a student at Columbia University studying Financial Engineering, and want to give an overview of the projects I'm working on!</p> <p>To start things off, Columbia has been hosting a trading competition that @@ -14967,11 +17695,11 @@ to make some tweaks over the coming weeks, and do another forward test in Januar <div class="output_text output_subarea "> -<pre>{&apos;CLB&apos;: -0.0016320202164526894, - &apos;CVX&apos;: 0.0010319531629488911, - &apos;OXY&apos;: 0.00093418904454400551, - &apos;SLB&apos;: 0.00098431254720448159, - &apos;XOM&apos;: 0.00044165797556096868}</pre> +<pre>{&#39;CLB&#39;: -0.0016320202164526894, + &#39;CVX&#39;: 0.0010319531629488911, + &#39;OXY&#39;: 0.00093418904454400551, + &#39;SLB&#39;: 0.00098431254720448159, + &#39;XOM&#39;: 0.00044165797556096868}</pre> </div> </div> @@ -15016,11 +17744,11 @@ to make some tweaks over the coming weeks, and do another forward test in Januar <div class="output_text output_subarea "> -<pre>{&apos;CLB&apos;: -0.10578734457846127, - &apos;CVX&apos;: 0.027303529817677398, - &apos;OXY&apos;: 0.022622210057414487, - &apos;SLB&apos;: 0.026950946344858676, - &apos;XOM&apos;: -0.0053519259698605499}</pre> +<pre>{&#39;CLB&#39;: -0.10578734457846127, + &#39;CVX&#39;: 0.027303529817677398, + &#39;OXY&#39;: 0.022622210057414487, + &#39;SLB&#39;: 0.026950946344858676, + &#39;XOM&#39;: -0.0053519259698605499}</pre> </div> </div> @@ -15062,11 +17790,11 @@ to make some tweaks over the coming weeks, and do another forward test in Januar <div class="output_text output_subarea "> -<pre>{&apos;CLB&apos;: 0.043551495607375035, - &apos;CVX&apos;: 0.044894389686214398, - &apos;OXY&apos;: 0.051424517867144637, - &apos;SLB&apos;: 0.034774627850375328, - &apos;XOM&apos;: 0.035851524605672758}</pre> +<pre>{&#39;CLB&#39;: 0.043551495607375035, + &#39;CVX&#39;: 0.044894389686214398, + &#39;OXY&#39;: 0.051424517867144637, + &#39;SLB&#39;: 0.034774627850375328, + &#39;XOM&#39;: 0.035851524605672758}</pre> </div> </div> @@ -15174,7 +17902,7 @@ s.t.\ \ & \vec{1} \omega = 1\\ <div class="output_text output_subarea "> -<pre>&apos;Optimization terminated successfully.&apos;</pre> +<pre>&#39;Optimization terminated successfully.&#39;</pre> </div> </div> @@ -15183,7 +17911,7 @@ s.t.\ \ & \vec{1} \omega = 1\\ <div class="output_text output_subarea "> -<pre>&quot;Holdings: [(&apos;XOM&apos;, 5.8337945679814904), (&apos;CVX&apos;, 42.935064321851307), (&apos;CLB&apos;, -124.5), (&apos;OXY&apos;, 36.790387773552119), (&apos;SLB&apos;, 39.940753336615096)]&quot;</pre> +<pre>&#34;Holdings: [(&#39;XOM&#39;, 5.8337945679814904), (&#39;CVX&#39;, 42.935064321851307), (&#39;CLB&#39;, -124.5), (&#39;OXY&#39;, 36.790387773552119), (&#39;SLB&#39;, 39.940753336615096)]&#34;</pre> </div> </div> @@ -15192,7 +17920,7 @@ s.t.\ \ & \vec{1} \omega = 1\\ <div class="output_text output_subarea "> -<pre>&apos;Expected Return: 32.375%&apos;</pre> +<pre>&#39;Expected Return: 32.375%&#39;</pre> </div> </div> @@ -15201,7 +17929,7 @@ s.t.\ \ & \vec{1} \omega = 1\\ <div class="output_text output_subarea "> -<pre>&apos;Expected Max Drawdown: 4.34%&apos;</pre> +<pre>&#39;Expected Max Drawdown: 4.34%&#39;</pre> </div> </div> diff --git a/feeds/blog.atom.xml b/feeds/blog.atom.xml index 47ea1c6..78a12ab 100644 --- a/feeds/blog.atom.xml +++ b/feeds/blog.atom.xml @@ -1,5 +1,2733 @@ -Bradlee Speicehttps://bspeice.github.io/2016-04-06T00:00:00-04:00Tick Tock...2016-04-06T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-04-06:tick-tock.html<p> +Bradlee Speicehttps://bspeice.github.io/2016-05-15T00:00:00-04:00The Unfair Casino2016-05-15T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-05-15:the-unfair-casino.html<p> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>Or, how to get thrown out of a casino because you're a mathematician.</p> +<hr> +<p>In the ongoing eternal cycle of mathematicians asking generally useless questions about probability, I dreamt up another one. The scenario is as follows:</p> +<p><strong>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?</strong></p> +<h1 id="Proving-we-can-detect-cheating">Proving we can detect cheating<a class="anchor-link" href="#Proving-we-can-detect-cheating">&#182;</a></h1><p>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.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[1]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> +<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> +<span class="o">%</span><span class="k">matplotlib</span> inline + +<span class="n">fair_1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> +<span class="n">fair_2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> + +<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">fair_1</span> <span class="o">+</span> <span class="n">fair_2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s1">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Fair Distribution&#39;</span><span class="p">);</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAEKCAYAAAA8QgPpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz +AAALEgAACxIB0t1+/AAAHVRJREFUeJzt3X20XXV95/H3hyBPEhB1yK2JkCANBgtq1PiA1KMoD1pD +OrOKWFtEGGeVYKE6y1WCayZ3OmsUnDI+tIOjgjGwQBrwgTDFACkcK1MwKNCgQUyrCUkglyIUH7CQ +Sz7zx943HC65ybk795x97zmf11pnZe/f2Wd/v+esm/M9v99vP8g2ERER47VX3QlERMTUlAISERGV +pIBEREQlKSAREVFJCkhERFSSAhIREZWkgERfkPRlSRdM8D7nSPrFBO5vR46STpD0swnc99sk3TdR ++4sAUM4DialE0gbgUGAYEGBgru2tExznbOCLwJNl078ATeBTtv+pwr7+yPbbx/GaE4Av2z5iPLHK +104DtgGzbT843tdHtCs9kJhqDLzH9kG2p5f/7lHxKL9wd+bvbR8EHAy8k+JL+fuSjhpvCIq8d5XD +RP5f3G28iImQAhJTkZ7XULhW0sOSHpN0q6RXtjx/paT/Wi6fIOlnkpZIehj40q6CufAz238C3AEs +LffzCknbW2KcXe73F5L+SdJpkn4H+CvgeEm/lPRISz5/Lenbkn4JvLU1x5a39V8kPSrpnyW9r+WJ +70o6Y1Ts28rV75T/ritz+f3RQ2KSjpbUlPS4pH+U9O5Rn9XnJN1Yvv7/STp8V59R9KcUkOglNwCv +AAaAHwJX7mLbWcABwMuBxeOI8Q3g+JZ1A0iaDlwCnFD2Wo4D1tr+IfAR4Ltlj+nQlte+H1hqezpw +5xg5vhD4LeA/Al+RtKshrZFex+9SFNl5ZQ/tm6NyfQHwfyk+r5cCHwP+ZtS+3w98AjgE2AT8913E +jT6VAhJT0bfKXsZjkr4BO3oJV9h+0vbTwF8Ar5O0/xj72AYM2h62/dQ4Yj8EvHiM57YDx0ja1/aQ +7R/vZl/ftL2mzP/pnTz/TJnjNtu3AauAPxhHrs/rqZXeCrzA9iW2n7H9d8C3gdNbtrnO9j22nwGu +Al4zjrjRJ1JAYio61faLy8e/h2IOQdKny6GefwXWU/zifukY+xgqvxzHaybw2OhG27+k+NX+EWCr +pJWSfns3+9q0m+d/bvvfWtY3Ai8bT7Jj+C1g9OT6Ror3NqJ1XulJ4MAJiBs9JgUkpqKd/bI+AzgZ +aNh+EXBkud1Yv8KrTjIvAr670x3aN9l+F8UQ2j8D/2c3sXaXw0sk7duyfhhFDwjg1xRDcCMGxrHf +hyiG7lodBmzZzesiniMFJHrFdOAp4HFJLwQ+yZ4fiSTY0buZI+lSirmNv9jJNgOSfq8cMhum+IIf +mWAfAmZJ2nuc8acBg5JeIKlBUSCvLZ+7F/gPkvaTNBc4a+RFtrcDjwJjzZf8AzAs6WOS9pb0DuAU +4Jpx5hd9LgUkppqxisIy4GGKX9f3Abe3+bpdeWt5ouATwN8B+wGvHzW3MbLfacDHy/j/ArwZOLd8 +7haKIbUhSQ8xttE5bqIoRA9TvL+zbf+0fO4vy3+HgMt4/gEDS4GvlfNEi54TpJhveS9Fb+pR4LPA ++1v2nUOAoy0dPZFQ0uXA71GMNx9btr2aomu/H8VE5mLb3y+fW0LxS2oYON/2zWX7fOCr5WtutP1n +HUs6IiLa0ukeyDLgpFFtn6Y4dPG1FL+S/icUx6UDpwHzKLrTl0oaGb/+AsWvr7nAXEmj9xkREV3W +0QJi+3bg8VHN2ynO7AV4Ec9O3C0ErikPq9xA0eVfIGkAmG77rnK7Kyi63hERUaPxTupNhI8CN0m6 +hGIC8i1l+0yKs3xHbCnbhoHNLe2bee7hhhERUYM6JtHPoZjfOIyimHylhhwiImIP1dED+aDt8wFs +XyfpsrJ9C889Nn1W2TZW+05JyhEkEREV2B7rvKmd6kYPZPTJXFskvQ12XLJ6fdm+Ejhd0j6S5lCc +CLamvNLqE5IWlJPqZwDX7yqg7Txsli5dWnsOk+WRzyKfRT6LXT+q6GgPRNLVQIPijNoHKY66+jDw ++fIS2v8G/CcA2+skrQDW8ezhvSPv6lyeexjvqk7mHRERu9fRAmL7D8d46vVjbP8p4FM7af8BcMwE +phYREXsoZ6L3sEajUXcKk0Y+i2fls3hWPos903O3tJXkXntPERGdJglPwkn0iIjoQSkgERFRSQpI +RERUkgISERGVpIBEjMPAwGwkdf0xMDC77rce8Tw5CitiHIqLIdTx96XKZwtHtCNHYUVERNekgERE +RCUpIBERUUkKSEREVJICEhERlaSAREREJSkgERFRSQpIRERU0tECIulySUOS1o5q/1NJ90u6T9JF +Le1LJK0vnzuxpX2+pLWSfiLps53MOSIi2tPpHsgy4KTWBkkN4L3AMbaPAf6ybJ8HnAbMA04BLi3v +gQ7wBeBs23OBuZKes8+IiOi+jhYQ27cDj49qPge4yPZwuc2jZfupwDW2h21vANYDCyQNANNt31Vu +dwWwqJN5R0TE7tUxBzIX+F1Jd0q6TdLryvaZwKaW7baUbTOBzS3tm8u2iIio0d41xTzE9pskvQG4 +FjhiIgMMDg7uWG40GrnvcUTEKM1mk2azuUf76PjVeCUdDtxg+9hy/UbgYtvfKdfXA28CPgxg+6Ky +fRWwFNgI3GZ7Xtl+OvA22+eMES9X442OydV4o1dN1qvxqnyM+BbwDgBJc4F9bP8cWAm8T9I+kuYA +RwJrbG8FnpC0oJxUPwO4vgt5R0TELnR0CEvS1UADeImkByl6FF8Blkm6D3iKoiBge52kFcA6YBuw +uKUrcS7wVWA/4EbbqzqZd0RE7F5uKBUxDhnCil41WYewIiKiB6WAREREJSkgERFRSQpIRERUkgIS +ERGVpIBEREQlKSAREVFJCkhERFSSAhIREZWkgERERCUpIBERUUkKSEREVJICEhERlaSAREREJSkg +ERFRSQpIRERU0tECIulySUOS1u7kuf8sabukF7e0LZG0XtL9kk5saZ8vaa2kn0j6bCdzjoiI9nS6 +B7IMOGl0o6RZwLuAjS1t84DTgHnAKcCl5T3QAb4AnG17LjBX0vP2GRER3dXRAmL7duDxnTz1GeDj +o9pOBa6xPWx7A7AeWCBpAJhu+65yuyuARR1KOSIi2tT1ORBJC4FNtu8b9dRMYFPL+paybSawuaV9 +c9kWERE12rubwSTtD1xIMXzVMYODgzuWG40GjUajk+EiIqacZrNJs9nco33I9sRkM1YA6XDgBtvH +SvodYDXwJCBgFkVPYwFwFoDti8rXrQKWUsyT3GZ7Xtl+OvA22+eMEc+dfk/Rv4ppuTr+vkT+rqOT +JGFbu9/yWd0YwlL5wPYPbQ/YPsL2HIrhqNfafgRYCbxP0j6S5gBHAmtsbwWekLSgnFQ/A7i+C3lH +TCL7IqmWx8DA7LrffExSHR3CknQ10ABeIulBYKntZS2bmGeLyzpJK4B1wDZgcUtX4lzgq8B+wI22 +V3Uy74jJ5ynq6fnA0NC4fpRGH+n4EFa3ZQgrOqnOIay6CkiGz/pDlSGsrk6iR0yEgYHZDA1t3P2G +EdFR6YHElFNfLwDq6wmkBxKdNVkn0SMiogelgERERCUpIBERUUkKSEREVJICEhERlaSAREREJSkg +ERFRSQpIRERUkgISERGVpIBEREQlKSAREVFJCkhERFSSAhIREZWkgERERCUdLSCSLpc0JGltS9un +Jd0v6V5JX5d0UMtzSyStL58/saV9vqS1kn4i6bOdzDkiItrT6R7IMuCkUW03A6+y/RpgPbAEQNLR +wGnAPOAU4NLyHugAXwDOtj0XmCtp9D4jIqLLOlpAbN8OPD6qbbXt7eXqncCscnkhcI3tYdsbKIrL +AkkDwHTbd5XbXQEs6mTeERGxe3XPgZwF3FguzwQ2tTy3pWybCWxuad9ctkVERI1quye6pE8A22x/ +baL3PTg4uGO50WjQaDQmOkRExJTWbDZpNpt7tI+O3xNd0uHADbaPbWk7E/gw8A7bT5VtFwC2fXG5 +vgpYCmwEbrM9r2w/HXib7XPGiJd7ove43BO9+7Hzf6r3TdZ7oqt8FCvSycDHgYUjxaO0Ejhd0j6S +5gBHAmtsbwWekLSgnFQ/A7i+C3lHRMQudHQIS9LVQAN4iaQHKXoUFwL7ALeUB1ndaXux7XWSVgDr +gG3A4pauxLnAV4H9gBttr+pk3hERsXsdH8Lqtgxh9b4MYXU/dv5P9b7JOoQVERE9KAUkIiIqSQGJ +iIhKajsPJKa+gYHZDA1trDuNiKhJJtGjsvomszOJ3u3Y+T/V+zKJHhERXZMCEhERlaSAREREJW0V +EEnHdDqRiIiYWtrtgVwqaY2kxZIO7mhGERExJbRVQGwfD3wAeDnwA0lXS3pXRzOLiIhJbVyH8Uqa +RnE3wM8Dv6A4tvBC29/oTHrjl8N4uyeH8fZDXCiuYfrUbreaaDNmHM7WrRu6HrdfVTmMt60CIulY +4EPAe4BbgMtt3y3pZcAdtg+vknAnpIB0TwpIP8StM3bOP+mmThaQ7wCXAdfZ/s2o5/7Y9pXjyrSD +UkC6JwWkH+LWGTsFpJs6WUAOBH5j+5lyfS9gP9tPVsq0g1JAuicFpB/i1hk7BaSbOnkm+mpg/5b1 +A8q23SV0uaQhSWtb2g6RdLOkByTd1HpUl6QlktZLul/SiS3t8yWtlfQTSZ9tM+eIiOigdgvIfrZ/ +NbJSLh/QxuuWASeNarsAWG37KOBWYAmApKOB04B5wCkUhw6PVMMvAGfbngvMlTR6nxER0WXtFpBf +S5o/siLpdcBvdrE9ALZvBx4f1XwqsLxcXk5xVBfAQuAa28O2NwDrgQWSBoDptu8qt7ui5TUREVGT +di/n/mfAtZIeohgQHQDeVzHmobaHAGxvlXRo2T4TuKNluy1l2zCwuaV9c9keERE1aquA2L5L0iuB +o8qmB2xvm6AcMksWETEFjeeGUm8AZpevmV/O2F9RIeaQpBm2h8rhqUfK9i0UZ7qPmFW2jdU+psHB +wR3LjUaDRqNRIc2IiN7VbDZpNpt7tI92D+O9EngFcC/wTNls2+e18drZwA22jynXLwYes32xpD8H +DrF9QTmJfhXwRoohqluA37ZtSXcC5wF3AX8LfN72qjHi5TDeLslhvP0Qt87YOYy3m6ocxttuD+T1 +wNHj/WaWdDXQAF4i6UFgKXARxXzKWcBGiiOvsL1O0gpgHbANWNwS71zgqxTXVLhxrOIRERHd024P +5FrgPNsPdz6lPZMeSPekB9IPceuMnR5IN3WyB/JSYJ2kNbRcVc32wvEEi4iI3tFuARnsZBIRETH1 +tH05d0mHU0xqr5Z0ADDN9i87ml0FGcLqngxh9UPcOmNnCKubOnYtLEkfBq4Dvlg2zQS+Nb70IiKi +l7R7KZNzgeMobiKF7fXAobt8RURE9LR2C8hTtp8eWZG0NzmDPCKir7VbQL4j6UJg//Je6NcCN3Qu +rYiImOzaPQ9kL+Bs4ESKGbWbgMsm42x1JtG7J5Po/RC3ztiZRO+mjt2RcCpJAemeFJB+iFtn7BSQ +burYiYSSfsZO/oJsHzGeYBER0TvGcy2sEfsBfwC8eOLTiYiIqaLyEJakH9h+3QTns8cyhNU9GcLq +h7h1xs4QVjd1cghrfsvqXhQ9kvHcSyQiInpMu0XgkpblYWAD5WXYIyKiP+UorKgsQ1j9ELfO2BnC +6qZODmF9bFfP2/5f4wkaERFTX7tnor8eOIfiIoozgT8B5gPTy8e4SfqopB9KWivpKkn7SDpE0s2S +HpB0k6SDW7ZfImm9pPslnVglZkRETJx2z0T/e+A9I5dvlzQd+Fvbv1spqPQy4HbglbaflvQ3wI3A +0cDPbX96jPulvwGYBaymvF/6TvadIawuyRBWP8StM3aGsLqpY5dzB2YAT7esP1227YlpwAvLCzPu +D2wBTgWWl88vBxaVywuBa2wP294ArAcW7GH8iJjU9kVSLY+Bgdl1v/kpod2jsK4A1kj6Zrm+iGe/ +6MfN9kOSLgEeBJ4Ebi5vVDXD9lC5zVZJI5eMnwnc0bKLLWVbRPSsp6ir1zU0NK4f4n2rrQJi+39I ++jZwfNn0Idv3VA0q6UUUvY3DgSeAayV9gOf/taT/2oaBgdkMDW2sO42I6DPjORnwAOAXtpdJ+neS +5tj+WcW47wR+avsxgLJn8xZgaKQXImkAeKTcfgvw8pbXzyrbdmpwcHDHcqPRoNFoVExzaiiKR13j +8hExFTWbTZrN5h7to91J9KUUR2IdZXtuOQl+re3jKgWVFgCXU0yKPwUsA+4CDgMes33xGJPob6QY +urqFTKLv0H+T2f05oZz33N3Y/fg90pHzQIDfB14L3A075jAqHb5bvn6NpOuAe4Bt5b9fojgkeIWk +s4CNlGe7214naQWwrtx+cd9ViYiISabdHsga2wsk3W17vqQXAnfYPrbzKY5PeiBdjdxnceuMnffc +7dj9+D3SqcN4V0j6IvAiSR+mOA/jy+NNMCIiekfb18Iq74W+45a2tm/pZGJVpQfS1ch9FrfO2HnP +3Y7dj98jE35LW0nTgNW2374nyXVLCkhXI/dZ3Dpj5z13O3Y/fo9M+BCW7WeA7a3XpYqIiGj3KKxf +AfdJugX49Uij7fM6klVEREx67RaQb5SPiIgIYDdzIJIOs/1gF/PZY5kD6WrkPotbZ+y8527H7sfv +kYmeA/lWy86/XimriIjoSbsrIK3V6IhOJhIREVPL7gqIx1iOiIg+t7s5kGcojroSxU2fnhx5CrDt +gzqe4ThlDqSrkfssbp2x8567Hbsfv0cm9GKKtqftWUoREdGr2r0WVkRExHOkgERERCUpIBERUUkK +SEREVFJbAZF0sKRrJd0v6UeS3ijpEEk3S3pA0k2tF3CUtETS+nL7E+vKOyIiCnX2QD4H3Gh7HvBq +4MfABRSXjj8KuBVYAlDeE/00YB5wCnCpimNXIyKiJrUUEEkHAcfbXgZge9j2E8CpwPJys+XAonJ5 +IXBNud0GYD2woLtZR0REq7p6IHOARyUtk3S3pC9JOgCYYXsIwPZW4NBy+5nAppbXbynbIiKiJu1e +zr0TcecD59r+vqTPUAxfjT71s9KpoIODgzuWG40GjUajWpYRET2q2WzSbDb3aB9t3xN9IkmaAdxh ++4hy/a0UBeQVQMP2kKQB4Dbb8yRdQHHplIvL7VcBS21/byf7zqVMuhe5z+LWGTvvudux+/F7ZMJv +adsJ5TDVJklzy6YTgB8BK4Ezy7YPAteXyyuB0yXtI2kOcCSwpnsZR0TEaHUNYQGcB1wl6QXAT4EP +AdOAFZLOAjZSHHmF7XWSVgDrgG3A4r7rZkRETDK1DGF1Uoawuhq5z+LWGTvvudux+/F7ZEKvxhvt +GxiYzdDQxrrTiIjomvRAJi4u+YXY63HrjJ333O3YvfbduDvpgURETIh9qeNiFzNmHM7WrRu6Hreq +9EAmLi75hdjrceuMnffcH7Hr6/lMmcN4IyJi6ksBiYiISlJAIiKikhSQiIioJAUkIiIqSQGJiIhK +UkAiIqKSFJCIiKgkBSQiIipJAYmIiEpSQCIiopIUkIiIqKTWAiJpL0l3S1pZrh8i6WZJD0i6SdLB +LdsukbRe0v2STqwv64iIgPp7IOdT3KZ2xAXAattHAbcCSwAkHU1xe9t5wCnAparjWssREbFDbQVE +0izg3cBlLc2nAsvL5eXAonJ5IXCN7WHbG4D1wIIupRoRETtRZw/kM8DHee5F92fYHgKwvRU4tGyf +CWxq2W5L2RYRETWp5Y6Ekt4DDNm+V1JjF5tWurPK4ODgjuVGo0GjsasQERH9p9ls0mw292gftdyR +UNIngT8ChoH9genAN4HXAw3bQ5IGgNtsz5N0AWDbF5evXwUstf29new7dyRM3B6MnffcH7FzR8Ld +sn2h7cNsHwGcDtxq+4+BG4Azy80+CFxfLq8ETpe0j6Q5wJHAmi6nHRERLWoZwtqFi4AVks4CNlIc +eYXtdZJWUByxtQ1YXEs3IyIidqhlCKuTMoSVuL0ZO++5P2JnCCsiIvpACkhERFSSAhIREZWkgERE +RCUpIBERUUkKSEREVJICEhERlaSAREREJZPtTPQJ8eSTT9adQkREBfsylW511JNnou+99/5djbl9 ++zDbt2+jH8+a7a+4dcbOe+6P2PW+5/Geid6TPZDh4W73QK4EzuhyzIiIemUOJCIiKkkBiYiISlJA +IiKikhSQiIioJAUkIiIqqaWASJol6VZJP5J0n6TzyvZDJN0s6QFJN0k6uOU1SyStl3S/pBPryDsi +Ip5VVw9kGPiY7VcBbwbOlfRK4AJgte2jgFuBJQCSjqa4ve084BTgUk2ls20iInpQLQXE9lbb95bL +vwLuB2YBpwLLy82WA4vK5YXANbaHbW8A1gMLupp0REQ8R+1zIJJmA68B7gRm2B6CosgAh5abzQQ2 +tbxsS9kWERE1qfVMdEkHAtcB59v+laTR5/BXPKd/sGW5UT4iIuJZzfJRXW0FRNLeFMXjStvXl81D +kmbYHpI0ADxStm8BXt7y8lll2xgGJzzfiIje0uC5P67/27j3UOcQ1leAdbY/19K2EjizXP4gcH1L +++mS9pE0BzgSWNOtRCMi4vlq6YFIOg74AHCfpHsohqouBC4GVkg6C9hIceQVttdJWgGsA7YBi91r +lxGOiJhievJy7t2/HPLI1Xhz6enejltn7Lzn/og9tS7nXvtRWBERMTWlgERERCUpIBERUUkKSERE +VJICEhERlaSAREREJSkgERFRSQpIRERUkgISERGVpIBEREQlKSAREVFJCkhERFSSAhIREZWkgERE +RCUpIBERUcmUKiCSTpb0Y0k/kfTndecTEdHPpkwBkbQX8NfAScCrgPdLemW9WU12zboTmESadScw +iTTrTmASadadwJQ2ZQoIsABYb3uj7W3ANcCpNec0yTXrTmASadadwCTSrDuBSaRZdwJT2lQqIDOB +TS3rm8u2iIiowd51J9AJBx303q7G27ZtM7/5TVdDRkTUTnZdN3AfH0lvAgZtn1yuXwDY9sWjtpsa +bygiYpKxrfFsP5UKyDTgAeAE4GFgDfB+2/fXmlhERJ+aMkNYtp+R9BHgZoq5m8tTPCIi6jNleiAR +ETG5TKWjsMYkaZakWyX9SNJ9ks6rO6e6SdpL0t2SVtadS50kHSzpWkn3l38fb6w7p7pI+qikH0pa +K+kqSfvUnVO3SLpc0pCktS1th0i6WdIDkm6SdHCdOXbLGJ/Fp8v/I/dK+rqkg9rZV08UEGAY+Jjt +VwFvBs7NSYacD6yrO4lJ4HPAjbbnAa8G+nLYU9LLgD8F5ts+lmL4+vR6s+qqZRQnIbe6AFht+yjg +VmBJ17Oqx84+i5uBV9l+DbCeNj+Lniggtrfavrdc/hXFl0TfniMiaRbwbuCyunOpU/kr6njbywBs +D9v+Rc1p1Wka8EJJewMHAA/VnE/X2L4deHxU86nA8nJ5ObCoq0nVZGefhe3VtreXq3cCs9rZV08U +kFaSZgOvAb5Xbya1+gzwcaDfJ7jmAI9KWlYO531J0v51J1UH2w8BlwAPAluAf7W9ut6saneo7SEo +foQCh9acz2RxFvDtdjbsqQIi6UDgOuD8sifSdyS9Bxgqe2QqH/1qb2A+8L9tzweepBi26DuSXkTx +i/tw4GXAgZL+sN6sJp1+/8GFpE8A22xf3c72PVNAym75dcCVtq+vO58aHQcslPRT4GvA2yVdUXNO +ddkMbLL9/XL9OoqC0o/eCfzU9mO2nwG+Abyl5pzqNiRpBoCkAeCRmvOplaQzKYa+2/5h0TMFBPgK +sM725+pOpE62L7R9mO0jKCZJb7V9Rt151aEcntgkaW7ZdAL9e2DBg8CbJO0nSRSfRb8dUDC6R74S +OLNc/iDQTz88n/NZSDqZYth7oe2n2t1JTxQQSccBHwDeIemecrz75LrziknhPOAqSfdSHIX1yZrz +qYXtNRQ9sHuAf6T48vhSrUl1kaSrgX8A5kp6UNKHgIuAd0kaucLFRXXm2C1jfBZ/BRwI3FJ+f17a +1r5yImFERFTREz2QiIjovhSQiIioJAUkIiIqSQGJiIhKUkAiIqKSFJCIiKgkBSQiIipJAYmIiEr+ +P71BWn/o4C2PAAAAAElFTkSuQmCC +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>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 <a href="https://en.wikipedia.org/wiki/Triangular_distribution">Triangle Distribution</a>, which is itself a special case of the <a href="https://en.wikipedia.org/wiki/Irwin%E2%80%93Hall_distribution">Irwin-Hall Distribution</a>.</p> +<h1 id="The-Edge-Cases">The Edge Cases<a class="anchor-link" href="#The-Edge-Cases">&#182;</a></h1><p>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.</p> +<h3 id="Edge-Case-1">Edge Case 1<a class="anchor-link" href="#Edge-Case-1">&#182;</a></h3><p>What happens when one die is biased low, and one die is biased high? That is, where:</p> +\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} +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[2]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">unfair_die</span><span class="p">(</span><span class="n">p_vals</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> + <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">multinomial</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">p_vals</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> + <span class="k">return</span> <span class="n">x</span><span class="o">.</span><span class="n">nonzero</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span> + +<span class="n">d1</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">]</span> +<span class="n">d2</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">]</span> + +<span class="n">x1</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d1</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> +<span class="n">x2</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d2</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> + +<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">x1</span> <span class="o">+</span> <span class="n">x2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s1">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">);</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;$D_1$ biased low, $D_2$ biased high&#39;</span><span class="p">);</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>We can see that while the 7 value remains the most likely (as expected), the distribution is not so nicely shaped any more.</p> +<p><strong>Edge Case 2:</strong> 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:</p> +\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}<p>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:</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[3]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="n">d1</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">]</span> +<span class="n">d2</span> <span class="o">=</span> <span class="n">d1</span> + +<span class="n">x1</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d1</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> +<span class="n">x2</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d2</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> + +<span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">x1</span> <span class="o">+</span> <span class="n">x2</span><span class="p">)</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s1">&#39;hist&#39;</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s2">&quot;$D_1$ and $D_2$ biased to 1 and 6&quot;</span><span class="p">);</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +SwIkIiJq+f8KwJfCiHKoPQAAAABJRU5ErkJggg== +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>In a very un-subtle way, we have of course made the values 2 and 12 far more likely.</p> +<h1 id="Detection-Conclusion">Detection Conclusion<a class="anchor-link" href="#Detection-Conclusion">&#182;</a></h1><p>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.</p> +<p>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.</p> +<p>We can thus finally state: <strong>just by looking at the distribution of results from this game, we can immediately conclude whether there is cheating.</strong></p> + +</div> +</div> +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="Simulated-Annealing">Simulated Annealing<a class="anchor-link" href="#Simulated-Annealing">&#182;</a></h1><p>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 <a href="#Justification-of-Simulated-Annealing">justification</a>. If you don't care about how I set up the model and just want to see the code, check out <a href="#The-actual-code">the actual code</a>.</p> +<p><a href="https://en.wikipedia.org/wiki/Simulated_annealing">Simulated Annealing</a> is a variation of the <a href="https://en.wikipedia.org/wiki/Metropolis%E2%80%93Hastings_algorithm">Metropolis-Hastings Algorithm</a>, 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 <strong>likelihood</strong> function.</p> +<h2 id="Deriving-the-Likelihood-function">Deriving the Likelihood function<a class="anchor-link" href="#Deriving-the-Likelihood-function">&#182;</a></h2><p>To derive our likelihood function, we want to know: <strong>what is the probability of seeing a specific result given those hidden parameters?</strong> 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.</p> +<p>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 <a href="https://en.wikipedia.org/wiki/Categorical_distribution">Categorical distribution</a>. That is:</p> +\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}<p>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 <a href="http://math.stackexchange.com/a/1646360/320784">this author</a> explains how to do it.</p> +<p>Now, we would like to know the likelihood of our entire data-set. This is trivial:</p> +\begin{align} +\mathcal{L(\mathbf{X})} &= \prod_{i=1}^n L(x) +\end{align}<p>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.</p> +\begin{align} +\log(\mathcal{L}) &= \sum_{i=1}^n \log(L) +\end{align}<h2 id="The-process-of-Simulated-Annealing">The process of Simulated Annealing<a class="anchor-link" href="#The-process-of-Simulated-Annealing">&#182;</a></h2><p>The means by which we optimize our likelihood function is the simulated annealing algorithm. The way it works is as follows:</p> +<ol> +<li><p>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.</p> +</li> +<li><p>For each iteration of the algorithm:</p> +<ol> +<li>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.</li> +<li>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.</li> +<li>Given the new parameter set performs worse, determine a probability of switching to the new parameter set anyways: $\mathcal{P}(p_{current}, p_{proposed})$</li> +<li>Switch to the new parameter set with probability $\mathcal{P}$. If you fail to switch, begin the next iteration.</li> +</ol> +</li> +<li><p>The algorithm is complete after we fail to make a transition $n$ times in a row.</p> +</li> +</ol> +<p>If everything goes according to plan, we will have a value that is close to the true distribution of each die.</p> +<h1 id="The-actual-code">The actual code<a class="anchor-link" href="#The-actual-code">&#182;</a></h1><p>We start by defining the score function. This will tell us how well the proposed die densities actually explain the results.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[5]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<span class="kn">from</span> <span class="nn">numpy</span> <span class="k">import</span> <span class="n">polynomial</span> + +<span class="k">def</span> <span class="nf">density_coef</span><span class="p">(</span><span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">):</span> + <span class="c1"># Calculating the probabilities of each outcome was taken</span> + <span class="c1"># from this author: http://math.stackexchange.com/a/1710392/320784</span> + <span class="n">d1_p</span> <span class="o">=</span> <span class="n">polynomial</span><span class="o">.</span><span class="n">Polynomial</span><span class="p">(</span><span class="n">d1_density</span><span class="p">)</span> + <span class="n">d2_p</span> <span class="o">=</span> <span class="n">polynomial</span><span class="o">.</span><span class="n">Polynomial</span><span class="p">(</span><span class="n">d2_density</span><span class="p">)</span> + <span class="n">coefs</span> <span class="o">=</span> <span class="p">(</span><span class="n">d1_p</span> <span class="o">*</span> <span class="n">d2_p</span><span class="p">)</span><span class="o">.</span><span class="n">coef</span> + <span class="k">return</span> <span class="n">coefs</span> + +<span class="k">def</span> <span class="nf">score</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">):</span> + <span class="c1"># We&#39;ve now got the probabilities of each event, but we need</span> + <span class="c1"># to shift the array a bit so we can use the x values to actually</span> + <span class="c1"># index into it. This will allow us to do all the calculations</span> + <span class="c1"># incredibly quickly</span> + <span class="n">coefs</span> <span class="o">=</span> <span class="n">density_coef</span><span class="p">(</span><span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">)</span> + <span class="n">coefs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">hstack</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">coefs</span><span class="p">))</span> + <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="n">coefs</span><span class="p">[</span><span class="n">x</span><span class="p">])</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> +</pre></div> + +</div> +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>Afterward, we need to write something to permute the proposal densities. We make random modifications, and eventually the best one survives.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[6]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">permute</span><span class="p">(</span><span class="n">d1_density</span><span class="p">,</span> <span class="n">d2_density</span><span class="p">):</span> + <span class="c1"># To ensure we have legitimate densities, we will randomly</span> + <span class="c1"># increase one die face probability by `change`,</span> + <span class="c1"># and decrease one by `change`.</span> + <span class="c1"># This means there are something less than (1/`change`)^12 possibilities</span> + <span class="c1"># we are trying to search over.</span> + <span class="n">change</span> <span class="o">=</span> <span class="o">.</span><span class="mi">01</span> + + <span class="n">d1_index1</span><span class="p">,</span> <span class="n">d1_index2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> + <span class="n">d2_index1</span><span class="p">,</span> <span class="n">d2_index2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> + + <span class="c1"># Also make sure to copy. I&#39;ve had some weird aliasing issues</span> + <span class="c1"># in the past that made everything blow up.</span> + <span class="n">new_d1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">d1_density</span><span class="p">))</span> + <span class="n">new_d2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">d2_density</span><span class="p">))</span> + + <span class="c1"># While this doesn&#39;t account for the possibility that some</span> + <span class="c1"># values go negative, in practice this never happens</span> + <span class="n">new_d1</span><span class="p">[</span><span class="n">d1_index1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">change</span> + <span class="n">new_d1</span><span class="p">[</span><span class="n">d1_index2</span><span class="p">]</span> <span class="o">-=</span> <span class="n">change</span> + <span class="n">new_d2</span><span class="p">[</span><span class="n">d2_index1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">change</span> + <span class="n">new_d2</span><span class="p">[</span><span class="n">d2_index2</span><span class="p">]</span> <span class="o">-=</span> <span class="n">change</span> + + <span class="k">return</span> <span class="n">new_d1</span><span class="p">,</span> <span class="n">new_d2</span> +</pre></div> + +</div> +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>Now we've got the main algorithm code to do. This is what brings all the pieces together.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[7]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">optimize</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">conv_count</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">max_iter</span><span class="o">=</span><span class="mi">1</span><span class="n">e4</span><span class="p">):</span> + <span class="n">switch_failures</span> <span class="o">=</span> <span class="mi">0</span> + <span class="n">iter_count</span> <span class="o">=</span> <span class="mi">0</span> + + <span class="c1"># Start with guessing fair dice</span> + <span class="n">cur_d1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> + <span class="n">cur_d2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> + <span class="n">cur_score</span> <span class="o">=</span> <span class="n">score</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">cur_d1</span><span class="p">,</span> <span class="n">cur_d2</span><span class="p">)</span> + + <span class="c1"># Keep track of our best guesses - may not be</span> + <span class="c1"># what we end with</span> + <span class="n">max_score</span> <span class="o">=</span> <span class="n">cur_score</span> + <span class="n">max_d1</span> <span class="o">=</span> <span class="n">cur_d1</span> + <span class="n">max_d2</span> <span class="o">=</span> <span class="n">cur_d2</span> + + <span class="c1"># Optimization stops when we have failed to switch `conv_count`</span> + <span class="c1"># times (presumably because we have a great guess), or we reach</span> + <span class="c1"># the maximum number of iterations.</span> + <span class="k">while</span> <span class="n">switch_failures</span> <span class="o">&lt;</span> <span class="n">conv_count</span> <span class="ow">and</span> <span class="n">iter_count</span> <span class="o">&lt;</span> <span class="n">max_iter</span><span class="p">:</span> + <span class="n">iter_count</span> <span class="o">+=</span> <span class="mi">1</span> + <span class="k">if</span> <span class="n">iter_count</span> <span class="o">%</span> <span class="p">(</span><span class="n">max_iter</span> <span class="o">/</span> <span class="mi">10</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Iteration: </span><span class="si">{}</span><span class="s1">; Current score (higher is better): </span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> + <span class="n">iter_count</span><span class="p">,</span> <span class="n">cur_score</span><span class="p">))</span> + + <span class="n">new_d1</span><span class="p">,</span> <span class="n">new_d2</span> <span class="o">=</span> <span class="n">permute</span><span class="p">(</span><span class="n">cur_d1</span><span class="p">,</span> <span class="n">cur_d2</span><span class="p">)</span> + <span class="n">new_score</span> <span class="o">=</span> <span class="n">score</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">new_d1</span><span class="p">,</span> <span class="n">new_d2</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">new_score</span> <span class="o">&gt;</span> <span class="n">max_score</span><span class="p">:</span> + <span class="n">max_score</span> <span class="o">=</span> <span class="n">new_score</span> + <span class="n">max_d1</span> <span class="o">=</span> <span class="n">new_d1</span> + <span class="n">max_d2</span> <span class="o">=</span> <span class="n">new_d2</span> + + <span class="k">if</span> <span class="n">new_score</span> <span class="o">&gt;</span> <span class="n">cur_score</span><span class="p">:</span> + <span class="c1"># If the new permutation beats the old one,</span> + <span class="c1"># automatically select it.</span> + <span class="n">cur_score</span> <span class="o">=</span> <span class="n">new_score</span> + <span class="n">cur_d1</span> <span class="o">=</span> <span class="n">new_d1</span> + <span class="n">cur_d2</span> <span class="o">=</span> <span class="n">new_d2</span> + <span class="n">switch_failures</span> <span class="o">=</span> <span class="mi">0</span> + <span class="k">else</span><span class="p">:</span> + <span class="c1"># We didn&#39;t beat the current score, but allow</span> + <span class="c1"># for possibly switching anyways.</span> + <span class="n">accept_prob</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="n">new_score</span> <span class="o">-</span> <span class="n">cur_score</span><span class="p">)</span> + <span class="n">coin_toss</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">rand</span><span class="p">()</span> + <span class="k">if</span> <span class="n">coin_toss</span> <span class="o">&lt;</span> <span class="n">accept_prob</span><span class="p">:</span> + <span class="c1"># We randomly switch to the new distribution</span> + <span class="n">cur_score</span> <span class="o">=</span> <span class="n">new_score</span> + <span class="n">cur_d1</span> <span class="o">=</span> <span class="n">new_d1</span> + <span class="n">cur_d2</span> <span class="o">=</span> <span class="n">new_d2</span> + <span class="n">switch_failures</span> <span class="o">=</span> <span class="mi">0</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">switch_failures</span> <span class="o">+=</span> <span class="mi">1</span> + + <span class="c1"># Return both our best guess, and the ending guess</span> + <span class="k">return</span> <span class="n">max_d1</span><span class="p">,</span> <span class="n">max_d2</span><span class="p">,</span> <span class="n">cur_d1</span><span class="p">,</span> <span class="n">cur_d2</span> +</pre></div> + +</div> +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>And now we have finished the hard work!</p> +<h1 id="Catching-the-Casino">Catching the Casino<a class="anchor-link" href="#Catching-the-Casino">&#182;</a></h1><p>Let's go through a couple of scenarios and see if we can catch the casino cheating with some loaded dice. <strong>In every scenario we start with an assumption of fair dice</strong>, and then try our hand to figure out what the <em>actual</em> distribution was.</p> +<h2 id="Attempt-1">Attempt 1<a class="anchor-link" href="#Attempt-1">&#182;</a></h2><p>The casino is using two dice that are both biased low. How well can we recover the distribution?</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[8]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> +<span class="k">def</span> <span class="nf">simulate_casino</span><span class="p">(</span><span class="n">d1_dist</span><span class="p">,</span> <span class="n">d2_dist</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">10000</span><span class="p">):</span> + <span class="n">d1_vals</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d1_dist</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> + <span class="n">d2_vals</span> <span class="o">=</span> <span class="n">unfair_die</span><span class="p">(</span><span class="n">d2_dist</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> + + <span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> + <span class="n">max_d1</span><span class="p">,</span> <span class="n">max_d2</span><span class="p">,</span> <span class="n">final_d1</span><span class="p">,</span> <span class="n">final_d2</span> <span class="o">=</span> <span class="n">optimize</span><span class="p">(</span><span class="n">d1_vals</span> <span class="o">+</span> <span class="n">d2_vals</span><span class="p">)</span> + <span class="n">end</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> + <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Simulated Annealing time: </span><span class="si">{:.02f}</span><span class="s2">s&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">start</span><span class="p">))</span> + + <span class="n">coef_range</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">13</span><span class="p">)</span> <span class="o">-</span> <span class="o">.</span><span class="mi">5</span> + <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">221</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">bar</span><span class="p">(</span><span class="n">coef_range</span><span class="p">,</span> <span class="n">density_coef</span><span class="p">(</span><span class="n">d1_dist</span><span class="p">,</span> <span class="n">d2_dist</span><span class="p">),</span> <span class="n">width</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;True Distribution&#39;</span><span class="p">)</span> + + <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">222</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">hist</span><span class="p">(</span><span class="n">d1_vals</span> <span class="o">+</span> <span class="n">d2_vals</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">11</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Empirical Distribution&#39;</span><span class="p">)</span> + + <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">223</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">bar</span><span class="p">(</span><span class="n">coef_range</span><span class="p">,</span> <span class="n">density_coef</span><span class="p">(</span><span class="n">max_d1</span><span class="p">,</span> <span class="n">max_d2</span><span class="p">),</span> <span class="n">width</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Recovered Distribution&#39;</span><span class="p">)</span> + + <span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> + + +<span class="n">simulate_casino</span><span class="p">([</span><span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">],</span> + <span class="p">[</span><span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">])</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stdout output_text"> +<pre>Iteration: 1000; Current score (higher is better): -22147.004400281654 +Simulated Annealing time: 0.30s +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h2 id="Attempt-2">Attempt 2<a class="anchor-link" href="#Attempt-2">&#182;</a></h2><p>The casino now uses dice that are both biased towards 1 and 6.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[9]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">],</span> + <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">])</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stdout output_text"> +<pre>Simulated Annealing time: 0.08s +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h2 id="Attempt-3">Attempt 3<a class="anchor-link" href="#Attempt-3">&#182;</a></h2><p>The casino will now use one die biased towards 1 and 6, and one die towards 3 and 4.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[10]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">],</span> + <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="p">])</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stdout output_text"> +<pre>Simulated Annealing time: 0.09s +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +RK5CYII= +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h2 id="Attempt-4">Attempt 4<a class="anchor-link" href="#Attempt-4">&#182;</a></h2><p>We'll now finally go to a fair casino to make sure that we can still recognize a positive result.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[11]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="n">simulate_casino</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stdout output_text"> +<pre>Simulated Annealing time: 0.02s +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +hoSz1PA0AAAAAElFTkSuQmCC +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h2 id="Attempt-5">Attempt 5<a class="anchor-link" href="#Attempt-5">&#182;</a></h2><p>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.</p> + +</div> +</div> +</div> +<div class="cell border-box-sizing code_cell rendered"> +<div class="input"> +<div class="prompt input_prompt">In&nbsp;[12]:</div> +<div class="inner_cell"> + <div class="input_area"> +<div class=" highlight hl-ipython3"><pre><span></span><span class="n">simulate_casino</span><span class="p">([</span><span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">],</span> + <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="o">/</span><span class="mi">9</span><span class="p">],</span> + <span class="n">n</span><span class="o">=</span><span class="mi">250</span><span class="p">)</span> +</pre></div> + +</div> +</div> +</div> + +<div class="output_wrapper"> +<div class="output"> + + +<div class="output_area"><div class="prompt"></div> +<div class="output_subarea output_stream output_stdout output_text"> +<pre>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 +</pre> +</div> +</div> + +<div class="output_area"><div class="prompt"></div> + + +<div class="output_png output_subarea "> +<img src="data:image/png;base64,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 +" +> +</div> + +</div> + +</div> +</div> + +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<p>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.</p> +<h1 id="Conclusion">Conclusion<a class="anchor-link" href="#Conclusion">&#182;</a></h1><p>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.</p> +<p>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.</p> +<p>We can declare at long last: <strong>the mathematicians have again triumphed over the casino</strong>.</p> +<hr> + +</div> +</div> +</div> +<div class="cell border-box-sizing text_cell rendered"> +<div class="prompt input_prompt"> +</div> +<div class="inner_cell"> +<div class="text_cell_render border-box-sizing rendered_html"> +<h1 id="Justification-of-Simulated-Annealing">Justification of Simulated Annealing<a class="anchor-link" href="#Justification-of-Simulated-Annealing">&#182;</a></h1><h2 id="Why-Simulated-Annealing?">Why Simulated Annealing?<a class="anchor-link" href="#Why-Simulated-Annealing?">&#182;</a></h2><p>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.</p> +<h2 id="Why-not-something-else?">Why not something else?<a class="anchor-link" href="#Why-not-something-else?">&#182;</a></h2><p>This is a fair question. There are two classes of algorithms that can also be used to solve this problem: <a href="https://en.wikipedia.org/wiki/Nonlinear_programming">Non-linear optimization</a> methods, and the <a href="https://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm">EM algorithm</a>.</p> +<ol> +<li><p>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 <em>incredibly</em> quickly - far more quickly than any non-linear solver would be able to accomplish.</p> +</li> +<li><p>The EM Algorithm was originally what I intended to write this blog post with. Indeed, the post was inspired by the <a href="http://web.stanford.edu/class/stats366/hmmR2.html">crooked casino</a> 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.</p> +</li> +</ol> + +</div> +</div> +</div></p> +<script type="text/x-mathjax-config"> +//MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); +MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); +</script> + +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Tick Tock...2016-04-06T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-04-06:tick-tock.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -519,7 +3247,7 @@ Remaining heartbeats after that: 4760716 MathJax.Hub.Config({tex2jax: {inlineMath: [['\$','\$']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Tweet Like Me2016-03-28T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-03-28:tweet-like-me.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Tweet Like Me2016-03-28T00:00:00-04:00Bradlee Speicetag:bspeice.github.io,2016-03-28:tweet-like-me.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -952,7 +3680,7 @@ z: .17</code></pre> <div class="output_text output_subarea output_execute_result"> -<pre>&apos;My first all-nighter of friends #oldschool&apos;</pre> +<pre>&#39;My first all-nighter of friends #oldschool&#39;</pre> </div> </div> @@ -1030,7 +3758,7 @@ z: .17</code></pre> <div class="output_area"><div class="prompt"></div> <div class="output_subarea output_stream output_stdout output_text"> -<pre>Also , I&apos;m at 8 this morning. #thursdaysgohard #ornot +<pre>Also , I&#39;m at 8 this morning. #thursdaysgohard #ornot Turns out of us breathe the code will want to my undergraduate career is becoming more night trying ? Religion is now as a chane #HYPE @@ -1038,7 +3766,7 @@ You know what recursion is to review the UNCC. #ornot There are really sore 3 bonfires in my first writing the library ground floor if awesome. #realtalk #impressed -So we can make it out there&apos;s nothing but I&apos;m not let us so hot I could think I may be good. #SwingDance +So we can make it out there&#39;s nothing but I&#39;m not let us so hot I could think I may be good. #SwingDance Happy Christmas , at Harris Teeter to be be godly or Roman Catholic ). #4b392b#4b392b #Isaiah26 @@ -1046,7 +3774,7 @@ For context , I in the most decisive factor of the same for homework. #accomplis Freaking done. #loveyouall -New blog post : Don&apos;t jump in a quiz in with a knife fight. #haskell #earlybirthday +New blog post : Don&#39;t jump in a quiz in with a knife fight. #haskell #earlybirthday God shows me legitimately want to get some food and one day. @@ -1064,11 +3792,11 @@ Eric Whitacre is the wise creation. Ethics paper first , music in close to everyone who just be posting up with my sin , and Jerry Springr #TheLittleThings -Love that you know enough time I&apos;ve eaten at 8 PM. #deepthoughts #stillblownaway +Love that you know enough time I&#39;ve eaten at 8 PM. #deepthoughts #stillblownaway Lead. #ThinkingTooMuch #Christmas -Aamazing conference when you married #DepartmentOfRedundancyDepartment Yep , but there&apos;s a legitimate challenge. +Aamazing conference when you married #DepartmentOfRedundancyDepartment Yep , but there&#39;s a legitimate challenge. </pre> </div> @@ -1094,7 +3822,7 @@ Aamazing conference when you married #DepartmentOfRedundancyDepartment Yep , but MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Predicting Santander Customer Happiness2016-03-05T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-03-05:predicting-santander-customer-happiness.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Predicting Santander Customer Happiness2016-03-05T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-03-05:predicting-santander-customer-happiness.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -2016,7 +4744,7 @@ rkJggg== MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Profitability using the Investment Formula2016-02-26T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-02-26:profitability-using-the-investment-formula.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Profitability using the Investment Formula2016-02-26T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-02-26:profitability-using-the-investment-formula.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -8889,7 +11617,7 @@ JBKJRCJrRTQiRCKRSCQSiUQikUgkElkr/h9yZ17EmpnoFwAAAABJRU5ErkJggg== MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Guaranteed Money Maker2016-02-03T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-02-03:guaranteed-money-maker.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Guaranteed Money Maker2016-02-03T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-02-03:guaranteed-money-maker.html<p> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> @@ -9152,7 +11880,7 @@ Profit: 0.08304813163696423 MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Cloudy in Seattle2016-01-23T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-01-23:cloudy-in-seattle.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Cloudy in Seattle2016-01-23T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-01-23:cloudy-in-seattle.html<p> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In&nbsp;[1]:</div> @@ -9888,7 +12616,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Complaining about the Weather2016-01-01T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-01-01:complaining-about-the-weather.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Complaining about the Weather2016-01-01T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2016-01-01:complaining-about-the-weather.html<p> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In&nbsp;[1]:</div> @@ -10644,7 +13372,7 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Testing Cramer2015-12-26T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-12-26:testing-cramer.html<p> +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Testing Cramer2015-12-26T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-12-26:testing-cramer.html<p> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In&nbsp;[1]:</div> @@ -11067,7 +13795,7 @@ S&amp;P 0.585821 0.608209 0.535055 0.535055 MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Autocallable Bonds2015-11-27T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-11-27:autocallable-bonds.html<p>My only non-core class this semester has been in Structure Products. We've been surveying a wide variety of products, and the final project was to pick one to report on. +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Autocallable Bonds2015-11-27T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-11-27:autocallable-bonds.html<p>My only non-core class this semester has been in Structure Products. We've been surveying a wide variety of products, and the final project was to pick one to report on. Because these are all very similar, we decided to demonstrate all 3 products at once.</p> <p>What follows below is a notebook demonstrating the usage of <a href="http://julialang.com">Julia</a> for Monte-Carlo simulation of some exotic products.</p> <p> @@ -14846,7 +17574,7 @@ Present value of Phoenix with memory note: $100.09</pre> MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\(','\)']]}}); </script> -<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Welcome, and an algorithm2015-12-05T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-11-19:welcome-and-an-algorithm.html<p>Hello! Glad to meet you. I'm currently a student at Columbia University +<script async src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML'></script>Welcome, and an algorithm2015-12-05T00:00:00-05:00Bradlee Speicetag:bspeice.github.io,2015-11-19:welcome-and-an-algorithm.html<p>Hello! Glad to meet you. I'm currently a student at Columbia University studying Financial Engineering, and want to give an overview of the projects I'm working on!</p> <p>To start things off, Columbia has been hosting a trading competition that @@ -14967,11 +17695,11 @@ to make some tweaks over the coming weeks, and do another forward test in Januar <div class="output_text output_subarea "> -<pre>{&apos;CLB&apos;: -0.0016320202164526894, - &apos;CVX&apos;: 0.0010319531629488911, - &apos;OXY&apos;: 0.00093418904454400551, - &apos;SLB&apos;: 0.00098431254720448159, - &apos;XOM&apos;: 0.00044165797556096868}</pre> +<pre>{&#39;CLB&#39;: -0.0016320202164526894, + &#39;CVX&#39;: 0.0010319531629488911, + &#39;OXY&#39;: 0.00093418904454400551, + &#39;SLB&#39;: 0.00098431254720448159, + &#39;XOM&#39;: 0.00044165797556096868}</pre> </div> </div> @@ -15016,11 +17744,11 @@ to make some tweaks over the coming weeks, and do another forward test in Januar <div class="output_text output_subarea "> -<pre>{&apos;CLB&apos;: -0.10578734457846127, - &apos;CVX&apos;: 0.027303529817677398, - &apos;OXY&apos;: 0.022622210057414487, - &apos;SLB&apos;: 0.026950946344858676, - &apos;XOM&apos;: -0.0053519259698605499}</pre> +<pre>{&#39;CLB&#39;: -0.10578734457846127, + &#39;CVX&#39;: 0.027303529817677398, + &#39;OXY&#39;: 0.022622210057414487, + &#39;SLB&#39;: 0.026950946344858676, + &#39;XOM&#39;: -0.0053519259698605499}</pre> </div> </div> @@ -15062,11 +17790,11 @@ to make some tweaks over the coming weeks, and do another forward test in Januar <div class="output_text output_subarea "> -<pre>{&apos;CLB&apos;: 0.043551495607375035, - &apos;CVX&apos;: 0.044894389686214398, - &apos;OXY&apos;: 0.051424517867144637, - &apos;SLB&apos;: 0.034774627850375328, - &apos;XOM&apos;: 0.035851524605672758}</pre> +<pre>{&#39;CLB&#39;: 0.043551495607375035, + &#39;CVX&#39;: 0.044894389686214398, + &#39;OXY&#39;: 0.051424517867144637, + &#39;SLB&#39;: 0.034774627850375328, + &#39;XOM&#39;: 0.035851524605672758}</pre> </div> </div> @@ -15174,7 +17902,7 @@ s.t.\ \ & \vec{1} \omega = 1\\ <div class="output_text output_subarea "> -<pre>&apos;Optimization terminated successfully.&apos;</pre> +<pre>&#39;Optimization terminated successfully.&#39;</pre> </div> </div> @@ -15183,7 +17911,7 @@ s.t.\ \ & \vec{1} \omega = 1\\ <div class="output_text output_subarea "> -<pre>&quot;Holdings: [(&apos;XOM&apos;, 5.8337945679814904), (&apos;CVX&apos;, 42.935064321851307), (&apos;CLB&apos;, -124.5), (&apos;OXY&apos;, 36.790387773552119), (&apos;SLB&apos;, 39.940753336615096)]&quot;</pre> +<pre>&#34;Holdings: [(&#39;XOM&#39;, 5.8337945679814904), (&#39;CVX&#39;, 42.935064321851307), (&#39;CLB&#39;, -124.5), (&#39;OXY&#39;, 36.790387773552119), (&#39;SLB&#39;, 39.940753336615096)]&#34;</pre> </div> </div> @@ -15192,7 +17920,7 @@ s.t.\ \ & \vec{1} \omega = 1\\ <div class="output_text output_subarea "> -<pre>&apos;Expected Return: 32.375%&apos;</pre> +<pre>&#39;Expected Return: 32.375%&#39;</pre> </div> </div> @@ -15201,7 +17929,7 @@ s.t.\ \ & \vec{1} \omega = 1\\ <div class="output_text output_subarea "> -<pre>&apos;Expected Max Drawdown: 4.34%&apos;</pre> +<pre>&#39;Expected Max Drawdown: 4.34%&#39;</pre> </div> </div> diff --git a/index.html b/index.html index e33a621..d6b86f4 100644 --- a/index.html +++ b/index.html @@ -83,6 +83,8 @@

+
Sun 15 May 2016
+
The Unfair Casino
Wed 06 April 2016
Tick Tock...
Mon 28 March 2016
@@ -101,11 +103,14 @@
Testing Cramer
Fri 27 November 2015
Autocallable Bonds
-
Thu 19 November 2015
-
Welcome, and an algorithm
+ + + diff --git a/index2.html b/index2.html new file mode 100644 index 0000000..b2b5810 --- /dev/null +++ b/index2.html @@ -0,0 +1,129 @@ + + + + + + + + + + + - page 2 - Bradlee Speice + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+
+ + + +
+
+
+
+

+
+

Exploring the intersection of Computer Science and Financial Engineering

+
+
+
+
+ + +
+ + + + + +
+
+

- page 2

+
+
Thu 19 November 2015
+
Welcome, and an algorithm
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/tag/casino.html b/tag/casino.html new file mode 100644 index 0000000..0b6330d --- /dev/null +++ b/tag/casino.html @@ -0,0 +1,123 @@ + + + + + + + + + + + casino - Bradlee Speice + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+
+ + + +
+
+
+
+

: #casino

+
+

#casino

+
+
+
+
+ + +
+ + + + +
+
+

casino

+
+
Sun 15 May 2016
+
The Unfair Casino
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/tag/em.html b/tag/em.html new file mode 100644 index 0000000..ea935be --- /dev/null +++ b/tag/em.html @@ -0,0 +1,123 @@ + + + + + + + + + + + em - Bradlee Speice + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+
+ + + +
+
+
+
+

: #em

+
+

#em

+
+
+
+
+ + +
+ + + + +
+
+

em

+
+
Sun 15 May 2016
+
The Unfair Casino
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/tag/machine-learning.html b/tag/machine-learning.html index af43ac3..74c324b 100644 --- a/tag/machine-learning.html +++ b/tag/machine-learning.html @@ -82,6 +82,8 @@

machine learning

+
Sun 15 May 2016
+
The Unfair Casino
Sat 05 March 2016
Predicting Santander Customer Happiness
diff --git a/tag/probability.html b/tag/probability.html new file mode 100644 index 0000000..7f64bca --- /dev/null +++ b/tag/probability.html @@ -0,0 +1,123 @@ + + + + + + + + + + + probability - Bradlee Speice + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+
+ + + +
+
+
+
+

: #probability

+
+

#probability

+
+
+
+
+ + +
+ + + + +
+
+

probability

+
+
Sun 15 May 2016
+
The Unfair Casino
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/tag/simulated-annealing.html b/tag/simulated-annealing.html new file mode 100644 index 0000000..680edec --- /dev/null +++ b/tag/simulated-annealing.html @@ -0,0 +1,123 @@ + + + + + + + + + + + simulated annealing - Bradlee Speice + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+
+ + + +
+
+
+
+

: #simulated annealing

+
+

#simulated annealing

+
+
+
+
+ + +
+ + + + +
+
+

simulated annealing

+
+
Sun 15 May 2016
+
The Unfair Casino
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/tags.html b/tags.html index 7d2ba86..5966554 100644 --- a/tags.html +++ b/tags.html @@ -84,9 +84,13 @@
1 article
algorithmic-trading
+
1 article
+
casino
3 articles
data science
1 article
+
em
+
1 article
finance
1 article
fitbit
@@ -98,7 +102,7 @@
introduction
1 article
kaggle
-
1 article
+
2 articles
machine learning
1 article
martingale
@@ -107,8 +111,12 @@
1 article
monte carlo
1 article
+
probability
+
1 article
python
1 article
+
simulated annealing
+
1 article
simulation
1 article
strategy
diff --git a/the-unfair-casino.html b/the-unfair-casino.html new file mode 100644 index 0000000..ceba5a4 --- /dev/null +++ b/the-unfair-casino.html @@ -0,0 +1,2869 @@ + + + + + + + + + + + The Unfair Casino - Bradlee Speice + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+
+ + + + +
+
+
+
+

The Unfair Casino

+

Bradlee Speice, Sun 15 May 2016, Blog

+
+
+

+ +casino, em, machine learning, probability, simulated annealing

+
+
+
+
+ + + +
+ + + + +
+

+

+
+
+
+
+

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.

+ +
+
+
+
+
+
In [1]:
+
+
+
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');
+
+ +
+
+
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

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, which is itself a special case of the Irwin-Hall Distribution.

+

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} +
+
+
+
+
+
In [2]:
+
+
+
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');
+
+ +
+
+
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

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:

+ +
+
+
+
+
+
In [3]:
+
+
+
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");
+
+ +
+
+
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

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. If you don't care about how I set up the model and just want to see the code, check out the actual code.

+

Simulated Annealing is a variation of the Metropolis-Hastings Algorithm, 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. 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 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. +
  3. 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. +
    3. 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.
    4. +
    5. Given the new parameter set performs worse, determine a probability of switching to the new parameter set anyways: $\mathcal{P}(p_{current}, p_{proposed})$
    6. +
    7. Switch to the new parameter set with probability $\mathcal{P}$. If you fail to switch, begin the next iteration.
    8. +
    +
  4. +
  5. The algorithm is complete after we fail to make a transition $n$ times in a row.

    +
  6. +
+

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.

+ +
+
+
+
+
+
In [5]:
+
+
+
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.

+ +
+
+
+
+
+
In [6]:
+
+
+
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.

+ +
+
+
+
+
+
In [7]:
+
+
+
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?

+ +
+
+
+
+
+
In [8]:
+
+
+
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
+
+
+
+ +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

Attempt 2

The casino now uses dice that are both biased towards 1 and 6.

+ +
+
+
+
+
+
In [9]:
+
+
+
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
+
+
+
+ +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

Attempt 3

The casino will now use one die biased towards 1 and 6, and one die towards 3 and 4.

+ +
+
+
+
+
+
In [10]:
+
+
+
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
+
+
+
+ +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

Attempt 4

We'll now finally go to a fair casino to make sure that we can still recognize a positive result.

+ +
+
+
+
+
+
In [11]:
+
+
+
simulate_casino(np.repeat(1/6, 6), np.repeat(1/6, 6))
+
+ +
+
+
+ +
+
+ + +
+
+
Simulated Annealing time: 0.02s
+
+
+
+ +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

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.

+ +
+
+
+
+
+
In [12]:
+
+
+
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
+
+
+
+ +
+ + +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+

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 methods, and the EM 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. +
  3. The EM Algorithm was originally what I intended to write this blog post with. Indeed, the post was inspired by the crooked casino 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.

    +
  4. +
+ +
+
+

+ + + + + +
+
+ + +
+ +
+ + + + + + + \ No newline at end of file diff --git a/tweet-like-me.html b/tweet-like-me.html index 4229c30..b3b8771 100644 --- a/tweet-like-me.html +++ b/tweet-like-me.html @@ -519,7 +519,7 @@ z: .17
-
'My first all-nighter of friends #oldschool'
+
'My first all-nighter of friends #oldschool'
@@ -597,7 +597,7 @@ z: .17
-
Also , I'm at 8 this morning. #thursdaysgohard #ornot
+
Also , I'm at 8 this morning. #thursdaysgohard #ornot
 
 Turns out of us breathe the code will want to my undergraduate career is becoming more night trying ? Religion is now as a chane #HYPE
 
@@ -605,7 +605,7 @@ You know what recursion is to review the UNCC. #ornot
 
 There are really sore 3 bonfires in my first writing the library ground floor if awesome. #realtalk #impressed
 
-So we can make it out there's nothing but I'm not let us so hot I could think I may be good. #SwingDance
+So we can make it out there's nothing but I'm not let us so hot I could think I may be good. #SwingDance
 
 Happy Christmas , at Harris Teeter to be be godly or Roman Catholic ). #4b392b#4b392b #Isaiah26
 
@@ -613,7 +613,7 @@ For context , I in the most decisive factor of the same for homework. #accomplis
 
 Freaking done. #loveyouall
 
-New blog post : Don't jump in a quiz in with a knife fight. #haskell #earlybirthday
+New blog post : Don't jump in a quiz in with a knife fight. #haskell #earlybirthday
 
 God shows me legitimately want to get some food and one day.
 
@@ -631,11 +631,11 @@ Eric Whitacre is the wise creation.
 
 Ethics paper first , music in close to everyone who just be posting up with my sin , and Jerry Springr #TheLittleThings
 
-Love that you know enough time I've eaten at 8 PM. #deepthoughts #stillblownaway
+Love that you know enough time I've eaten at 8 PM. #deepthoughts #stillblownaway
 
 Lead. #ThinkingTooMuch #Christmas
 
-Aamazing conference when you married #DepartmentOfRedundancyDepartment Yep , but there's a legitimate challenge.
+Aamazing conference when you married #DepartmentOfRedundancyDepartment Yep , but there's a legitimate challenge.
 
 
diff --git a/welcome-and-an-algorithm.html b/welcome-and-an-algorithm.html index 32af181..e6f56fd 100644 --- a/welcome-and-an-algorithm.html +++ b/welcome-and-an-algorithm.html @@ -207,11 +207,11 @@ to make some tweaks over the coming weeks, and do another forward test in Januar
-
{'CLB': -0.0016320202164526894,
- 'CVX': 0.0010319531629488911,
- 'OXY': 0.00093418904454400551,
- 'SLB': 0.00098431254720448159,
- 'XOM': 0.00044165797556096868}
+
{'CLB': -0.0016320202164526894,
+ 'CVX': 0.0010319531629488911,
+ 'OXY': 0.00093418904454400551,
+ 'SLB': 0.00098431254720448159,
+ 'XOM': 0.00044165797556096868}
@@ -256,11 +256,11 @@ to make some tweaks over the coming weeks, and do another forward test in Januar
-
{'CLB': -0.10578734457846127,
- 'CVX': 0.027303529817677398,
- 'OXY': 0.022622210057414487,
- 'SLB': 0.026950946344858676,
- 'XOM': -0.0053519259698605499}
+
{'CLB': -0.10578734457846127,
+ 'CVX': 0.027303529817677398,
+ 'OXY': 0.022622210057414487,
+ 'SLB': 0.026950946344858676,
+ 'XOM': -0.0053519259698605499}
@@ -302,11 +302,11 @@ to make some tweaks over the coming weeks, and do another forward test in Januar
-
{'CLB': 0.043551495607375035,
- 'CVX': 0.044894389686214398,
- 'OXY': 0.051424517867144637,
- 'SLB': 0.034774627850375328,
- 'XOM': 0.035851524605672758}
+
{'CLB': 0.043551495607375035,
+ 'CVX': 0.044894389686214398,
+ 'OXY': 0.051424517867144637,
+ 'SLB': 0.034774627850375328,
+ 'XOM': 0.035851524605672758}
@@ -414,7 +414,7 @@ s.t.\ \ & \vec{1} \omega = 1\\
-
'Optimization terminated successfully.'
+
'Optimization terminated successfully.'
@@ -423,7 +423,7 @@ s.t.\ \ & \vec{1} \omega = 1\\
-
"Holdings: [('XOM', 5.8337945679814904), ('CVX', 42.935064321851307), ('CLB', -124.5), ('OXY', 36.790387773552119), ('SLB', 39.940753336615096)]"
+
"Holdings: [('XOM', 5.8337945679814904), ('CVX', 42.935064321851307), ('CLB', -124.5), ('OXY', 36.790387773552119), ('SLB', 39.940753336615096)]"
@@ -432,7 +432,7 @@ s.t.\ \ & \vec{1} \omega = 1\\
-
'Expected Return: 32.375%'
+
'Expected Return: 32.375%'
@@ -441,7 +441,7 @@ s.t.\ \ & \vec{1} \omega = 1\\
-
'Expected Max Drawdown: 4.34%'
+
'Expected Max Drawdown: 4.34%'