Skip to content

Instantly share code, notes, and snippets.

@mbeltagy
Last active October 26, 2016 07:59
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mbeltagy/3ba5f77da6382da192c3 to your computer and use it in GitHub Desktop.
Save mbeltagy/3ba5f77da6382da192c3 to your computer and use it in GitHub Desktop.
Julia translation of Norvig's notebook on "Probability, Paradox, and the Reasonable Person Principle"
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<div style=\"text-align: right\">Peter Norvig, 3 Oct 2015, revised 27 Oct 2015, translated to Julia by Mohammed El-Beltagy 27 Nov 2015, updated for Julia 0.5 compatiblity 26 Oct 2016</div> \n",
"\n",
"# Probability, Paradox, and the Reasonable Person Principle\n",
"\n",
"*This notebook is a Julia translation of [Norvig's Original Notebook](http://nbviewer.ipython.org/url/norvig.com/ipython/Probability.ipynb). Python generators were replaced by Julia's coroutines. When dealing with\n",
"changing input types, I used Julia's multiple dispatch instead of checking for\n",
"types inside a function. Norvig's description and original text is only\n",
"changes when the results are slightly different is some simulations. *\n",
"\n",
"In this notebook, we cover the basics of probability theory, and show how to implement the theory in Julia. (You should have a little background in [probability](http://www.dartmouth.edu/~chance/teaching_aids/books_articles/probability_book/pdf.html) and [Julia](http://julialang.org/learning/).) Then we show how to solve some particularly perplexing paradoxical probability problems.\n",
"\n",
"Over 200 years ago, Pierre-Simon Laplace [wrote](https://en.wikipedia.org/wiki/Classical_definition_of_probability):\n",
"\n",
">The probability of an event is the ratio of the number of cases favorable to it, to the number of all cases possible, when [the cases are] equally possible. ... Probability is thus simply a fraction whose numerator is the number of favorable cases and whose denominator is the number of all the cases possible.\n",
"\n",
"Laplace really nailed it, way back then. If you want to untangle a probability problem (paradoxical or not), all you have to do is be methodical about defining exactly what the cases are, and then careful in counting the number of favorable and total cases. We'll start being methodical by defining terms:\n",
"\n",
"\n",
"- **[Experiment](https://en.wikipedia.org/wiki/Experiment_(probability_theory%29):**\n",
" An occurrence with an uncertain outcome that we can observe.\n",
" <br>*For example, rolling a die.*\n",
"- **[Outcome](https://en.wikipedia.org/wiki/Outcome_(probability%29):**\n",
" The result of an experiment; one particular state of the world. Synonym for \"case.\"\n",
" <br>*For example:* `6`.\n",
"- **[Sample Space](https://en.wikipedia.org/wiki/Sample_space):**\n",
" The set of all possible outcomes for the experiment. (For now, assume each outcome is equally likely.)\n",
" <br>*For example,* `{1, 2, 3, 4, 5, 6}`.\n",
"- **[Event](https://en.wikipedia.org/wiki/Event_(probability_theory%29):**\n",
" A subset of possible outcomes that together have some property we are interested in.\n",
" <br>*For example, the event \"even die roll\" is the set of outcomes* `{2, 4, 6}`. \n",
"- **[Probability](https://en.wikipedia.org/wiki/Probability_theory):**\n",
" The number of possible outcomes in the event divided by the number in the sample space.\n",
" <br>*For example, the probability of an even outcome from a six-sided die is* `|{2, 4, 6}| / |{1, 2, 3, 4, 5, 6}| = 3/6 = 1/2.`\n",
"\n",
"# Definition of `P` for Probability in Julia"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"\"The probability of an event, given a sample space of equiprobable outcomes.\"\n",
"P(event, space)=length(intersect(event,space))//length(space);"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Read this as *\"Probability is thus simply a fraction whose numerator is the number of favorable cases (outcomes in the intersection of the sample space and the event) and whose denominator is the number of all the cases possible (the sample space).\"* Note I use `//` rather than regular division because I want exact answers like 1/3, not 0.3333333333333333. \n",
"\n",
"# Warm-up Problem: Die Roll"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's consider the experiment of rolling a single six-sided fair die. We'll call the sample space `D`:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"D = [1, 2, 3, 4, 5, 6];"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"The probability of the event of \"*rolling an even number*\" can be calculated as follows:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//2"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"even = [2, 4, 6]\n",
"\n",
"P(even, D)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"But that's inelegant&mdash;I had to explicitly enumerate all the even numbers from one to six. If I ever wanted to deal with a different kind of die, say a twelve or twenty-sided die, I would have to go back and change the definition of `even`. I would prefer to define even numbers once and for all with a *predicate* (a function that returns True or False), if only `P` would accept that."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Revised Version of `P`, accepting a predicate for the event\n",
"\n",
"It would be great if we could specify an event as either a set of outcomes, or a predicate over outcomes. Let's make it so:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING: Method definition P(Any, Any) in module Main at In[1]:2 overwritten at In[4]:4.\n",
"WARNING: replacing docs for 'P :: Tuple{Any,Any}' in module 'Main'.\n"
]
}
],
"source": [
"\"\"\"The probability of an event, given a sample space of equiprobable outcomes.\n",
" event can be either a set of outcomes, or a predicate (true for outcomes in the event).\"\"\"\n",
"function P(event, space)\n",
" event_ = such_that(event, space)\n",
" length(intersect(event_,space))//length(space)\n",
"end\n",
"\n",
" #Making use of Julia's multiple dispatch\n",
"\"The subset of elements in the collection for which the predicate is true.\"\n",
"function such_that(predicate::Function, collection)\n",
" filter(predicate,collection)\n",
"end;\n",
"\"Default return for a collection\"\n",
"function such_that(event, collection)\n",
" event\n",
"end;"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"3-element Array{Int64,1}:\n",
" 2\n",
" 4\n",
" 6"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"even_p(n) = (n % 2 == 0)\n",
"\n",
"such_that(even_p, D)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//2"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(even_p, D)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"6-element Array{Int64,1}:\n",
" 2\n",
" 4\n",
" 6\n",
" 8\n",
" 10\n",
" 12"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"D12 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]\n",
"\n",
"such_that(even_p, D12)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//2"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(even_p, D12)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# The Two Child Paradoxes\n",
"\n",
"In 1959, [Martin Gardner]() [posed](https://en.wikipedia.org/wiki/Boy_or_Girl_paradox) these two problems:\n",
"\n",
"- **Problem 1.** Mr. Jones has two children. The older child is a boy. What is the\n",
"probability that both children are boys?\n",
"\n",
"- **Problem 2.** Mr. Smith has two children. At least one of them is a boy. What is\n",
"the probability that both children are boys? \n",
"\n",
"And in 2010, Gary Foshee added this one:\n",
"\n",
"- **Problem 3.** I have two children. At least one of them is a boy born on Tuesday. What is\n",
"the probability that both children are boys? \n",
"\n",
"Problems 2 and 3 are considered *paradoxes* because they have surprising answers that people\n",
"argue about. \n",
"\n",
"(*Note:* Assume equiprobable outcomes; don't worry that actually 51% of births are male, etc.)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"## Problem 1: Older child is a boy. What is the probability both are boys?\n",
"\n",
"We use `\"BG\"` to denote the outcome in which the older child is a boy and the younger a girl. The sample space, `S`, is:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"S = [\"BG\", \"BB\", \"GB\", \"GG\"];"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's define predicates for the conditions of having two boys, and of the older child being a boy:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"two_boys(outcome)= length(matchall(r\"B\", outcome)) == 2\n",
"\n",
"older_is_a_boy(outcome)= startswith(outcome,\"B\");"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now we can answer Problem 1:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//2"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(two_boys, such_that(older_is_a_boy, S))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"## Problem 2: At least one is a boy. What is the probability both are boys? \n",
"\n",
"Implementing this problem and finding the answer is easy:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"at_least_one_boy(outcome)= 'B' in outcome;"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//3"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(two_boys, such_that(at_least_one_boy, S))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Understanding the problem is tougher. Some people think the answer should be 1/2. Can we justify the answer 1/3? We can see there are three equiprobable outcomes in which there is at least one boy:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"3-element Array{String,1}:\n",
" \"BG\"\n",
" \"BB\"\n",
" \"GB\""
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"such_that(at_least_one_boy, S)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Of those three outcomes, only one has two boys, so the answer of 1/3 is indeed justified. \n",
"\n",
"But some people *still* think the answer should be 1/2.\n",
"Their reasoning is *\"If one child is a boy, then there are two equiprobable outcomes for the other child, so the probability that the other child is a boy, and thus that there are two boys, is 1/2.\"* \n",
"\n",
"When two methods of reasoning give two different answers, we have a [paradox](https://en.wikipedia.org/wiki/Paradox). Here are three responses to a paradox:\n",
"\n",
"1. The very fundamentals of mathematics must be incomplete, and this problem reveals it!\n",
"2. I'm right, and anyone who disagrees with me is an idiot!\n",
"3. I have the right answer for one interpretation of the problem, and you have the right answer\n",
"for a different interpretation of the problem.\n",
"\n",
"If you're [Bertrand Russell](https://en.wikipedia.org/wiki/Russell%27s_paradox) or [Georg Cantor](https://en.wikipedia.org/wiki/Cantor%27s_paradox), you might very well uncover a fundamental flaw in mathematics; for the rest of us, I recommend Response 3. When I believe the answer is 1/3, and I hear someone say the answer is 1/2, my response is *\"How interesting! They must have a different interpretation of the problem; I should try to discover what their interpretation is, and why their answer is correct.\"* First I explicitly describe my understanding of the experiment:\n",
"\n",
"- **Experiment 2a.** Mr. Smith is chosen at random from families with two children. He is asked if at least one of his children is a boy. He replies \"yes.\"\n",
"\n",
"Next I envision another possible interpretation of the experiment:\n",
"\n",
"- **Experiment 2b.** Mr. Smith is chosen at random from families with two children. He is observed at a time when he is accompanied by one of his children, chosen at random. The child is observed to be a boy. \n",
"\n",
"Experiment 2b needs a different sample space, which we will call `S2b`. It consists of 8 outcomes, not just 4; for each of the 4 outcomes in `S`, we have a choice of observing either the older child or the younger child. We will use the notation `'GB/g?'` to mean that the older child is a girl, the younger a boy, the older child was observed to be a girl, and the younger was not observed. The sample space is therefore:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"S2b = [\"BB/b?\", \"BB/?b\", \n",
" \"BG/b?\", \"BG/?g\", \n",
" \"GB/g?\", \"GB/?b\", \n",
" \"GG/g?\", \"GG/?g\"];"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now we can figure out the subset of this sample space in which we observe Mr. Smith with a boy:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"4-element Array{String,1}:\n",
" \"BB/b?\"\n",
" \"BB/?b\"\n",
" \"BG/b?\"\n",
" \"GB/?b\""
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"observed_boy(outcome)= 'b' in outcome\n",
"\n",
"such_that(observed_boy, S2b)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"And finally we can determine the probability that he has two boys, given that we observed him with a boy:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//2"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(two_boys, such_that(observed_boy, S2b))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"The paradox is resolved. Two reasonable people can have different interpretations of the problem, and can each reason flawlessly to reach different conclusions, 1/3 or 1/2. Which interpretation is \"better?\" We could debate that, or we could just agree to use unambiguous problem descriptions (that is, use the language of Experiment 2a or Experiment 2b, not the ambiguous language of Problem 2). \n",
"\n",
"\n",
"\n",
"## The Reasonable Person Principle\n",
"\n",
"It is an unfortunate fact of human nature that we often assume the other person is an idiot. As [George Carlin puts it](https://www.youtube.com/watch?v=XWPCE2tTLZQ) *\"Have you ever noticed when you're driving that anybody driving slower than you is an idiot, and anyone going faster than you is a maniac?\"*\n",
"\n",
"The assumption that other people are more likely to be **reasonable** rather than **idiots** is known as the **[reasonable person principle](http://www.cs.cmu.edu/~weigand/staff/)**. It is a guiding principle at Carnegie Mellon University's School of Computer Science, and is a principle I try to live by as well.\n",
"\n",
"Now let's return to an even more paradoxical problem.\n",
"\n",
"## Problem 3. One is a boy born on Tuesday. What's the probability both are boys?\n",
"\n",
"When Gary Foshee posed this problem, most people could not imagine how the boy's birth-day-of-week could be relevant, and felt the answer should be the same as Problem 2. But in order to tell for sure, we should clearly state what the experiment is, define the sample space, and calculate. First:\n",
"\n",
"- **Experiment 3a.** A parent is chosen at random from families with two children. She is asked if at least one of her children is a boy born on Tuesday. She replies \"yes.\"\n",
"\n",
"Next we'll define a sample space. We'll use the notation \"`G1B3`\" to mean the older child is a girl born on the first day of the week (Sunday) and the younger a boy born on the third day of the week (Tuesday). We'll call the resulting sample space `S3`."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"sexesdays = [\"$sex$day\" \n",
" for sex in \"GB\", \n",
" day in \"1234567\"]\n",
"\n",
"S3 = [\"$older$younger\" \n",
" for older in sexesdays, \n",
" younger in sexesdays];"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"String[\"B1B1\",\"B1B2\",\"B1B3\",\"B1B4\",\"B1B5\",\"B1B6\",\"B1B7\",\"B1G1\",\"B1G2\",\"B1G3\",\"B1G4\",\"B1G5\",\"B1G6\",\"B1G7\",\"B2B1\",\"B2B2\",\"B2B3\",\"B2B4\",\"B2B5\",\"B2B6\",\"B2B7\",\"B2G1\",\"B2G2\",\"B2G3\",\"B2G4\",\"B2G5\",\"B2G6\",\"B2G7\",\"B3B1\",\"B3B2\",\"B3B3\",\"B3B4\",\"B3B5\",\"B3B6\",\"B3B7\",\"B3G1\",\"B3G2\",\"B3G3\",\"B3G4\",\"B3G5\",\"B3G6\",\"B3G7\",\"B4B1\",\"B4B2\",\"B4B3\",\"B4B4\",\"B4B5\",\"B4B6\",\"B4B7\",\"B4G1\",\"B4G2\",\"B4G3\",\"B4G4\",\"B4G5\",\"B4G6\",\"B4G7\",\"B5B1\",\"B5B2\",\"B5B3\",\"B5B4\",\"B5B5\",\"B5B6\",\"B5B7\",\"B5G1\",\"B5G2\",\"B5G3\",\"B5G4\",\"B5G5\",\"B5G6\",\"B5G7\",\"B6B1\",\"B6B2\",\"B6B3\",\"B6B4\",\"B6B5\",\"B6B6\",\"B6B7\",\"B6G1\",\"B6G2\",\"B6G3\",\"B6G4\",\"B6G5\",\"B6G6\",\"B6G7\",\"B7B1\",\"B7B2\",\"B7B3\",\"B7B4\",\"B7B5\",\"B7B6\",\"B7B7\",\"B7G1\",\"B7G2\",\"B7G3\",\"B7G4\",\"B7G5\",\"B7G6\",\"B7G7\",\"G1B1\",\"G1B2\",\"G1B3\",\"G1B4\",\"G1B5\",\"G1B6\",\"G1B7\",\"G1G1\",\"G1G2\",\"G1G3\",\"G1G4\",\"G1G5\",\"G1G6\",\"G1G7\",\"G2B1\",\"G2B2\",\"G2B3\",\"G2B4\",\"G2B5\",\"G2B6\",\"G2B7\",\"G2G1\",\"G2G2\",\"G2G3\",\"G2G4\",\"G2G5\",\"G2G6\",\"G2G7\",\"G3B1\",\"G3B2\",\"G3B3\",\"G3B4\",\"G3B5\",\"G3B6\",\"G3B7\",\"G3G1\",\"G3G2\",\"G3G3\",\"G3G4\",\"G3G5\",\"G3G6\",\"G3G7\",\"G4B1\",\"G4B2\",\"G4B3\",\"G4B4\",\"G4B5\",\"G4B6\",\"G4B7\",\"G4G1\",\"G4G2\",\"G4G3\",\"G4G4\",\"G4G5\",\"G4G6\",\"G4G7\",\"G5B1\",\"G5B2\",\"G5B3\",\"G5B4\",\"G5B5\",\"G5B6\",\"G5B7\",\"G5G1\",\"G5G2\",\"G5G3\",\"G5G4\",\"G5G5\",\"G5G6\",\"G5G7\",\"G6B1\",\"G6B2\",\"G6B3\",\"G6B4\",\"G6B5\",\"G6B6\",\"G6B7\",\"G6G1\",\"G6G2\",\"G6G3\",\"G6G4\",\"G6G5\",\"G6G6\",\"G6G7\",\"G7B1\",\"G7B2\",\"G7B3\",\"G7B4\",\"G7B5\",\"G7B6\",\"G7B7\",\"G7G1\",\"G7G2\",\"G7G3\",\"G7G4\",\"G7G5\",\"G7G6\",\"G7G7\"]"
]
}
],
"source": [
"@assert length(S3) == (2*7)^2 == 196\n",
"\n",
"print(sort(vec(S3)))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"We determine below that the probability of having at least one boy is 3/4, both in `S3` and in `S`:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"3//4"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(at_least_one_boy, S3)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"3//4"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(at_least_one_boy, S)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"The probability of two boys is 1/4 in either sample space:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//4"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(two_boys, S3)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//4"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(two_boys, S)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"And the probability of two boys given at least one boy is 1/3 in either sample space:"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//3"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(two_boys, such_that(at_least_one_boy, S3))"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//3"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(two_boys, such_that(at_least_one_boy, S))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"We will define a predicate for the event of at least one boy born on Tuesday: "
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"at_least_one_boy_tues(outcome)= contains(outcome,\"B3\");"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"We are now ready to answer Problem 3:"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"13//27"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(two_boys, such_that(at_least_one_boy_tues, S3))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"13/27 is quite different from 1/3 (but rather close to 1/2). So \"at least one boy born on Tuesday\" is quite different from \"at least one boy.\" Are you surprised? Do you accept the answer, or do you think we did something wrong? Are there other interpretations of the experiment that lead to other answers?\n",
"\n",
"Here is one alternative interpretation:"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"- **Experiment 3b.** A parent is chosen at random from families with two children. She is observed at a time when she is accompanied by one of her children, chosen at random. The child is observed to be a boy who reports that his birth day is Tuesday.\n",
"\n",
"We can represent outcomes in this sample space with the notation `G1B3/??b3`, meaning the older child is a girl born on Sunday, the younger a boy born on Tuesday, the older was not observed, and the younger was."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"observed_boy_tues(outcome)= contains(outcome,\"b3\") \n",
"\n",
"S3b=[]\n",
"for children in S3\n",
" for i=1:2\n",
" first_observed=(i==1) ? lowercase(children)[1:2]*\"??\":\"??\"*lowercase(children)[3:4]\n",
" push!(S3b,\"$children/$first_observed\")\n",
" end\n",
"end"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now we can answer this version of problem 3:"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//2"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(two_boys, such_that(observed_boy_tues, S3b))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"So with the wording of Experiment 3b, the answer to problem 3 is the same as 2b.\n",
"\n",
"Still confused? Let's build a visualization tool to make things more concrete.\n",
"\n",
"# Visualization\n",
"\n",
"We'll display the results as a two dimensional table of outcomes, with each cell in the table is a color-coded outcome. A cell will be white if it does not satisfy the predicate we are working with; green if the outcome contains two boys; and yellow if it does satisfy the predicate, but does not have two boys. Every cell in a row has the same older child, and every cell in a column has the same younger child. Here's the code to display a table:"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"\"\"\"Display sample space in a table, color-coded: green if event and condition is true; \n",
" yellow if only condition is true; white otherwise.\"\"\"\n",
"function table(space, n=1, event=two_boys, condition=older_is_a_boy)\n",
" # n is the number of characters that make up the older child.\n",
" olders = sort(unique([outcome[1:n] for outcome in space]))\n",
" html= string(\"<table>\",\n",
" join([row(older, space, event, condition) for older in olders]),\n",
" \"</table>\", \n",
" P(event, such_that(condition, space)))\n",
" display(\"text/html\",html)\n",
"end\n",
"\n",
"\"Display a row where an older child is paired with each of the possible younger children.\"\n",
"function row(older, space, event, condition)\n",
" thisrow = sort(filter((x)->startswith(x,older),space))\n",
" string(\"<tr>\", join([cell(outcome, event, condition) for outcome in thisrow]),\"</tr>\")\n",
"end\n",
"\n",
"\"Display outcome in appropriate color.\"\n",
"function cell(outcome, event, condition)\n",
" color = (event(outcome) && condition(outcome))? \"lightgreen\": condition(outcome)? \"yellow\":\"ghostwhite\"\n",
" return \"<td style=\\\"background-color: $color\\\">$outcome</td>\" \n",
"end;"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"We can use this visualization tool to see that in Problem 1, there is one outcome with two boys (green) out of a total of two outcomes where the older is a boy (green and yellow) so the probability of two boys given that the older is a boy is 1/2."
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<table><tr><td style=\"background-color: lightgreen\">BB</td><td style=\"background-color: yellow\">BG</td></tr><tr><td style=\"background-color: ghostwhite\">GB</td><td style=\"background-color: ghostwhite\">GG</td></tr></table>1//2"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Problem 1\n",
"table(S, 1, two_boys, older_is_a_boy)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"For Problem 2, we see the probability of two boys (green) given at least one boy (green and yellow) is 1/3. "
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<table><tr><td style=\"background-color: lightgreen\">BB</td><td style=\"background-color: yellow\">BG</td></tr><tr><td style=\"background-color: yellow\">GB</td><td style=\"background-color: ghostwhite\">GG</td></tr></table>1//3"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Problem 2\n",
"table(S, 1, two_boys, at_least_one_boy)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"The answer is still 1/3 when we consider the day of the week of each birth. (We've just made each cell \"bigger\" by enumerating all the days-of-week.)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<table><tr><td style=\"background-color: lightgreen\">B1B1</td><td style=\"background-color: lightgreen\">B1B2</td><td style=\"background-color: lightgreen\">B1B3</td><td style=\"background-color: lightgreen\">B1B4</td><td style=\"background-color: lightgreen\">B1B5</td><td style=\"background-color: lightgreen\">B1B6</td><td style=\"background-color: lightgreen\">B1B7</td><td style=\"background-color: yellow\">B1G1</td><td style=\"background-color: yellow\">B1G2</td><td style=\"background-color: yellow\">B1G3</td><td style=\"background-color: yellow\">B1G4</td><td style=\"background-color: yellow\">B1G5</td><td style=\"background-color: yellow\">B1G6</td><td style=\"background-color: yellow\">B1G7</td></tr><tr><td style=\"background-color: lightgreen\">B2B1</td><td style=\"background-color: lightgreen\">B2B2</td><td style=\"background-color: lightgreen\">B2B3</td><td style=\"background-color: lightgreen\">B2B4</td><td style=\"background-color: lightgreen\">B2B5</td><td style=\"background-color: lightgreen\">B2B6</td><td style=\"background-color: lightgreen\">B2B7</td><td style=\"background-color: yellow\">B2G1</td><td style=\"background-color: yellow\">B2G2</td><td style=\"background-color: yellow\">B2G3</td><td style=\"background-color: yellow\">B2G4</td><td style=\"background-color: yellow\">B2G5</td><td style=\"background-color: yellow\">B2G6</td><td style=\"background-color: yellow\">B2G7</td></tr><tr><td style=\"background-color: lightgreen\">B3B1</td><td style=\"background-color: lightgreen\">B3B2</td><td style=\"background-color: lightgreen\">B3B3</td><td style=\"background-color: lightgreen\">B3B4</td><td style=\"background-color: lightgreen\">B3B5</td><td style=\"background-color: lightgreen\">B3B6</td><td style=\"background-color: lightgreen\">B3B7</td><td style=\"background-color: yellow\">B3G1</td><td style=\"background-color: yellow\">B3G2</td><td style=\"background-color: yellow\">B3G3</td><td style=\"background-color: yellow\">B3G4</td><td style=\"background-color: yellow\">B3G5</td><td style=\"background-color: yellow\">B3G6</td><td style=\"background-color: yellow\">B3G7</td></tr><tr><td style=\"background-color: lightgreen\">B4B1</td><td style=\"background-color: lightgreen\">B4B2</td><td style=\"background-color: lightgreen\">B4B3</td><td style=\"background-color: lightgreen\">B4B4</td><td style=\"background-color: lightgreen\">B4B5</td><td style=\"background-color: lightgreen\">B4B6</td><td style=\"background-color: lightgreen\">B4B7</td><td style=\"background-color: yellow\">B4G1</td><td style=\"background-color: yellow\">B4G2</td><td style=\"background-color: yellow\">B4G3</td><td style=\"background-color: yellow\">B4G4</td><td style=\"background-color: yellow\">B4G5</td><td style=\"background-color: yellow\">B4G6</td><td style=\"background-color: yellow\">B4G7</td></tr><tr><td style=\"background-color: lightgreen\">B5B1</td><td style=\"background-color: lightgreen\">B5B2</td><td style=\"background-color: lightgreen\">B5B3</td><td style=\"background-color: lightgreen\">B5B4</td><td style=\"background-color: lightgreen\">B5B5</td><td style=\"background-color: lightgreen\">B5B6</td><td style=\"background-color: lightgreen\">B5B7</td><td style=\"background-color: yellow\">B5G1</td><td style=\"background-color: yellow\">B5G2</td><td style=\"background-color: yellow\">B5G3</td><td style=\"background-color: yellow\">B5G4</td><td style=\"background-color: yellow\">B5G5</td><td style=\"background-color: yellow\">B5G6</td><td style=\"background-color: yellow\">B5G7</td></tr><tr><td style=\"background-color: lightgreen\">B6B1</td><td style=\"background-color: lightgreen\">B6B2</td><td style=\"background-color: lightgreen\">B6B3</td><td style=\"background-color: lightgreen\">B6B4</td><td style=\"background-color: lightgreen\">B6B5</td><td style=\"background-color: lightgreen\">B6B6</td><td style=\"background-color: lightgreen\">B6B7</td><td style=\"background-color: yellow\">B6G1</td><td style=\"background-color: yellow\">B6G2</td><td style=\"background-color: yellow\">B6G3</td><td style=\"background-color: yellow\">B6G4</td><td style=\"background-color: yellow\">B6G5</td><td style=\"background-color: yellow\">B6G6</td><td style=\"background-color: yellow\">B6G7</td></tr><tr><td style=\"background-color: lightgreen\">B7B1</td><td style=\"background-color: lightgreen\">B7B2</td><td style=\"background-color: lightgreen\">B7B3</td><td style=\"background-color: lightgreen\">B7B4</td><td style=\"background-color: lightgreen\">B7B5</td><td style=\"background-color: lightgreen\">B7B6</td><td style=\"background-color: lightgreen\">B7B7</td><td style=\"background-color: yellow\">B7G1</td><td style=\"background-color: yellow\">B7G2</td><td style=\"background-color: yellow\">B7G3</td><td style=\"background-color: yellow\">B7G4</td><td style=\"background-color: yellow\">B7G5</td><td style=\"background-color: yellow\">B7G6</td><td style=\"background-color: yellow\">B7G7</td></tr><tr><td style=\"background-color: yellow\">G1B1</td><td style=\"background-color: yellow\">G1B2</td><td style=\"background-color: yellow\">G1B3</td><td style=\"background-color: yellow\">G1B4</td><td style=\"background-color: yellow\">G1B5</td><td style=\"background-color: yellow\">G1B6</td><td style=\"background-color: yellow\">G1B7</td><td style=\"background-color: ghostwhite\">G1G1</td><td style=\"background-color: ghostwhite\">G1G2</td><td style=\"background-color: ghostwhite\">G1G3</td><td style=\"background-color: ghostwhite\">G1G4</td><td style=\"background-color: ghostwhite\">G1G5</td><td style=\"background-color: ghostwhite\">G1G6</td><td style=\"background-color: ghostwhite\">G1G7</td></tr><tr><td style=\"background-color: yellow\">G2B1</td><td style=\"background-color: yellow\">G2B2</td><td style=\"background-color: yellow\">G2B3</td><td style=\"background-color: yellow\">G2B4</td><td style=\"background-color: yellow\">G2B5</td><td style=\"background-color: yellow\">G2B6</td><td style=\"background-color: yellow\">G2B7</td><td style=\"background-color: ghostwhite\">G2G1</td><td style=\"background-color: ghostwhite\">G2G2</td><td style=\"background-color: ghostwhite\">G2G3</td><td style=\"background-color: ghostwhite\">G2G4</td><td style=\"background-color: ghostwhite\">G2G5</td><td style=\"background-color: ghostwhite\">G2G6</td><td style=\"background-color: ghostwhite\">G2G7</td></tr><tr><td style=\"background-color: yellow\">G3B1</td><td style=\"background-color: yellow\">G3B2</td><td style=\"background-color: yellow\">G3B3</td><td style=\"background-color: yellow\">G3B4</td><td style=\"background-color: yellow\">G3B5</td><td style=\"background-color: yellow\">G3B6</td><td style=\"background-color: yellow\">G3B7</td><td style=\"background-color: ghostwhite\">G3G1</td><td style=\"background-color: ghostwhite\">G3G2</td><td style=\"background-color: ghostwhite\">G3G3</td><td style=\"background-color: ghostwhite\">G3G4</td><td style=\"background-color: ghostwhite\">G3G5</td><td style=\"background-color: ghostwhite\">G3G6</td><td style=\"background-color: ghostwhite\">G3G7</td></tr><tr><td style=\"background-color: yellow\">G4B1</td><td style=\"background-color: yellow\">G4B2</td><td style=\"background-color: yellow\">G4B3</td><td style=\"background-color: yellow\">G4B4</td><td style=\"background-color: yellow\">G4B5</td><td style=\"background-color: yellow\">G4B6</td><td style=\"background-color: yellow\">G4B7</td><td style=\"background-color: ghostwhite\">G4G1</td><td style=\"background-color: ghostwhite\">G4G2</td><td style=\"background-color: ghostwhite\">G4G3</td><td style=\"background-color: ghostwhite\">G4G4</td><td style=\"background-color: ghostwhite\">G4G5</td><td style=\"background-color: ghostwhite\">G4G6</td><td style=\"background-color: ghostwhite\">G4G7</td></tr><tr><td style=\"background-color: yellow\">G5B1</td><td style=\"background-color: yellow\">G5B2</td><td style=\"background-color: yellow\">G5B3</td><td style=\"background-color: yellow\">G5B4</td><td style=\"background-color: yellow\">G5B5</td><td style=\"background-color: yellow\">G5B6</td><td style=\"background-color: yellow\">G5B7</td><td style=\"background-color: ghostwhite\">G5G1</td><td style=\"background-color: ghostwhite\">G5G2</td><td style=\"background-color: ghostwhite\">G5G3</td><td style=\"background-color: ghostwhite\">G5G4</td><td style=\"background-color: ghostwhite\">G5G5</td><td style=\"background-color: ghostwhite\">G5G6</td><td style=\"background-color: ghostwhite\">G5G7</td></tr><tr><td style=\"background-color: yellow\">G6B1</td><td style=\"background-color: yellow\">G6B2</td><td style=\"background-color: yellow\">G6B3</td><td style=\"background-color: yellow\">G6B4</td><td style=\"background-color: yellow\">G6B5</td><td style=\"background-color: yellow\">G6B6</td><td style=\"background-color: yellow\">G6B7</td><td style=\"background-color: ghostwhite\">G6G1</td><td style=\"background-color: ghostwhite\">G6G2</td><td style=\"background-color: ghostwhite\">G6G3</td><td style=\"background-color: ghostwhite\">G6G4</td><td style=\"background-color: ghostwhite\">G6G5</td><td style=\"background-color: ghostwhite\">G6G6</td><td style=\"background-color: ghostwhite\">G6G7</td></tr><tr><td style=\"background-color: yellow\">G7B1</td><td style=\"background-color: yellow\">G7B2</td><td style=\"background-color: yellow\">G7B3</td><td style=\"background-color: yellow\">G7B4</td><td style=\"background-color: yellow\">G7B5</td><td style=\"background-color: yellow\">G7B6</td><td style=\"background-color: yellow\">G7B7</td><td style=\"background-color: ghostwhite\">G7G1</td><td style=\"background-color: ghostwhite\">G7G2</td><td style=\"background-color: ghostwhite\">G7G3</td><td style=\"background-color: ghostwhite\">G7G4</td><td style=\"background-color: ghostwhite\">G7G5</td><td style=\"background-color: ghostwhite\">G7G6</td><td style=\"background-color: ghostwhite\">G7G7</td></tr></table>1//3"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Problem 2\n",
"table(S3, 2, two_boys, at_least_one_boy)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"\n",
"\n",
"Now for the paradox of Problem 3:"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<table><tr><td style=\"background-color: ghostwhite\">B1B1</td><td style=\"background-color: ghostwhite\">B1B2</td><td style=\"background-color: lightgreen\">B1B3</td><td style=\"background-color: ghostwhite\">B1B4</td><td style=\"background-color: ghostwhite\">B1B5</td><td style=\"background-color: ghostwhite\">B1B6</td><td style=\"background-color: ghostwhite\">B1B7</td><td style=\"background-color: ghostwhite\">B1G1</td><td style=\"background-color: ghostwhite\">B1G2</td><td style=\"background-color: ghostwhite\">B1G3</td><td style=\"background-color: ghostwhite\">B1G4</td><td style=\"background-color: ghostwhite\">B1G5</td><td style=\"background-color: ghostwhite\">B1G6</td><td style=\"background-color: ghostwhite\">B1G7</td></tr><tr><td style=\"background-color: ghostwhite\">B2B1</td><td style=\"background-color: ghostwhite\">B2B2</td><td style=\"background-color: lightgreen\">B2B3</td><td style=\"background-color: ghostwhite\">B2B4</td><td style=\"background-color: ghostwhite\">B2B5</td><td style=\"background-color: ghostwhite\">B2B6</td><td style=\"background-color: ghostwhite\">B2B7</td><td style=\"background-color: ghostwhite\">B2G1</td><td style=\"background-color: ghostwhite\">B2G2</td><td style=\"background-color: ghostwhite\">B2G3</td><td style=\"background-color: ghostwhite\">B2G4</td><td style=\"background-color: ghostwhite\">B2G5</td><td style=\"background-color: ghostwhite\">B2G6</td><td style=\"background-color: ghostwhite\">B2G7</td></tr><tr><td style=\"background-color: lightgreen\">B3B1</td><td style=\"background-color: lightgreen\">B3B2</td><td style=\"background-color: lightgreen\">B3B3</td><td style=\"background-color: lightgreen\">B3B4</td><td style=\"background-color: lightgreen\">B3B5</td><td style=\"background-color: lightgreen\">B3B6</td><td style=\"background-color: lightgreen\">B3B7</td><td style=\"background-color: yellow\">B3G1</td><td style=\"background-color: yellow\">B3G2</td><td style=\"background-color: yellow\">B3G3</td><td style=\"background-color: yellow\">B3G4</td><td style=\"background-color: yellow\">B3G5</td><td style=\"background-color: yellow\">B3G6</td><td style=\"background-color: yellow\">B3G7</td></tr><tr><td style=\"background-color: ghostwhite\">B4B1</td><td style=\"background-color: ghostwhite\">B4B2</td><td style=\"background-color: lightgreen\">B4B3</td><td style=\"background-color: ghostwhite\">B4B4</td><td style=\"background-color: ghostwhite\">B4B5</td><td style=\"background-color: ghostwhite\">B4B6</td><td style=\"background-color: ghostwhite\">B4B7</td><td style=\"background-color: ghostwhite\">B4G1</td><td style=\"background-color: ghostwhite\">B4G2</td><td style=\"background-color: ghostwhite\">B4G3</td><td style=\"background-color: ghostwhite\">B4G4</td><td style=\"background-color: ghostwhite\">B4G5</td><td style=\"background-color: ghostwhite\">B4G6</td><td style=\"background-color: ghostwhite\">B4G7</td></tr><tr><td style=\"background-color: ghostwhite\">B5B1</td><td style=\"background-color: ghostwhite\">B5B2</td><td style=\"background-color: lightgreen\">B5B3</td><td style=\"background-color: ghostwhite\">B5B4</td><td style=\"background-color: ghostwhite\">B5B5</td><td style=\"background-color: ghostwhite\">B5B6</td><td style=\"background-color: ghostwhite\">B5B7</td><td style=\"background-color: ghostwhite\">B5G1</td><td style=\"background-color: ghostwhite\">B5G2</td><td style=\"background-color: ghostwhite\">B5G3</td><td style=\"background-color: ghostwhite\">B5G4</td><td style=\"background-color: ghostwhite\">B5G5</td><td style=\"background-color: ghostwhite\">B5G6</td><td style=\"background-color: ghostwhite\">B5G7</td></tr><tr><td style=\"background-color: ghostwhite\">B6B1</td><td style=\"background-color: ghostwhite\">B6B2</td><td style=\"background-color: lightgreen\">B6B3</td><td style=\"background-color: ghostwhite\">B6B4</td><td style=\"background-color: ghostwhite\">B6B5</td><td style=\"background-color: ghostwhite\">B6B6</td><td style=\"background-color: ghostwhite\">B6B7</td><td style=\"background-color: ghostwhite\">B6G1</td><td style=\"background-color: ghostwhite\">B6G2</td><td style=\"background-color: ghostwhite\">B6G3</td><td style=\"background-color: ghostwhite\">B6G4</td><td style=\"background-color: ghostwhite\">B6G5</td><td style=\"background-color: ghostwhite\">B6G6</td><td style=\"background-color: ghostwhite\">B6G7</td></tr><tr><td style=\"background-color: ghostwhite\">B7B1</td><td style=\"background-color: ghostwhite\">B7B2</td><td style=\"background-color: lightgreen\">B7B3</td><td style=\"background-color: ghostwhite\">B7B4</td><td style=\"background-color: ghostwhite\">B7B5</td><td style=\"background-color: ghostwhite\">B7B6</td><td style=\"background-color: ghostwhite\">B7B7</td><td style=\"background-color: ghostwhite\">B7G1</td><td style=\"background-color: ghostwhite\">B7G2</td><td style=\"background-color: ghostwhite\">B7G3</td><td style=\"background-color: ghostwhite\">B7G4</td><td style=\"background-color: ghostwhite\">B7G5</td><td style=\"background-color: ghostwhite\">B7G6</td><td style=\"background-color: ghostwhite\">B7G7</td></tr><tr><td style=\"background-color: ghostwhite\">G1B1</td><td style=\"background-color: ghostwhite\">G1B2</td><td style=\"background-color: yellow\">G1B3</td><td style=\"background-color: ghostwhite\">G1B4</td><td style=\"background-color: ghostwhite\">G1B5</td><td style=\"background-color: ghostwhite\">G1B6</td><td style=\"background-color: ghostwhite\">G1B7</td><td style=\"background-color: ghostwhite\">G1G1</td><td style=\"background-color: ghostwhite\">G1G2</td><td style=\"background-color: ghostwhite\">G1G3</td><td style=\"background-color: ghostwhite\">G1G4</td><td style=\"background-color: ghostwhite\">G1G5</td><td style=\"background-color: ghostwhite\">G1G6</td><td style=\"background-color: ghostwhite\">G1G7</td></tr><tr><td style=\"background-color: ghostwhite\">G2B1</td><td style=\"background-color: ghostwhite\">G2B2</td><td style=\"background-color: yellow\">G2B3</td><td style=\"background-color: ghostwhite\">G2B4</td><td style=\"background-color: ghostwhite\">G2B5</td><td style=\"background-color: ghostwhite\">G2B6</td><td style=\"background-color: ghostwhite\">G2B7</td><td style=\"background-color: ghostwhite\">G2G1</td><td style=\"background-color: ghostwhite\">G2G2</td><td style=\"background-color: ghostwhite\">G2G3</td><td style=\"background-color: ghostwhite\">G2G4</td><td style=\"background-color: ghostwhite\">G2G5</td><td style=\"background-color: ghostwhite\">G2G6</td><td style=\"background-color: ghostwhite\">G2G7</td></tr><tr><td style=\"background-color: ghostwhite\">G3B1</td><td style=\"background-color: ghostwhite\">G3B2</td><td style=\"background-color: yellow\">G3B3</td><td style=\"background-color: ghostwhite\">G3B4</td><td style=\"background-color: ghostwhite\">G3B5</td><td style=\"background-color: ghostwhite\">G3B6</td><td style=\"background-color: ghostwhite\">G3B7</td><td style=\"background-color: ghostwhite\">G3G1</td><td style=\"background-color: ghostwhite\">G3G2</td><td style=\"background-color: ghostwhite\">G3G3</td><td style=\"background-color: ghostwhite\">G3G4</td><td style=\"background-color: ghostwhite\">G3G5</td><td style=\"background-color: ghostwhite\">G3G6</td><td style=\"background-color: ghostwhite\">G3G7</td></tr><tr><td style=\"background-color: ghostwhite\">G4B1</td><td style=\"background-color: ghostwhite\">G4B2</td><td style=\"background-color: yellow\">G4B3</td><td style=\"background-color: ghostwhite\">G4B4</td><td style=\"background-color: ghostwhite\">G4B5</td><td style=\"background-color: ghostwhite\">G4B6</td><td style=\"background-color: ghostwhite\">G4B7</td><td style=\"background-color: ghostwhite\">G4G1</td><td style=\"background-color: ghostwhite\">G4G2</td><td style=\"background-color: ghostwhite\">G4G3</td><td style=\"background-color: ghostwhite\">G4G4</td><td style=\"background-color: ghostwhite\">G4G5</td><td style=\"background-color: ghostwhite\">G4G6</td><td style=\"background-color: ghostwhite\">G4G7</td></tr><tr><td style=\"background-color: ghostwhite\">G5B1</td><td style=\"background-color: ghostwhite\">G5B2</td><td style=\"background-color: yellow\">G5B3</td><td style=\"background-color: ghostwhite\">G5B4</td><td style=\"background-color: ghostwhite\">G5B5</td><td style=\"background-color: ghostwhite\">G5B6</td><td style=\"background-color: ghostwhite\">G5B7</td><td style=\"background-color: ghostwhite\">G5G1</td><td style=\"background-color: ghostwhite\">G5G2</td><td style=\"background-color: ghostwhite\">G5G3</td><td style=\"background-color: ghostwhite\">G5G4</td><td style=\"background-color: ghostwhite\">G5G5</td><td style=\"background-color: ghostwhite\">G5G6</td><td style=\"background-color: ghostwhite\">G5G7</td></tr><tr><td style=\"background-color: ghostwhite\">G6B1</td><td style=\"background-color: ghostwhite\">G6B2</td><td style=\"background-color: yellow\">G6B3</td><td style=\"background-color: ghostwhite\">G6B4</td><td style=\"background-color: ghostwhite\">G6B5</td><td style=\"background-color: ghostwhite\">G6B6</td><td style=\"background-color: ghostwhite\">G6B7</td><td style=\"background-color: ghostwhite\">G6G1</td><td style=\"background-color: ghostwhite\">G6G2</td><td style=\"background-color: ghostwhite\">G6G3</td><td style=\"background-color: ghostwhite\">G6G4</td><td style=\"background-color: ghostwhite\">G6G5</td><td style=\"background-color: ghostwhite\">G6G6</td><td style=\"background-color: ghostwhite\">G6G7</td></tr><tr><td style=\"background-color: ghostwhite\">G7B1</td><td style=\"background-color: ghostwhite\">G7B2</td><td style=\"background-color: yellow\">G7B3</td><td style=\"background-color: ghostwhite\">G7B4</td><td style=\"background-color: ghostwhite\">G7B5</td><td style=\"background-color: ghostwhite\">G7B6</td><td style=\"background-color: ghostwhite\">G7B7</td><td style=\"background-color: ghostwhite\">G7G1</td><td style=\"background-color: ghostwhite\">G7G2</td><td style=\"background-color: ghostwhite\">G7G3</td><td style=\"background-color: ghostwhite\">G7G4</td><td style=\"background-color: ghostwhite\">G7G5</td><td style=\"background-color: ghostwhite\">G7G6</td><td style=\"background-color: ghostwhite\">G7G7</td></tr></table>13//27"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Problem 3\n",
"table(S3, 2, two_boys, at_least_one_boy_tues)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"We see there are 27 relevant outcomes, of which 13 are green. So 13/27 really does seem to be the right answer. This picture also gives us a way to think about why the answer is not 1/3. Think of the yellow-plus-green area as a horizontal stripe and a vertical stripe, with an overlap. Each stripe is half yellow and half green, so if there were no overlap at all, the probability of green would be 1/2. When each stripe takes up half the sample space and the overlap is maximal, the probability is 1/3. And in the Problem 3 table, where the overlap is small, the probability is close to 1/2 (but slightly smaller).\n",
"\n",
"One way to look at it is that if I tell you very specific information (such as a boy born on Tuesday), it is unlikely that this applies to both children, so we have smaller overlap and a probability closer to 1/2, but if I give you broad information (a boy), this is more likely to apply to either child, resulting in a larger overlap, and a probability closer to 1/3.\n",
"\n",
"You can read some more discussions of the problem by (in alphabetical order) \n",
"[Alex Bellos](https://www.newscientist.com/article/dn18950-magic-numbers-a-meeting-of-mathemagical-tricksters?full=true),\n",
"[Alexander Bogomolny](http://www.cut-the-knot.org/Probability/BearBornOnTuesday.shtml),\n",
"[Andrew Gelman](http://andrewgelman.com/2010/05/27/hype_about_cond/),\n",
"[David Bigelow](https://web.viu.ca/bigelow2/Problem%201127%20Solution.pdf),\n",
"[Julie Rehmeyer](https://www.sciencenews.org/article/when-intuition-and-math-probably-look-wrong),\n",
"[Keith Devlin](https://www.maa.org/external_archive/devlin/devlin_05_10.html),\n",
"[Peter Lynch](http://mathsci.ucd.ie/~plynch/Publications/BIMS-TwoChildParadox.pdf),\n",
"[Tanya Khovanova](http://arxiv.org/pdf/1102.0173v1.pdf),\n",
"and\n",
"[Wendy Taylor &amp; Kaye Stacey](http://www.aamt.edu.au/Journals/Sample-articles/amt70_2_taylor.pdf)."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# The Sleeping Beauty Paradox\n",
"\n",
"The [Sleeping Beauty Paradox](https://en.wikipedia.org/wiki/Sleeping_Beauty_problem) is another tricky one:\n",
"\n",
">Sleeping Beauty volunteers to undergo the following experiment and is told all of the following details: On Sunday she will be put to sleep. Once or twice, during the experiment, Beauty will be awakened, interviewed, and put back to sleep with an amnesia-inducing drug that makes her forget that awakening. A fair coin will be tossed to determine which experimental procedure to undertake: if the coin comes up heads, Beauty will be awakened and interviewed on Monday only. If the coin comes up tails, she will be awakened and interviewed on Monday and Tuesday. In either case, she will be awakened on Wednesday without interview and the experiment ends.\n",
"Any time Sleeping Beauty is awakened and interviewed, she is asked, \"What is your belief now for the proposition that the coin landed heads?\"\n",
"\n",
"What should Sleeping Beauty say when she is interviewed? First, she should define the sample space. She could use the notation `\"heads/Monday/interviewed\"` to mean the outcome where the coin flip was heads, it is Monday, and she is interviewed. So it seems there are 4 equiprobable outcomes:"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"B = [\"heads/Monday/interviewed\", \"heads/Tuesday/sleep\",\n",
" \"tails/Monday/interviewed\", \"tails/Tuesday/interviewed\"];"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"At this point, you're probably expecting me to define predicates, like this:\n",
"\n",
" heads(outcome)= contains(outcome,\"heads\")\n",
" interviewed(outcome) = contains(outcome,\"interviewed\")\n",
" \n",
"We've seen a lot of predicates like this. I think it is time to heed the \"[don't repeat yourself](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)\" principle, so I will define a predicate-defining function:"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"\"Return a predicate that is true of all outcomes that have 'property' as a substring.\"\n",
"T(property)=(outcome)-> contains(outcome,property);"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now we can get the answer:"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//3"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"heads = T(\"heads\")\n",
"interviewed = T(\"interviewed\")\n",
"\n",
"P(heads, such_that(interviewed, B))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"(Note I could have done that in one line instead of three: `P(T(\"heads\"), such_that(T(\"interviewed\"), B))`, but that's kind of ugly.)\n",
"\n",
"This problem is considered a paradox because there are people who argue that the answer should be 1/2, not 1/3. I admit I'm having difficulty coming up with a sample space that supports the \"halfer\" position. I do know of a question that has the answer 1/2:"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//2"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(heads, B) "
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"But that seems like the wrong question; we want the probability of heads given that Sleeping Beauty was interviewed, not the unconditional probability. \n",
"\n",
"The \"halfers\" argue that before Sleeping Beauty goes to sleep, her unconditional probability for heads should be 1/2. When she is interviewed, she doesn't know anything more than before she went to sleep, so nothing has changed, so the probability of heads should still be 1/2. I find two flaws with this argument. First, if you want to convince me, show me a sample space; don't just make philosophical arguments. (Although a philosophical argument can be employed to help you define the right sample space.) Second, while I agree that before she goes to sleep, Beauty's *unconditional* probability for heads should be 1/2, I would say that both before she goes to sleep and when she is awakened, her *conditional* probability of heads *given that she is being interviewed* should be 1/3, as shown by the sample space."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# The Monty Hall Paradox\n",
"\n",
"[This](https://en.wikipedia.org/wiki/Monty_Hall_problem) is one of the most famous probability paradoxes. It can be stated as follows:\n",
"\n",
"> Suppose you're on a game show, and you're given the choice of three doors: Behind one door is a car; behind the others, goats. You pick a door, say No. 1, and the host, who knows what's behind the doors, opens another door, say No. 3, which has a goat. He then says to you, \"Do you want to pick door No. 2?\" Is it to your advantage to switch your choice?\n",
"\n",
"Much has been written about this problem, but to solve it all we have to do is be careful about how we understand the problem, and about defining our sample space. I will define outcomes of the form `\"Car1<Pick1/Open2\"`, which means\n",
"* \"Car1\": First the car is randomly placed behind door 1.\n",
"* \"<\": The host randomly commits to the strategy of opening the lowest-numbered allowable door. A door is allowable if it does not contain the car and was not picked by the contestant. Alternatively, the host could have chosen to open the highest-numbered allowable door (\">\").\n",
"(If you don't like the idea of the host commiting to a strategy, try this: the host mentally flips a coin to decide which door to open; include `\"/Head/\"` or `\"/Tail/\"` instead of `\"<\"` or `\">\"` in the description of the outcome.)\n",
"* `Pick1`: The contestant picks door 1. Our sample space will only consider cases where the contestant picks door 1, but by symmetry, the same arguments could be used if the contestant picked door 2 or 3.\n",
"* `Open2`: After hearing the contestant's choice, and following the strategy, the host opens a door; in this case door 2.\n",
"\n",
"We can see that the sample space has 6 equiprobable outcomes:"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"M = [\"Car1<Pick1/Open2\", \"Car1>Pick1/Open3\",\n",
" \"Car2<Pick1/Open3\", \"Car2>Pick1/Open3\",\n",
" \"Car3<Pick1/Open2\", \"Car3>Pick1/Open2\"];"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now, assuming the contestant picks door 1 and the host opens door 3, what is the probability that the car is behind door 1? Or door 2?"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//3"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(T(\"Car1\"), such_that(T(\"Open3\"), M))"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"2//3"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(T(\"Car2\"), such_that(T(\"Open3\"), M))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"We see that the strategy of **switching** from door 1 to door 2 will win the car 2/3 of the time, whereas the strategy of **sticking** with the original pick wins the car only 1/3 of the time. So if you like cars more than goats, you should switch. But don't feel bad if you got this one wrong; it turns out that Monty Hall himself, who opened numerous doors while hosting *Let's Make a Deal* for 13 years, didn't know the answer either, as revealed in this letter from Monty to statistician Lawrence Denenberg, when Denenberg asked for permission to use the problem in his textbook:\n",
"<img src=\"http://norvig.com/monty-hall-letter.jpg\">\n",
"\n",
"If you were Denenberg, how would you answer Monty, in non-mathematical terms. I would try something like this:\n",
"\n",
"> When the contestant makes her initial pick, she has 1/3 chance of picking the car, and there is a 2/3 chance the car is behind one of the other doors. That's still true after you open a door, but now the 2/3 chance for *either* other door becomes concentrated as 2/3 behind *one* other door, so the contestant should switch.\n",
"\n",
"But that argument was not persuasive to everyone. [Marilyn vos Savant](http://marilynvossavant.com/game-show-problem/) reports that many of her readers (including, she is pleased to point out, many Ph.D.s) still insist the answer is that it doesn't matter if the contestant switches; the odds are 1/2 either way. Let's try to discover what problem and what sample space those people are dealing with. Perhaps they are reasoning like this:\n",
"\n",
"They define outcomes of the form `\"Car1/Pick1/Open2/Goat\"`, which means:\n",
"* `Car1`: First the car is randomly placed behind door 1.\n",
"* `Pick1`: The contestant picks door 1. \n",
"* `Open2`: The host opens one of the two other doors at random (so the host might open the door with the car).\n",
"* `Goat`: We observe there is a goat behind door 2.\n",
"\n",
"Under this interpretation, the sample space is:"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"M2 = [\"Car1/Pick1/Open2/Goat\", \"Car1/Pick1/Open3/Goat\",\n",
" \"Car2/Pick1/Open2/Car\", \"Car2/Pick1/Open3/Goat\",\n",
" \"Car3/Pick1/Open2/Goat\", \"Car3/Pick1/Open3/Car\"];"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"And we can calculate the probability of the car being behind each door, given that the contestant picks door 1 and the host opens door 3 to reveal a goat:"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//2"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(T(\"Car1\"), such_that(T(\"Open3/Goat\"), M2))"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//2"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P(T(\"Car2\"), such_that(T(\"Open3/Goat\"), M2))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"So we see that under this interpretation it doesn't matter if you switch or not. \n",
"\n",
"Is this a valid interpretation? I agree that the wording of the problem can be seen as being ambiguous. However, this interpretation has a serious problem: in all the history of *Let's Make a Deal*, it was never the case that the host opened up a door with the car (or other grand prize). This strongly suggests (but does not quite prove) that `M` and not `M2` is the correct sample space."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Non-Equiprobable Outcomes: Probability Distributions\n",
"\n",
"So far, we have made the assumption that every outcome in a sample space is equally likely. In real life, the probability of a child being a girl (or boy) is not exactly 1/2 and the sex of a second child is not completely independent from the first. An [article](http://people.kzoo.edu/barth/math105/moreboys.pdf) gives the following counts for two-child families in Denmark:\n",
"\n",
" GG: 121801 GB: 126840\n",
" BG: 127123 BB: 135138\n",
" \n",
"We call this mapping from outcomes to their frequencies a *distribution*. Here are two more definitions:\n",
"\n",
"* [Distribution](http://mathworld.wolfram.com/StatisticalDistribution.html): An assignment of frequencies to every outcome in a sample space. \n",
"\n",
"* [Probability Distribution](https://en.wikipedia.org/wiki/Probability_distribution): A distribution that has been *normalized* so that the sum of the frequencies is 1 (and each frequency is between 0 and 1).\n",
"\n",
"We can implement distributions as `Dict`s with this code:"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"ProbDist=Dict\n",
"\n",
"\"Probability Distribution\"\n",
"probdist(;entries...)= return normalize(Dict(entries))\n",
"\n",
"\"Given a distribution dict, return a version where the values are normalized to sum to 1.\"\n",
"function normalize(dist)\n",
" total = sum(values(dist))\n",
" return Dict(string(e) => dist[e] / total \n",
" for e in keys(dist))\n",
"end;"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"Dict{String,Float64} with 4 entries:\n",
" \"BB\" => 0.264509\n",
" \"BG\" => 0.248821\n",
" \"GG\" => 0.238404\n",
" \"GB\" => 0.248267"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"DK = probdist(GG=121801, GB=126840,\n",
" BG=127123, BB=135138)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now we need to modify the functions `P` and `such_that` to accept either a sample space or a probability distribution:"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"\"\"\"The probability of an event, given a sample space of equiprobable outcomes. \n",
" event: a collection of outcomes, or a predicate that is true of outcomes in the event. \n",
" space: a set of outcomes or a probability distribution of {outcome: frequency} pairs.\"\"\"\n",
"function P(event::Function, space::ProbDist)\n",
" event_ = such_that(event, space)\n",
" return sum([space[v] for v in collect(filter(e-> event(e), keys(space)))])\n",
"end\n",
"function P(event, space::ProbDist)\n",
" return sum([space[v] for v in collect(filter(e-> e in event, keys(space)))])\n",
"end\n",
"\n",
"\"\"\"The elements in the space for which the predicate is true.\n",
" If space is a set, return a subset {element,...};\n",
" if space is a dict, return a sub-dict of {element: frequency,...} pairs;\n",
" in both cases only with elements where predicate(element) is true.\"\"\"\n",
"function such_that(predicate::Function, space::ProbDist)\n",
" return normalize(Dict(e=>space[e] for e in filter(predicate,keys(space))))\n",
"end;"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"First, let's verify that it still works on the old problems where the sample space is a set:"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//2"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Problem 1 in S\n",
"P(two_boys, such_that(older_is_a_boy, S))"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1//3"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Problem 2 in S\n",
"P(two_boys, such_that(at_least_one_boy, S))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now let's see if the definitions work with the probability distribution `DK`. We expect a little over 1/2 for Problem 1, and a little over 1/3 for problem 2:"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"0.5152805792702689"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Problem 1 in DK\n",
"P(two_boys, such_that(older_is_a_boy, DK))"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"0.34730828242538575"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Problem 2 in DK\n",
"P(two_boys, such_that(at_least_one_boy, DK))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"It all looks good. Now let's try a new problem that would not have been feasible with a set-based sample space.\n",
"\n",
"## Problem 4. One is a boy born on Feb. 29. What is the probability both are boys?\n",
"\n",
"* **Problem 4.** I have two children. At least one of them is a boy born on leap day, February 29. What is the probability that both children are boys? Assume that 51.5% of births are boys and that birth days are distributed evenly across the 4&times;365 + 1 days in a 4-year cycle.\n",
"\n",
"We will use the notation `GLBN` to mean an older girl born on leap day and a younger boy born on a non-leap day. We'll define a helper function, `joint`, that creates the joint probability distribution of two probability distributions:"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"\"\"\"The joint distribution of two independent probability distributions. \n",
" Result is all entries of the form {a+b: P(a)*P(b)}\"\"\"\n",
"joint(A, B)=Dict(a * b => A[a] * B[b] for a in keys(A),b in keys(B));"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"Dict{String,Float64} with 16 entries:\n",
" \"BLGN\" => 0.000170845\n",
" \"GNGN\" => 0.234903\n",
" \"GNBN\" => 0.249433\n",
" \"BLBL\" => 1.24255e-7\n",
" \"GNGL\" => 0.000160893\n",
" \"BNGN\" => 0.249433\n",
" \"BNBL\" => 0.000181412\n",
" \"BLGL\" => 1.17017e-7\n",
" \"BLBN\" => 0.000181412\n",
" \"GLBN\" => 0.000170845\n",
" \"GLGN\" => 0.000160893\n",
" \"GLBL\" => 1.17017e-7\n",
" \"BNBN\" => 0.264862\n",
" \"BNGL\" => 0.000170845\n",
" \"GLGL\" => 1.102e-7\n",
" \"GNBL\" => 0.000170845"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sexes = probdist(B=51.5, G=48.5) # Probability distribution over sexes\n",
"days = probdist(L=1, N=4*365) # Probability distribution over Leap days and Non-leap days\n",
"child = joint(sexes, days) # Probability distribution for one child family\n",
"S4 = joint(child, child); # Probability distribution for two-child family"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's check out these last two probability distributions:"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"Dict{String,Float64} with 4 entries:\n",
" \"BN\" => 0.514648\n",
" \"BL\" => 0.000352498\n",
" \"GL\" => 0.000331964\n",
" \"GN\" => 0.484668"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"child"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"Dict{String,Float64} with 16 entries:\n",
" \"BLGN\" => 0.000170845\n",
" \"GNGN\" => 0.234903\n",
" \"GNBN\" => 0.249433\n",
" \"BLBL\" => 1.24255e-7\n",
" \"GNGL\" => 0.000160893\n",
" \"BNGN\" => 0.249433\n",
" \"BNBL\" => 0.000181412\n",
" \"BLGL\" => 1.17017e-7\n",
" \"BLBN\" => 0.000181412\n",
" \"GLBN\" => 0.000170845\n",
" \"GLGN\" => 0.000160893\n",
" \"GLBL\" => 1.17017e-7\n",
" \"BNBN\" => 0.264862\n",
" \"BNGL\" => 0.000170845\n",
" \"GLGL\" => 1.102e-7\n",
" \"GNBL\" => 0.000170845"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"S4"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"And we can solve the problem. Since \"boy born on a leap day\" applies to so few children, we expect the probability of two boys to be just ever so slightly below the baseline rate for boys, 51.5%."
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"0.5149145040963757"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Problem 4\n",
"\n",
"boy_on_leap_day = T(\"BL\")\n",
"\n",
"P(two_boys, such_that(boy_on_leap_day, S4))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Simulation\n",
"\n",
"Sometimes it is inconvenient to explicitly define a sample space. Perhaps the sample space is infinite, or perhaps it is just very large and complicated, and we feel more confident in writing a program to *simulate* the situation, rather than one to *enumerate* the complete sample space. *Sampling* from the simulation\n",
"can give an accurate estimate of the probability.\n",
"\n",
"For example, here's a simulation of the Monty Hall problem. Given a boolean input saying whether the contestent wants to switch doors or not, the function `monty(switch)` returns True iff the contestant picks the car."
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"\"\"\"Simulate this sequence of events:\n",
"- The host randomly chooses a door for the 'car'\n",
"- The contestant randomly makes a 'pick' of one of the doors\n",
"- The host randomly selects a valid door to be 'opened.' \n",
"- If 'switch' is True, contestant changes 'pick' to the other door\n",
"Return true if the pick is the door with the car.\"\"\"\n",
"function monty(switch=true)\n",
" doors = [1, 2, 3]\n",
" car = rand(doors)\n",
" pick = rand(doors)\n",
" opened = rand(filter(d->d != car && d != pick,doors))\n",
" pick = switch? filter(d->d!=pick && d!=opened,doors)[1]: pick \n",
" pick==car\n",
"end;"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"We can confirm that the contestant wins about 2/3 of the time with the `switch` strategy, and only wins about 1/3 of the time when not switching:"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"0.66662"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"count(_->monty(true),1:100000)/100000"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"0.33176"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"count(_->monty(false),1:100000)/100000"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Simulating Monopoly\n",
"\n",
"Here's an example where simulation seems to be much easier than enumeration: [problem 84](https://projecteuler.net/problem=84) from the excellent [Project Euler](https://projecteuler.net) asks the reader to simulate the game of Monopoly for a single player, and report on the probability of the player ending a roll on each of the squares on the board. The simulation takes into account die rolls, chance and community chest cards, and going to jail (from the \"go to jail\" space, from a card, or from rolling doubles three times in a row). The simulation does not take into account anything about buying or selling properties or exchanging money or winning or losing the game."
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"# The board: a list of the names of the 40 squares\n",
"board = \"\"\"GO A1 CC1 A2 T1 R1 B1 CH1 B2 B3\n",
" JAIL C1 U1 C2 C3 R2 D1 CC2 D2 D3 \n",
" FP E1 CH2 E2 E3 R3 F1 F2 U2 F3 \n",
" G2J G1 G2 CC3 G3 R4 CH3 H1 T2 H2\"\"\" |> split\n",
"\n",
"# Lists of 16 community chest and 16 chance cards. See do_card.\n",
"CC = append!([\"GO\", \"JAIL\"], repeat([\"?\"],outer=[14]))\n",
"\n",
"CH = append!(\"GO JAIL C1 E3 H2 R1 R R U -3\" |> split, repeat([\"?\"],outer=[6]))\n",
"\n",
"\"\"\"Simulate given number of steps of monopoly game, \n",
"yielding the name of the current square after each step.\"\"\"\n",
"function monopoly(steps)\n",
" global here\n",
" here = 1\n",
" CC_deck = shuffle(CC)\n",
" CH_deck = shuffle(CH)\n",
" doubles = 0\n",
" function monopolyTask()\n",
" for _=1:steps\n",
" d1, d2 = rand(1:6), rand(1:6)\n",
" goto(here + d1 + d2)\n",
" doubles = (d1 == d2) ? (doubles + 1): 0\n",
" if doubles == 3 || board[here] == \"G2J\" \n",
" goto(\"JAIL\")\n",
" elseif startswith(board[here],\"CC\")\n",
" do_card(CC_deck)\n",
" elseif startswith(board[here],\"CH\")\n",
" do_card(CH_deck)\n",
" end\n",
" produce(board[here])\n",
" end\n",
" end\n",
" Task(monopolyTask)\n",
"end\n",
"\n",
"\"Go to destination square (a square number). Update 'here'.\"\n",
"function goto(square::Int)\n",
" global here\n",
" here = (square-1) % length(board)+1\n",
"end\n",
"\n",
"\"Go to destination square (a square name). Update 'here'.\"\n",
"function goto(square::AbstractString)\n",
" global here\n",
" here = findfirst(board,square)\n",
"end\n",
"\n",
"\"Take the top card from deck and do what it says.\"\n",
"function do_card(deck)\n",
" global here\n",
" card = pop!(deck) # The top card\n",
" unshift!(deck,card) # Move top card to bottom of deck\n",
" if card == \"R\"|| card == \"U\" \n",
" while !startswith(board[here],card)\n",
" goto(here + 1) # Advance to next railroad or utility\n",
" end\n",
" elseif card == \"-3\"\n",
" goto(here - 3) # Go back 3 spaces\n",
" elseif card != \"?\"\n",
" goto(card) # Go to destination named on card\n",
" end\n",
"end; "
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's run the simulation for a million dice rolls, and see a histogram and a list of the counts for each square:"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"results = collect(monopoly(10^6));"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"PyPlot.Figure(PyObject <matplotlib.figure.Figure object at 0x7fea9c85d890>)"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING: using PyPlot.table in module Main conflicts with an existing identifier.\n"
]
}
],
"source": [
"using PyPlot\n",
"figure(\"hist\",figsize=(5,3))\n",
"ax=axes()\n",
"axis([1 ,40, 0 ,70000])\n",
"ax[:hist]([findfirst(board,name) for name in results], bins=40);"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"40-element Array{Tuple{SubString{String},Int64},1}:\n",
" (\"JAIL\",62333)\n",
" (\"E3\",31957) \n",
" (\"D3\",31013) \n",
" (\"GO\",30922) \n",
" (\"R3\",30544) \n",
" (\"R1\",29830) \n",
" (\"D2\",29461) \n",
" (\"R2\",29388) \n",
" (\"FP\",28824) \n",
" (\"E1\",28342) \n",
" (\"U2\",28033) \n",
" (\"D1\",27555) \n",
" (\"E2\",27289) \n",
" ⋮ \n",
" (\"B2\",23197) \n",
" (\"B3\",22818) \n",
" (\"B1\",22538) \n",
" (\"H1\",21872) \n",
" (\"T2\",21802) \n",
" (\"A2\",21605) \n",
" (\"A1\",21185) \n",
" (\"CC1\",19113) \n",
" (\"CH2\",10766) \n",
" (\"CH3\",8643) \n",
" (\"CH1\",8540) \n",
" (\"G2J\",0) "
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# We have to implement most_common here at it is not found Julia libraries \n",
"using StatsBase\n",
"function most_common(r)\n",
" commonList=collect(zip(board,counts([findfirst(board,name)::Int for name in r])))\n",
" sort!(commonList,by=x->x[2],rev=true)\n",
"end\n",
"most_common(results)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"We can see that `JAIL` is by far the most popular square (at a little over 6%), and that the three least popular squares (around 1%) are the three chance squares, `CH1`, `CH2`, and `CH3` (because 10 of the 16 chance cards send the player away from the square), and of course the \"Go to Jail\" square, square number 30 on the plot, which has a count of 0 because you can't end a turn there. The other squares are pretty evenly distributed at 2% to 3% each."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Classy Monopoly\n",
"\n",
"Some people might think that the \"`global here`\" is bad style. One way to eliminate global variables is to pack them up into objects. We can do that by making a `Monopoly` class. My personal preference would be that the \"`global here`\" declarations add less visual clutter, but I present this refactored version for those who prefer it."
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"40-element Array{Tuple{SubString{String},Int64},1}:\n",
" (\"JAIL\",62114)\n",
" (\"E3\",31839) \n",
" (\"D3\",30928) \n",
" (\"R3\",30741) \n",
" (\"GO\",30736) \n",
" (\"D2\",29479) \n",
" (\"R2\",29396) \n",
" (\"R1\",29377) \n",
" (\"FP\",28731) \n",
" (\"E1\",28443) \n",
" (\"U2\",28065) \n",
" (\"D1\",27947) \n",
" (\"F1\",27210) \n",
" ⋮ \n",
" (\"B2\",23395) \n",
" (\"B3\",22924) \n",
" (\"B1\",22522) \n",
" (\"T2\",21958) \n",
" (\"A2\",21734) \n",
" (\"H1\",21693) \n",
" (\"A1\",21443) \n",
" (\"CC1\",18672) \n",
" (\"CH2\",10524) \n",
" (\"CH3\",8975) \n",
" (\"CH1\",8365) \n",
" (\"G2J\",0) "
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type Monopoly\n",
" board \n",
" CC \n",
" CH \n",
" here\n",
" function Monopoly()\n",
" this=new()\n",
" this.board= \"\"\"GO A1 CC1 A2 T1 R1 B1 CH1 B2 B3\n",
" JAIL C1 U1 C2 C3 R2 D1 CC2 D2 D3 \n",
" FP E1 CH2 E2 E3 R3 F1 F2 U2 F3 \n",
" G2J G1 G2 CC3 G3 R4 CH3 H1 T2 H2\"\"\" |> split\n",
" this.CC = append!([\"GO\", \"JAIL\"], repeat([\"?\"],outer=[14]))\n",
" this.CH = append!(\"GO JAIL C1 E3 H2 R1 R R U -3\" |> split, repeat([\"?\"],outer=[6]))\n",
" shuffle!(this.CC)\n",
" shuffle!(this.CH)\n",
" this.here=1\n",
" return this\n",
" end\n",
"end\n",
"\n",
"\"\"\"Simulate given number of steps of monopoly game, incrementing counter \n",
"for current square after each step. Return a list of (square, count) pairs in order.\"\"\"\n",
"function simulate(m::Monopoly,steps)\n",
" counter=zeros(Int,40)\n",
" doubles = 0\n",
" for _=1:steps\n",
" d1, d2 = rand(1:6), rand(1:6)\n",
" goto(m, m.here + d1 + d2)\n",
" doubles = (d1 == d2) ? (doubles + 1): 0\n",
" if doubles == 3 || m.board[m.here] == \"G2J\" \n",
" goto(m, \"JAIL\")\n",
" elseif startswith(m.board[m.here],\"CC\") || startswith(m.board[m.here],\"CH\")\n",
" do_card(m)\n",
" end\n",
" counter[m.here]+=1\n",
" end\n",
" commonList=collect(zip(m.board,counter))\n",
" sort!(commonList,by=x->x[2],rev=true)\n",
"end\n",
"\n",
"\"Go to destination square (a square number). Update 'here'.\"\n",
"function goto(m::Monopoly, square::Int)\n",
" m.here = (square-1) % length(m.board)+1\n",
"end\n",
"\n",
"\"Go to destination square (a square name). Update 'here'.\"\n",
"function goto(m::Monopoly,square::AbstractString)\n",
" m.here = findfirst(m.board,square)\n",
"end\n",
"\n",
"\"Take the top card from deck and do what it says.\"\n",
"function do_card(m::Monopoly)\n",
" deck= startswith(m.board[m.here],\"CC\") ? m.CC: m.CH #Which deck based on location\n",
" card = pop!(deck) # The top card\n",
" unshift!(deck,card) # Move top card to bottom of deck\n",
" if card == \"R\"|| card == \"U\" \n",
" while !startswith(m.board[m.here],card)\n",
" goto(m,m.here + 1) # Advance to next railroad or utility\n",
" end\n",
" elseif card == \"-3\"\n",
" before=m.here\n",
" goto(m,m.here - 3) # Go back 3 spaces\n",
" if m.here==0\n",
" println(before, \" \",card)\n",
" end\n",
" elseif card != \"?\"\n",
" goto(m,card) # Go to destination named on card\n",
" end\n",
" \n",
"end\n",
" \n",
"simulate(Monopoly(),10^6)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# The St. Petersburg Paradox\n",
"\n",
"One more famous paradox: The [St. Petersburg paradox](https://en.wikipedia.org/wiki/St._Petersburg_paradox) from 1713, named for the home town of the [Bernoulli brothers](http://www.storyofmathematics.com/18th_bernoulli.html):\n",
"\n",
"> A casino offers a game of chance for a single player in which a fair coin is tossed at each stage. The pot starts at 2 dollars and is doubled every time a head appears. The first time a tail appears, the game ends and the player wins whatever is in the pot. Thus the player wins 2 dollars if a tail appears on the first toss, 4 dollars if a head appears on the first toss and a tail on the second, etc. What is the expected value of this game to the player?\n",
"\n",
"To calculate the expected value, we see there is a 1/2 chance of a tail on the first toss (yielding a pot of \\$2) and if not that, a 1/2 &times; 1/2 = 1/4 chance of a tail on the second toss (yielding a pot of \\$4), and so on. So in total, the expected value is:\n",
"\n",
"$$\\frac{1}{2}\\cdot 2 + \\frac{1}{4}\\cdot 4 + \\frac{1}{8}\\cdot 8 + \\frac{1}{16} \\cdot 16 + \\cdots = 1 + 1 + 1 + 1 + \\cdots = \\infty$$\n",
"\n",
"The expected value is infinite! But anyone playing the game would not expect to win an infinite amount; thus the paradox.\n",
"\n",
"## Response 1: Limited Resources\n",
"\n",
"The first major response to the paradox is that the casino's resources are limited. Once you break their bank, they can't pay out any more, and thus the expected return is finite. Let's model that by creating a probability distribution for the problem with a limited bank. We keep doubling the pot and halving the probability of winning the amount in the pot (half because you get the pot on a tail but not a head), until we reach the limit:"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"30-element Array{Tuple{Any,Any},1}:\n",
" (2,0.5) \n",
" (4,0.25) \n",
" (8,0.125) \n",
" (16,0.0625) \n",
" (32,0.03125) \n",
" (64,0.015625) \n",
" (128,0.0078125) \n",
" (256,0.00390625) \n",
" (512,0.00195313) \n",
" (1024,0.000976563) \n",
" (2048,0.000488281) \n",
" (4096,0.000244141) \n",
" (8192,0.00012207) \n",
" ⋮ \n",
" (524288,1.90735e-6) \n",
" (1048576,9.53674e-7) \n",
" (2097152,4.76837e-7) \n",
" (4194304,2.38419e-7) \n",
" (8388608,1.19209e-7) \n",
" (16777216,5.96046e-8) \n",
" (33554432,2.98023e-8) \n",
" (67108864,1.49012e-8) \n",
" (134217728,7.45058e-9) \n",
" (268435456,3.72529e-9) \n",
" (536870912,1.86265e-9) \n",
" (1000000000,1.86265e-9)"
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\"Return the probability distribution for the St. Petersburg Paradox with a limited bank.\"\n",
"function st_pete(limit)\n",
" P = Dict() # The probability distribution\n",
" pot = 2 # Amount of money in the pot\n",
" pr = 1/2 # Probability that you end up with the amount in pot\n",
" while pot < limit \n",
" P[pot] = pr\n",
" pot, pr = pot * 2, pr / 2\n",
" end\n",
" P[limit] = pr * 2 # pr * 2 because you get limit for heads or tails\n",
" assert(sum(values(P)) == 1.0)\n",
" sort(collect(zip(keys(P),values(P))))\n",
"end\n",
"\n",
"StP = st_pete(10^9)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now we define the function `EV` to compute the [expected value](https://en.wikipedia.org/wiki/Expected_value) of the (limited) St. Petersburg probability distribution:"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"\"The expected value of a probability distribution.\"\n",
"EV(P) =sum([v[1] * v[2] for v in P]);"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"30.862645149230957"
]
},
"execution_count": 67,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"EV(StP)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"This says that for a casino with a bankroll of a billion dollars, you should be willing to pay \\$30.86 to play the game. Would you pay that much? I wouldn't, and neither would Daniel Bernoulli. \n",
"\n",
"## Response 2: Value of Money\n",
"\n",
"Bernoulli came up with a second response to the paradox based on the idea that if you have a lot of money, then additional money becomes less valuable to you. How much less valuable? Bernoulli proposed, and [experiments confirm](https://books.google.com/books?id=1oEa-BiARWUC&pg=PA205&lpg=PA205&dq=mr+beard+oil+wildcatter+value+of+money+utility&source=bl&ots=cBDIX-rkTz&sig=GHB8-inorWrU39vA8JYV_sCtqB8&hl=en&sa=X&ved=0CCAQ6AEwAGoVChMI5fu-p8qlyAIViKWICh0XAAz5#v=onepage&q=mr%20beard%20oil%20wildcatter%20value%20of%20money%20utility&f=false), that *the value of money is roughly logarithmic.* The idea is that if I had very little money, and I won \\$1000, I would be very happy. But if I already had a million dollars and I won \\$1000, it would make less difference to me; the \\$1000 would be less valuable. \n",
"\n",
"I'll write the function `util` to describe what a dollar amount is worth to a hypothetical gambler. `util` says that a dollar is worth a dollar, until the amount is \"enough\" money. After that point, each additional dollar is worth half as much (only brings half as much happiness). Value keeps accumulating at this rate until we reach the next threshold of \"enough,\" when the utility of additional dollars is halfed again. The exact details of `util` are not critical; what matters is that overall money becomes less valuable after we have won a lot of it."
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"\"The value of money: only half as valuable after you already have enough.\"\n",
"function util(dollars, enough=1000)\n",
" if dollars < enough\n",
" return dollars\n",
" else\n",
" return enough + util((dollars-enough)/2., enough*2)\n",
" end\n",
"end;"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"A table and a plot will give a feel for the `util` function. Notice the characterisitc concave-down shape of the plot."
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 100 $ = 100 util\n",
" 1000 $ = 1000 util\n",
" 10000 $ = 4250 util\n",
" 100000 $ = 15938 util\n",
" 1000000 $ = 51594 util\n",
" 10000000 $ = 162461 util\n",
" 100000000 $ = 535646 util\n",
" 1000000000 $ = 1658229 util\n",
" 10000000000 $ = 5171073 util\n"
]
}
],
"source": [
"for d=2:10\n",
" println(lpad(10^d,15),\" \\$ = \",lpad(round(Int,util(10^d)),10), \" util\")\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"PyPlot.Figure(PyObject <matplotlib.figure.Figure object at 0x7fea9a6bbf10>)"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Y axis is util(x); x axis is in thousands of dollars.\n"
]
}
],
"source": [
"figure(\"Value of Money\",figsize=(5,3))\n",
"plot([util(x) for x=1000:1000:10000000])\n",
"println(\"Y axis is util(x); x axis is in thousands of dollars.\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now I will define the function `EU`, which computes the [expected utility](http://wiki.lesswrong.com/wiki/Expected_utility) of the game:"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"\"The expected utility of a probability distribution, given a utility function.\"\n",
"EU(P, U)= sum([e[2] * U(e[1]) for e in P]);"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"13.101970414893003"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"EU(StP, util)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"That says we should pay up to \\$13.10 to play the game, which sounds more reasonable than \\$30.86.\n",
"\n",
"# Understanding the St. Petersburg Problem Better through Simulation\n",
"\n",
"Before I plunk down my \\$13, I'd like to understand the game better. I'll write a simulation of the game:"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"flip()=rand([\"head\", \"tail\"])\n",
"\n",
"\"Simulate one round of the St. Petersburg game, and return the payoff.\"\n",
"function simulate_st_pete(limit=10^9)\n",
" pot = 2\n",
" while flip() == \"head\"\n",
" pot = pot * 2\n",
" if pot > limit\n",
" return limit\n",
" end\n",
" end\n",
" return pot\n",
"end;"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"I will run the simulation 100,000 times (with a random seed specified for reproducability) and make the results into a probability distribution:"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"17-element Array{Tuple{Int64,Float64},1}:\n",
" (2,0.50021) \n",
" (4,0.24995) \n",
" (8,0.12632) \n",
" (16,0.06167) \n",
" (32,0.03038) \n",
" (64,0.01543) \n",
" (128,0.00845) \n",
" (256,0.00376) \n",
" (512,0.00191) \n",
" (1024,0.00085) \n",
" (2048,0.00053) \n",
" (4096,0.00027) \n",
" (8192,0.00015) \n",
" (16384,4.0e-5) \n",
" (32768,4.0e-5) \n",
" (65536,1.0e-5) \n",
" (131072,3.0e-5)"
]
},
"execution_count": 74,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"srand(1234)\n",
"# With Julia to can take a few million samples at get the results instantly \n",
"results = sort([(z[1],z[2]) for z in proportionmap([simulate_st_pete() for _=1:100_000])], by=x->x[1])"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"13.139574999999997"
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"EU(results, util) "
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"The results are about what you would expect: about half the pots are 2, a quarter are 4, and higher pots are more and more unlikely. The expected utility was just a little bit more than the theoretical expected utility (13.14 vs. 13.10)."
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"19.82342"
]
},
"execution_count": 76,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"EV(results)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"The expected value (19.82) is almost two thirds of the theoretical expected value (30.86). Why should there be such a big difference? I think the answer is *variance*. If I averaged an infinite number of rounds I would get 30.86, but if I can only average a finite number, most of the time I will get a result less than 30.86, and a very small number of times I will get an average very much larger than 30.86, because the round happened to include a very big (but very rare) pot.\n",
"\n",
"To see better how things unfold, I will define a function to plot the running average of repeated rounds:"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"\"For each element in the iterable, yield the mean of all elements seen so far.\" \n",
"function running_averages(iterable)\n",
" total, n = 0, 0\n",
" function run_avg_task()\n",
" for x in iterable\n",
" total, n = total + x, n + 1\n",
" produce(total / n)\n",
" end\n",
" end\n",
" Task(run_avg_task)\n",
"end\n",
"\n",
"\"Plot the running average of calling the function n times.\"\n",
"function plot_running_averages(fn, n)\n",
" plot(collect(running_averages([fn() for _=1:n])))\n",
"end;"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's do ten repetitions of plotting 100,000 rounds each repetition:"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"image/png": "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e++9t26+9PR0Bg8ejNfrZdWqVSxfvpyDBw8yYMAAioqKLridsuqyQO2CEEIIccVoA7Xif/zjH7jdblavXk2bNm0AGDRoECdOnGDp0qWUlpZitVqZPXs2RqORdevWYbFYAOjVqxft27dn0aJFLFy48LzbeenblxjUf1CgdkMIIYS4IgLWwjUajQBYrdZ6061WK2q1Gr1ej9frZf369YwbN64ubAESEhIYPHgwa9euveB23F73lS1cCCGECICABe6ECRNo1qwZkydPJiMjg4qKCtatW8ebb77J1KlTMZlMHDlyBKfTSbdu3c5Yvnv37hw+fBi3WwJVCCFE6AvYKeWWLVuyZcsWbr/9dtq2bQuASqXikUceYfHixQB112jtdvsZy9vtdvx+P8XFxcTGxp5zO378AaheCCGEuLICFrgHDx7klltuoW3btjz//PNER0ezfft2nn32WcrLy1m2bNkV2Y7fL4ErhBCi8QtY4D755JP4fD42bdpUdz33xhtvJCoqigcffJDf/OY3dS1Xh8NxxvIOhwOVSoXNZgtUiUIIIUSDCVjg7tu3j86dO9eF7Sl9+/YFlNuG+vfvj8lkIi0t7Yzl09LSaNeuHXq9/rzb+f6t77l92+31pqWkpJCSkvIL90AIIURjs2LFClasWFFvWmlpaZCquTQBvYablpZGVVUVZrO5bvrXX3+NSqWiVatWaDQaRo0axZo1a3j++efreipnZWWxefNmHn300Qtup8dvevCvx/8VqN0QQgjRiJytQZWamkrv3r2DVNHFC1gv5enTp1NYWMiQIUNYuXIlmzdvZsGCBTz66KN06dKFESNGADB37lyqqqoYOXIkn376KWvXruW2224jJiaGGTNmBKo8IYQQokEFLHBvvfVWtmzZQmRkJNOnT2fUqFG8++67TJ48ma1bt6LVKo3rjh07smXLFvR6PePHj+fBBx+kQ4cObN26laioqAtuR3opCyGECAUBO6UMSiepTz755ILz9ezZk02bNl3WNqSXshBCiFAgTwsSQgghGkDIB66cUhZCCBEKQj5whRBCiFAggSuEEEI0gJAPXDmlLIQQIhSEfuBKL2UhhBAhIOQDVwghhAgFIR+4ckpZCCFEKAj9wJVTykIIIUJAyAeuEEIIEQokcIUQQogGEPKBK6eUhRBChIKQD1whhBAiFIR84EovZSGEEKEg5ANX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",
"text/plain": [
"PyPlot.Figure(PyObject <matplotlib.figure.Figure object at 0x7fea9a6127d0>)"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"srand(555)\n",
"figure(\"Running Average\",figsize=(5,3))\n",
"for i=1:10\n",
" plot_running_averages(simulate_st_pete, 100000)\n",
"end\n",
"axis([1 ,100_000, 2, 140]);"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"What can we see from this? Eight of the 10 repetitions have a final average payoff between 10 and 35. So a price around \\$13 still seems reasonable. One outlier has an average payoff just over 100 and another just over 60, so if you are feeling lucky you might be willing to pay some amount between \\$13 and \\$30.\n",
"\n",
"# Conclusion\n",
"\n",
"We've seen how to manage probability paradoxes. Just be explicit about what the problem says, and then methodical about defining the sample space, and finally be careful in counting the number of outcomes in the numerator and denominator. Easy as 1-2-3. But the bigger lesson is: treat those around you as reasonable people, and when they have different opinons, try to discover what problem they are solving."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 0.4.6",
"language": "julia",
"name": "julia-0.4"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "0.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment