{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import seaborn as sns\n", "plt.style.use('ggplot')\n", "import matplotlib.figure as figure\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from fractions import Fraction\n", "normal_uniform = {2: Fraction(1, 36), 3: Fraction(2,36), 4: Fraction(3, 36),\n", " 5: Fraction(4, 36), 6: Fraction(5, 36), 7: Fraction(6, 36),\n", " 8: Fraction(5, 36), 9: Fraction(4, 36), 10: Fraction(3, 36),\n", " 11: Fraction(2, 36), 12: Fraction(1, 36)}\n", "# biased= {2: Fraction(0, 32), 3: Fraction(3,32), 4: Fraction(3, 32),\n", "# 5: Fraction(4, 32), 6: Fraction(4, 32), 7: Fraction(6, 32),\n", "# 8: Fraction(3, 32), 9: Fraction(2, 32), 10: Fraction(3, 32),\n", "# 11: Fraction(4, 32), 12: Fraction(0, 32)}\n", "biased= {2: Fraction(1, 26), 3: Fraction(2,26), 4: Fraction(3, 26),\n", " 5: Fraction(4, 26), 6: Fraction(5, 26), 7: Fraction(6, 26),\n", " 8: Fraction(1, 26), 9: Fraction(1, 26), 10: Fraction(1, 26),\n", " 11: Fraction(1, 26), 12: Fraction(1, 26)}\n", "def update(x, priors, distributions):\n", " weighted = []\n", " for d, p in zip(distributions, priors):\n", " weighted.append(d[x] * p)\n", " total = sum(weighted)\n", " return list(map(lambda e: e / total, weighted))" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[0.9992614896212075, 0.0007385103787924079]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "priors = [.5, .5]\n", "priors = update(3, priors, [normal_uniform, biased])\n", "priors = update(3, priors, [normal_uniform, biased])\n", "priors = update(4, priors, [normal_uniform, biased])\n", "priors = update(4, priors, [normal_uniform, biased])\n", "priors = update(4, priors, [normal_uniform, biased])\n", "priors = update(5, priors, [normal_uniform, biased])\n", "priors = update(5, priors, [normal_uniform, biased])\n", "priors = update(5, priors, [normal_uniform, biased])\n", "priors = update(5, priors, [normal_uniform, biased])\n", "priors = update(6, priors, [normal_uniform, biased])\n", "priors = update(6, priors, [normal_uniform, biased])\n", "priors = update(6, priors, [normal_uniform, biased])\n", "priors = update(6, priors, [normal_uniform, biased])\n", "priors = update(6, priors, [normal_uniform, biased])\n", "priors = update(7, priors, [normal_uniform, biased])\n", "priors = update(7, priors, [normal_uniform, biased])\n", "priors = update(7, priors, [normal_uniform, biased])\n", "priors = update(7, priors, [normal_uniform, biased])\n", "priors = update(7, priors, [normal_uniform, biased])\n", "priors = update(7, priors, [normal_uniform, biased])\n", "priors = update(8, priors, [normal_uniform, biased])\n", "priors = update(8, priors, [normal_uniform, biased])\n", "priors = update(8, priors, [normal_uniform, biased])\n", "priors = update(8, priors, [normal_uniform, biased])\n", "priors = update(8, priors, [normal_uniform, biased])\n", "priors = update(9, priors, [normal_uniform, biased])\n", "priors = update(9, priors, [normal_uniform, biased])\n", "priors = update(9, priors, [normal_uniform, biased])\n", "priors = update(9, priors, [normal_uniform, biased])\n", "priors = update(10, priors, [normal_uniform, biased])\n", "priors = update(10, priors, [normal_uniform, biased])\n", "priors = update(10, priors, [normal_uniform, biased])\n", "priors = update(11, priors, [normal_uniform, biased])\n", "priors = update(11, priors, [normal_uniform, biased])\n", "priors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The idea here is that I manually loaded a normally uniform set of dice into this model, did updates every time, found that I began to get a posterior belief that this was a normal_uniform distribution. I did this 4 times, and I ended up with a 70+% probability that this was normal uniform.\n", "\n", "Now, I could get a different model that measured the switch point, assuming biased for a while. Or, I could build a model that was some sort of mix from bias to normal. I would need a record of a lot of games. Over 6494 games, the dice are very normally distributed. I mean, perfectly. So, if there is an introduction of bias, it's got to be because over that many games, the bias would have been normally distributed as well." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import random\n", "def weighted_pick(d):\n", " r = random.uniform(0, sum(d.itervalues()))\n", " s = 0.0\n", " for k, w in d.iteritems():\n", " s += w\n", " if r < s: return k\n", " return k" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[0.9999987063264542, 1.2936735458075107e-06]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "priors = [.5, .5]\n", "for e in xrange(100):\n", " x = weighted_pick(normal_uniform)\n", " while x < 3 or x > 11:\n", " x = weighted_pick(normal_uniform)\n", " priors = update(x, priors, [normal_uniform, biased])\n", "priors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since I'm not seeing stable results, I'm going to have to think about this for a while. Updates on the data, every time I see a new die rolled seems to create a bias towards normal_uniform or biased, rather than learning what the real distribution is." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I reset biased to be more different than random uniform, and got stable results both directions. I think what was happening was something that looks more like a random walk when the two distributions are hard to distinguish.\n", "\n", "What's next is a plot on these values." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
| \n", " | Normal | \n", "Biased | \n", "Sample | \n", "
|---|---|---|---|
| 0 | \n", "0.419355 | \n", "0.580645 | \n", "0 | \n", "
| 1 | \n", "0.342799 | \n", "0.657201 | \n", "1 | \n", "
| 2 | \n", "0.601094 | \n", "0.398906 | \n", "2 | \n", "
| 3 | \n", "0.521139 | \n", "0.478861 | \n", "3 | \n", "
| 4 | \n", "0.440085 | \n", "0.559915 | \n", "4 | \n", "