{ "cells": [ { "cell_type": "markdown", "source": [ "## Bonus Exercise: Bayes' Rule\n", "### Description\n", "In this exercise, you will implement Bayes' rule to solve a simple card game." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 1, "outputs": [], "source": [ "import random\n", "\n", "class CardDeck:\n", " def __init__(self):\n", " # Initialize the deck of cards\n", " self.cards = ['R', 'R', 'B', 'B']\n", " # Shuffle the deck of cards\n", " random.shuffle(self.cards)\n", " # Initialize the prior probability\n", " self.prior_red = 0.5\n", " self.likelihood = 0.5\n", "\n", "\n", " def draw_card(self, index):\n", " \"\"\"\n", " Draw a card from the deck\n", " :param index: the index of the card to be drawn\n", " :return: the card and its color\n", " \"\"\"\n", " card = self.cards.pop(index)\n", " color = 'Red' if card == 'R' else 'Black'\n", " return (card, color)\n", "\n", " def get_card_color(self, index):\n", " \"\"\"\n", " Get the color of a card\n", " :return: the color of the card\n", " \"\"\"\n", " card = self.cards[index]\n", " color = 'Red' if card == 'R' else 'Black'\n", " return color\n", "\n", " def get_remainder(self):\n", " \"\"\"\n", " Get the remainder deck\n", " :return: the remainder deck\n", " \"\"\"\n", " return self.cards\n", "\n", " \"\"\"\n", " Update the prior probability based on Bayes' rule\n", " function name: update_probabilities\n", " \"\"\"\n", " ### function missing here\n", " \"\"\"\n", " Calculate the posterior probability based on the prior probability, likelihood, and marginal likelihood\n", " function name: get_posterior\n", " \"\"\"\n", " ### function missing here\n", "\n", " def play_game(self):\n", " while self.cards:\n", " for i, card in enumerate(self.cards):\n", " print(f'{i}: Unknown')\n", " # only one card left\n", " if len(self.cards) == 1:\n", " # code missing here\n", " self.cards.pop()\n", " else:\n", " index = int(input(f\"Remainder deck: {self.get_remainder()}\\nEnter the index of the card you want to draw:\"))\n", " card, color = self.draw_card(index-1)\n", " print(f'You drew a {color} card with value {card}')\n", "\n", " # Calculate the likelihood and marginal likelihood based on the color of the drawn card\n", "\n", " # Update the prior probability based on Bayes' rule\n", " # code missing here\n", " posterior_red = 0 # you must calculate this value\n", " posterior_black = 0 # you must calculate this value\n", " # Print the posterior probabilities\n", " print(f\"After drawing a {card} card:\")\n", " print(f\"The probability that the other card is red: {posterior_red:.2f}\")\n", " print(f\"The probability that the other card is black: {posterior_black:.2f}\")\n", " print(\"The deck is empty.\")\n", "\n", "\n" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "play the game by running the following code:\n" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 2, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0: Unknown\n", "1: Unknown\n", "2: Unknown\n", "3: Unknown\n", "You drew a Black card with value B\n", "After drawing a B card:\n", "The probability that the other card is red: 0.00\n", "The probability that the other card is black: 0.00\n", "0: Unknown\n", "1: Unknown\n", "2: Unknown\n", "You drew a Red card with value R\n", "After drawing a R card:\n", "The probability that the other card is red: 0.00\n", "The probability that the other card is black: 0.00\n", "0: Unknown\n", "1: Unknown\n", "You drew a Red card with value R\n", "After drawing a R card:\n", "The probability that the other card is red: 0.00\n", "The probability that the other card is black: 0.00\n", "0: Unknown\n", "After drawing a B card:\n", "The probability that the other card is red: 0.00\n", "The probability that the other card is black: 0.00\n", "The deck is empty.\n" ] } ], "source": [ "deck = CardDeck()\n", "deck.play_game()\n" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [], "metadata": { "collapsed": false } } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 }