{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# chapter 5 공산과 가산 (Odds and Addends)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5.1 공산"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- \"공산은 3대 1입니다.\"\n",
"\n",
"\n",
"- 어떤 사건의 **승산(odds in favor)**은 이 사건이 **일어나지 않을때의 확률**과 **일어났을때의 확률**의 **비율**이다.\n",
"\n",
"\n",
"- 예) 우리팀 승률 75% --> 3:1\n",
"\n",
"\n",
"- 확률이 낮은 경우, 승산보다 반대 형식의 공산으로 표기하는 경우가 더 흔하다.\n",
"- 예) 내 말이 이길 확률 10% --> 공산 9:1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"-----------------------------------\n",
">http://en.wikipedia.org/wiki/Odds\n",
"\n",
">- **odds for** -- the likelihood that a particular event will take place. \n",
">- **odds against** -- the likelihood that a particular event will **not** take place. \n",
"\n",
"-------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"- 확률과 공산은 **동일한 정보를 다르게 표기**하는 법이다."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from __future__ import division\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def Odds(p):\n",
" return p / (1-p)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def Probability(o):\n",
" return o / (o+1)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# 분모, 분자 아는 경우\n",
"\n",
"def Probability2(yes, no):\n",
" return yes / (yes + no)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"< 예 >\n",
"\n",
"경마장에서 20%의 사람만 자기 말이 이길 거라고 생각하고, 80%의 사람들은 아닐거라고 생각한다면, 공산은 20:80 혹은 1:4"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.25\n"
]
}
],
"source": [
"p=0.2\n",
"o = Odds(p)\n",
"print o"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.2\n"
]
}
],
"source": [
"p1= Probability(o)\n",
"print p1"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.2"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Probability2(20,80) # 분모 = 80, 분자 = 20"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5.2 베이즈 이론의 공산 형태"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**확률형태** 베이즈 이론"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$p(H|D) = \\frac{p(H)p(D|H)}{p(D)}$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A, B 라는 두 개의 가설이 있을때 사후확률비"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\\frac{p(A|D)}{p(B|D)} = \\frac{p(A)p(D|A)}{p(B)p(D|B)} $$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A, B 가 상호 배제적이며 전체 포괄적이라면, $p(B) = 1 - p(A)$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A 에 대한 공산을 $ o(A) $ 로 쓰면, "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> $$ o(A|D) = o(A) \\frac{p(D|A)}{p(D|B)} $$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"즉, **사후 공산**은 **사전공산**과 **우도비**의 곱\n",
"\n",
"- 베이즈 이론을 **공산형태**로 나타낸것이다."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5.3 올리버의 혈액형"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
">< 문제 >\n",
"\n",
">범죄현장에서 두 사람의 혈흔을 발견.\n",
"\n",
">두 혈흔의 혈액형은 'O'형 (인구의 60% 빈도로 나타남) 과 'AB'형 (인구의 1%).\n",
"\n",
">용의자 올리버는 'O'형\n",
"\n",
">이 데이터(범죄 현장의 혈흔의 혈액형)가 올리버가 범인중 한명이라는 질문에 대한 증거인가?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$ o(A|D) = o(A) \\frac{p(D|A)}{p(D|B)} $$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$ o(A) $ 로 나누면, \n",
">$$ \\frac{o(A|D)}{o(A)} =\\frac{p(D|A)}{p(D|B)} $$\n",
"\n",
">왼쪽 항목 : **사후공산과 사전공산의 비**\n",
"\n",
">오른쪽 항목 : **우도비 (베이즈 요인)**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- 베이즈요인(Bayes factor) > 1\n",
"\n",
" $ \\frac{p(D|A)}{p(D|B)} > 1 $\n",
"\n",
" ; 데이터는 B의 가정보다는 **A의 가정에 가깝다**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- 공산비 = ( 사후공산 / 사전공산 ) > 1\n",
"\n",
" $ \\frac{o(A|D)}{o(A)} > 1 $\n",
" \n",
" ; 테이터 상에서 **전보다 공산이 커졌다.**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- 베이즈요인 = 1 \n",
"\n",
" ; 데이터는 각 가설에서 경우가 동일하므로 **공산은 변하지 않는다.**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
">< 문제 풀이 >\n",
"\n",
">* 올리버가 범인이라면, \n",
"\n",
"> 현장 'O'형은 올리버이고, 이때 데이터 확률은 'AB'형 확률 1% 와 동일.\n",
"\n",
"> ; 1%\n",
"
\n",
"\n",
">* 범인 아니라면,\n",
"\n",
"> 임의의 'O'형 확률 and 임의의 'AB'형 확률\n",
"\n",
"> --> 첫번째 사람이 'O'형이고, 두번째 사람이 'AB'형 \n",
"> or 첫번째 사람이 'AB' 형이고, 두번째 사람이 'O'형\n",
"\n",
"> ; 0.6*0.01 + 0.6*0.01 = 1.2%"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5.4 가산 "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The fundamental operation of Bayesian statistics is **Update**, which takes a **prior distribution**\n",
"and a set of **data**, and produces a **posterior distribution**.\n",
"\n",
" --> 사전분포와 데이터로 사후분포를 생성!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"실제 문제는 보통 정규화, **덧셈**과 **최댓값**, 최솟값, 이런 연산을 조합한 기타 수치 연산 등의 많은 연산을 포함하고 있다."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"이 장(5장)에서는 덧셈과 최댓값에 대해서 설명한다."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"던전 앤 드래곤 게임 예\n",
"\n",
"게임시작하기 전에, 플레이어는 6면체 주사위 세개를 굴린 후 이 값을 더해서 캐릭터 속성값(체력, 지능, 등)을 생성한다.\n",
"\n",
"3 주사위의 합의 분포는?\n",
"\n",
"- 시뮬레이션 - 하나의 주사위에 대한 분포를 나타내는 Pmf 가 주어졌을때, 이를 사용해서 랜덤 샘플을 만들고, 더해서, 시뮬레이션으로 만들어진 값의 합에 대한 분포를 구한다.\n",
"\n",
"\n",
"- 나열 (enumeration) - 주어진 두 개의 Pmf를 사용하여, 모든 가능한 수의 쌍을 나열하고, 이 합의 분포를 계산한다.
\n",
" ; (첫번째 pmf + 두번째 pmf) + 세번째 pmf\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Writing ./images/dungeons3.pdf\n",
"Writing ./images/dungeons3.eps\n",
"Writing ./images/dungeons3.png\n",
"3 0.002\n",
"4 0.017\n",
"5 0.017\n",
"6 0.046\n",
"7 0.062\n",
"8 0.095\n",
"9 0.125\n",
"10 0.123\n",
"11 0.132\n",
"12 0.127\n",
"13 0.099\n",
"14 0.075\n",
"15 0.044\n",
"16 0.022\n",
"17 0.014\n",
"3 0.00462962962963\n",
"4 0.0138888888889\n",
"5 0.0277777777778\n",
"6 0.0462962962963\n",
"7 0.0694444444444\n",
"8 0.0972222222222\n",
"9 0.115740740741\n",
"10 0.125\n",
"11 0.125\n",
"12 0.115740740741\n",
"13 0.0972222222222\n",
"14 0.0694444444444\n",
"15 0.0462962962963\n",
"16 0.0277777777778\n",
"17 0.0138888888889\n",
"18 0.00462962962963\n",
"Writing ./images/dungeons1.pdf\n",
"Writing ./images/dungeons1.eps\n",
"Writing ./images/dungeons1.png\n",
"3 9.84640042005e-15\n",
"4 4.03210097201e-11\n",
"5 9.80606956393e-09\n",
"6 6.20323226463e-07\n",
"7 1.74701297953e-05\n",
"8 0.000285572333648\n",
"9 0.00247724167357\n",
"10 0.0128440856934\n",
"11 0.0439796447754\n",
"12 0.105590541894\n",
"13 0.18102225454\n",
"14 0.212013521417\n",
"15 0.194224527556\n",
"16 0.141452169514\n",
"17 0.0786340868805\n",
"18 0.0274582534226\n",
"Writing ./images/dungeons2.pdf\n",
"Writing ./images/dungeons2.eps\n",
"Writing ./images/dungeons2.png\n"
]
},
{
"data": {
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# %load ./src/dungeons.py\n",
"\"\"\"This file contains code for use with \"Think Bayes\",\n",
"by Allen B. Downey, available from greenteapress.com\n",
"\n",
"Copyright 2012 Allen B. Downey\n",
"License: GNU GPLv3 http://www.gnu.org/licenses/gpl.html\n",
"\"\"\"\n",
"\n",
"import random\n",
"\n",
"from src import thinkbayes\n",
"from src import thinkplot\n",
"\n",
"FORMATS = ['pdf', 'eps', 'png']\n",
"\n",
"\n",
"class Die(thinkbayes.Pmf):\n",
" \"\"\"Represents the PMF of outcomes for a die.\"\"\"\n",
"\n",
" def __init__(self, sides, name=''):\n",
" \"\"\"Initializes the die.\n",
"\n",
" sides: int number of sides\n",
" name: string\n",
" \"\"\"\n",
" thinkbayes.Pmf.__init__(self, name=name)\n",
" for x in xrange(1, sides+1):\n",
" self.Set(x, 1)\n",
" self.Normalize()\n",
"\n",
"\n",
"def PmfMax(pmf1, pmf2):\n",
" \"\"\"Computes the distribution of the max of values drawn from two Pmfs.\n",
"\n",
" pmf1, pmf2: Pmf objects\n",
"\n",
" returns: new Pmf\n",
" \"\"\"\n",
" res = thinkbayes.Pmf()\n",
" for v1, p1 in pmf1.Items():\n",
" for v2, p2 in pmf2.Items():\n",
" res.Incr(max(v1, v2), p1*p2)\n",
" return res\n",
" \n",
"\n",
"def main():\n",
" pmf_dice = thinkbayes.Pmf()\n",
" pmf_dice.Set(Die(4), 5)\n",
" pmf_dice.Set(Die(6), 4)\n",
" pmf_dice.Set(Die(8), 3)\n",
" pmf_dice.Set(Die(12), 2)\n",
" pmf_dice.Set(Die(20), 1)\n",
" pmf_dice.Normalize()\n",
"\n",
" mix = thinkbayes.Pmf()\n",
" for die, weight in pmf_dice.Items():\n",
" for outcome, prob in die.Items():\n",
" mix.Incr(outcome, weight*prob)\n",
"\n",
" mix = thinkbayes.MakeMixture(pmf_dice)\n",
"\n",
" colors = thinkplot.Brewer.Colors()\n",
" thinkplot.Hist(mix, width=0.9, color=colors[4])\n",
" thinkplot.Save(root='./images/dungeons3',\n",
" xlabel='Outcome',\n",
" ylabel='Probability',\n",
" formats=FORMATS)\n",
"\n",
" random.seed(17)\n",
"\n",
" d6 = Die(6, 'd6')\n",
"\n",
" dice = [d6] * 3\n",
" three = thinkbayes.SampleSum(dice, 1000)\n",
" three.name = 'sample'\n",
" three.Print()\n",
"\n",
" three_exact = d6 + d6 + d6\n",
" three_exact.name = 'exact'\n",
" three_exact.Print()\n",
"\n",
" thinkplot.PrePlot(num=2)\n",
" thinkplot.Pmf(three)\n",
" thinkplot.Pmf(three_exact, linestyle='dashed')\n",
" thinkplot.Save(root='./images/dungeons1',\n",
" xlabel='Sum of three d6',\n",
" ylabel='Probability',\n",
" axis=[2, 19, 0, 0.15],\n",
" formats=FORMATS)\n",
"\n",
" thinkplot.Clf()\n",
" thinkplot.PrePlot(num=1)\n",
" \n",
" # compute the distribution of the best attribute the hard way\n",
" best_attr2 = PmfMax(three_exact, three_exact)\n",
" best_attr4 = PmfMax(best_attr2, best_attr2)\n",
" best_attr6 = PmfMax(best_attr4, best_attr2)\n",
" # thinkplot.Pmf(best_attr6)\n",
"\n",
" # and the easy way\n",
" best_attr_cdf = three_exact.Max(6)\n",
" best_attr_cdf.name = ''\n",
" best_attr_pmf = thinkbayes.MakePmfFromCdf(best_attr_cdf)\n",
" best_attr_pmf.Print()\n",
"\n",
" thinkplot.Pmf(best_attr_pmf)\n",
" thinkplot.Save(root='./images/dungeons2',\n",
" xlabel='Sum of three d6',\n",
" ylabel='Probability',\n",
" axis=[2, 19, 0, 0.23],\n",
" formats=FORMATS)\n",
" \n",
"\n",
"\n",
"if __name__ == '__main__':\n",
" main()\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3 0.002\n",
"4 0.017\n",
"5 0.017\n",
"6 0.046\n",
"7 0.062\n",
"8 0.095\n",
"9 0.125\n",
"10 0.123\n",
"11 0.132\n",
"12 0.127\n",
"13 0.099\n",
"14 0.075\n",
"15 0.044\n",
"16 0.022\n",
"17 0.014\n",
"---------- simulation ---- \n",
"3 0.00462962962963\n",
"4 0.0138888888889\n",
"5 0.0277777777778\n",
"6 0.0462962962963\n",
"7 0.0694444444444\n",
"8 0.0972222222222\n",
"9 0.115740740741\n",
"10 0.125\n",
"11 0.125\n",
"12 0.115740740741\n",
"13 0.0972222222222\n",
"14 0.0694444444444\n",
"15 0.0462962962963\n",
"16 0.0277777777778\n",
"17 0.0138888888889\n",
"18 0.00462962962963\n",
"--------- enumeration ----- \n",
"Writing ./images/dungeons1.pdf\n",
"Writing ./images/dungeons1.eps\n",
"Writing ./images/dungeons1.png\n"
]
},
{
"data": {
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import random\n",
"import matplotlib.pyplot as pyplot\n",
"\n",
"from src import thinkbayes\n",
"from src import thinkplot\n",
"\n",
"\n",
"FORMATS = ['pdf', 'eps', 'png']\n",
"\n",
"\n",
"class Die(thinkbayes.Pmf):\n",
" \"\"\"Represents the PMF of outcomes for a die.\"\"\"\n",
"\n",
" def __init__(self, sides, name=''):\n",
" \"\"\"Initializes the die.\n",
"\n",
" sides: int number of sides\n",
" name: string\n",
" \"\"\"\n",
" thinkbayes.Pmf.__init__(self, name=name)\n",
" for x in xrange(1, sides+1):\n",
" self.Set(x, 1)\n",
" self.Normalize()\n",
"\n",
"\n",
"def PmfMax(pmf1, pmf2):\n",
" \"\"\"Computes the distribution of the max of values drawn from two Pmfs.\n",
"\n",
" pmf1, pmf2: Pmf objects\n",
"\n",
" returns: new Pmf\n",
" \"\"\"\n",
" res = thinkbayes.Pmf()\n",
" for v1, p1 in pmf1.Items():\n",
" for v2, p2 in pmf2.Items():\n",
" res.Incr(max(v1, v2), p1*p2)\n",
" return res\n",
" \n",
"\n",
"def main():\n",
" random.seed(17)\n",
"\n",
" d6 = Die(6, 'd6') # 6 면체 주사위 생성, simulation, 하나의 주사위 분포 Pmf\n",
"\n",
" dice = [d6] * 3\n",
" three = thinkbayes.SampleSum(dice, 1000) # 주사위를 1000 번 굴린 샘플값 생성\n",
" three.name = 'sample (simulation)'\n",
" three.Print()\n",
"\n",
" print '---------- simulation ---- '\n",
" \n",
" three_exact = d6 + d6 + d6 # 나열 (enumeration)\n",
" three_exact.name = 'exact (enumeration)'\n",
" three_exact.Print()\n",
"\n",
" print '--------- enumeration ----- '\n",
" \n",
" thinkplot.PrePlot(num=2)\n",
" \n",
" thinkplot.Pmf(three) # simulation\n",
" thinkplot.Pmf(three_exact, linestyle='dashed') # 나열 (enumeration)\n",
" \n",
" # thinkplot.Show() # image view\n",
" thinkplot.Save(root='./images/dungeons1',\n",
" xlabel='Sum of three d6',\n",
" ylabel='Probability',\n",
" axis=[2, 19, 0, 0.15],\n",
" formats=FORMATS)\n",
" \n",
" \n",
"if __name__ == '__main__':\n",
" main()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5.5 최댓값"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"던전 앤 드래곤 캐릭터 만들때, 특히 캐릭터의 최고 속성이 중요하다. 따라서 속성의 **최댓값 분포**가 궁금하다."
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"3 가지 방법\n",
"\n",
"- 시뮬레이션 (Simulation) ; sum 대신 max 사용, 앞 코드와 비슷.\n",
"\n",
"- 나열 (enumeration)\n",
"\n",
"- 멱법 (Exponentiation) ; Pmf 를 Cdf(누적분포함수)로 바꿀때, 최댓값에서 Cdf를 구하는 알고리즘."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Warning: Brewer ran out of colors.\n"
]
},
{
"data": {
"image/png": [
"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\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"-------------------------------- \n",
"3 9.84640042005e-15\n",
"4 4.03210097201e-11\n",
"5 9.80606956393e-09\n",
"6 6.20323226463e-07\n",
"7 1.74701297953e-05\n",
"8 0.000285572333648\n",
"9 0.00247724167357\n",
"10 0.0128440856934\n",
"11 0.0439796447754\n",
"12 0.105590541894\n",
"13 0.18102225454\n",
"14 0.212013521417\n",
"15 0.194224527556\n",
"16 0.141452169514\n",
"17 0.0786340868805\n",
"18 0.0274582534226\n",
"Writing ./images/dungeons2.pdf\n",
"Writing ./images/dungeons2.eps\n",
"Writing ./images/dungeons2.png\n"
]
},
{
"data": {
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import random\n",
"import matplotlib.pyplot as pyplot\n",
"\n",
"from src import thinkbayes\n",
"from src import thinkplot\n",
"\n",
"FORMATS = ['pdf', 'eps', 'png']\n",
"\n",
"\n",
"class Die(thinkbayes.Pmf):\n",
" \"\"\"Represents the PMF of outcomes for a die.\"\"\"\n",
"\n",
" def __init__(self, sides, name=''):\n",
" \"\"\"Initializes the die.\n",
"\n",
" sides: int number of sides\n",
" name: string\n",
" \"\"\"\n",
" thinkbayes.Pmf.__init__(self, name=name)\n",
" for x in xrange(1, sides+1):\n",
" self.Set(x, 1)\n",
" self.Normalize()\n",
"\n",
"\n",
"def PmfMax(pmf1, pmf2):\n",
" \"\"\"Computes the distribution of the max of values drawn from two Pmfs.\n",
"\n",
" pmf1, pmf2: Pmf objects\n",
"\n",
" returns: new Pmf\n",
" \"\"\"\n",
" res = thinkbayes.Pmf()\n",
" for v1, p1 in pmf1.Items():\n",
" for v2, p2 in pmf2.Items():\n",
" res.Incr(max(v1, v2), p1*p2)\n",
" return res\n",
" \n",
"\n",
"def main():\n",
" \n",
" random.seed(17)\n",
"\n",
" d6 = Die(6, 'd6') # 6 면체 주사위 생성, 하나의 주사위 분포 Pmf\n",
"\n",
" three_exact = d6 + d6 + d6 # 나열 (enumeration)\n",
" \n",
" thinkplot.Clf()\n",
" thinkplot.PrePlot(num=1)\n",
" \n",
" # compute the distribution of the best attribute the hard way\n",
" best_attr2 = PmfMax(three_exact, three_exact) # 세 주사위를 2번 굴렸을때의 최댓값 분포\n",
" best_attr4 = PmfMax(best_attr2, best_attr2) # 세 주사위를 4번 굴렸을때의 최댓값 분포\n",
" best_attr6 = PmfMax(best_attr4, best_attr2) # 세 주사위를 6번 굴렸을때의 최댓값 분포\n",
" thinkplot.Pmf(best_attr2)\n",
" thinkplot.Pmf(best_attr4)\n",
" thinkplot.Pmf(best_attr6)\n",
" thinkplot.Show() # image view\n",
"\n",
" print '-------------------------------- '\n",
" \n",
" # and the easy way\n",
" best_attr_cdf = three_exact.Max(6) # 세 주사위를 6번 굴렸을때의 최댓값 분포\n",
" best_attr_cdf.name = ''\n",
" best_attr_pmf = thinkbayes.MakePmfFromCdf(best_attr_cdf)\n",
" best_attr_pmf.Print()\n",
"\n",
" thinkplot.Pmf(best_attr_pmf)\n",
" \n",
" # thinkplot.Show() # image view\n",
" \n",
" thinkplot.Save(root='./images/dungeons2',\n",
" xlabel='Sum of three d6',\n",
" ylabel='Probability',\n",
" axis=[2, 19, 0, 0.23],\n",
" formats=FORMATS)\n",
" \n",
"\n",
"\n",
"if __name__ == '__main__':\n",
" main()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" #### 그림 5-2 세 주사위를 6번 굴렸을때의 최댓값 분포\n",
" \n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 누적분포함수 (cumulative distribution function)\n",
"\n",
"$$ CDF(x) = p(X \\le x) $$\n",
"\n",
"여기서 $X$ 는 \"이 분포에서 임의로 선택한 값\"의 뜻을 갖는 랜덤 변수다."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Pmf를 Cdf로 변경하면 동일한 계산을 훨씬 빠르게 할 수 있다!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
">$CDF_1$ 에서 $X$를 고르고 $CDF_2$ 에서 $Y$를 고르고, 최댓값 $Z = max(X,Y)$ 를 계산하자!\n",
"\n",
">$X$, $Y$ 선택이 독립적이면,\n",
"\n",
">$$CDF_3(z) = CDF_1(z)CDF_2(z)$$\n",
"\n",
">이때 $CDF_3$ 의 분포는 $Z$ 의 분포다.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
">< 예 > Z 가 5 이하인 경우는 얼마일까? 이 경우 X와 Y 모두 5 이하여야 한다.\n",
">$$CDF_3(5) = CDF_1(5)CDF_2(5)$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- 동일한 분포에서 k개의 값을 가져오는 특수한 경우는 다음과 같은 식이 성립한다.\n",
"\n",
"$$CDF_k(z) = CDF_1(z)^k$$\n",
"\n",
"k개의 값중 최댓값의 분포를 찾으면, 주어진 Cdf 의 확률을 나열한 후 이를 k회 곱하면 된다. (**멱법**)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5.6 혼합"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"다음과 같은 주사위 한상자가 있다. 상자에서 주사위를 골라 굴렸다. 이 때 결괏값의 분포는?\n",
"\n",
">5 4면체 주사위\n",
"\n",
">4 6면체 주사위\n",
"\n",
">3 8면체 주사위\n",
"\n",
">2 12면체 주사위\n",
"\n",
">1 20면체 주사위"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- 어떤 주사위인지를 모를 경우, 결과 분포는 서로 다른 범위의 균등 분포의 혼합 형태로 나타난다.\n",
"- PMF 의 형태로 분포를 간단하게 계산할 수 있다."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Writing ./images/dungeons3.pdf\n",
"Writing ./images/dungeons3.eps\n",
"Writing ./images/dungeons3.png\n"
]
},
{
"data": {
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import random\n",
"import matplotlib.pyplot as pyplot\n",
"\n",
"from src import thinkbayes\n",
"from src import thinkplot\n",
"\n",
"FORMATS = ['pdf', 'eps', 'png']\n",
"\n",
"\n",
"class Die(thinkbayes.Pmf):\n",
" \"\"\"Represents the PMF of outcomes for a die.\"\"\"\n",
"\n",
" def __init__(self, sides, name=''):\n",
" \"\"\"Initializes the die.\n",
"\n",
" sides: int number of sides\n",
" name: string\n",
" \"\"\"\n",
" thinkbayes.Pmf.__init__(self, name=name)\n",
" for x in xrange(1, sides+1):\n",
" self.Set(x, 1)\n",
" self.Normalize()\n",
"\n",
"\n",
"def PmfMax(pmf1, pmf2):\n",
" \"\"\"Computes the distribution of the max of values drawn from two Pmfs.\n",
"\n",
" pmf1, pmf2: Pmf objects\n",
"\n",
" returns: new Pmf\n",
" \"\"\"\n",
" res = thinkbayes.Pmf()\n",
" for v1, p1 in pmf1.Items():\n",
" for v2, p2 in pmf2.Items():\n",
" res.Incr(max(v1, v2), p1*p2)\n",
" return res\n",
" \n",
"\n",
"def main():\n",
" pmf_dice = thinkbayes.Pmf()\n",
" pmf_dice.Set(Die(4), 5) # 각 주사위의 확률을 알아서 가중치 부여한다.\n",
" pmf_dice.Set(Die(6), 4)\n",
" pmf_dice.Set(Die(8), 3)\n",
" pmf_dice.Set(Die(12), 2)\n",
" pmf_dice.Set(Die(20), 1)\n",
" pmf_dice.Normalize()\n",
"\n",
" mix = thinkbayes.Pmf()\n",
" for die, weight in pmf_dice.Items():\n",
" for outcome, prob in die.Items():\n",
" mix.Incr(outcome, weight*prob)\n",
"\n",
" mix = thinkbayes.MakeMixture(pmf_dice)\n",
"\n",
" colors = thinkplot.Brewer.Colors()\n",
" thinkplot.Hist(mix, width=0.9, color=colors[4])\n",
" \n",
" # thinkplot.Show() # image view\n",
" \n",
" thinkplot.Save(root='./images/dungeons3',\n",
" xlabel='Outcome',\n",
" ylabel='Probability',\n",
" formats=FORMATS)\n",
"\n",
"\n",
"if __name__ == '__main__':\n",
" main()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 그림 5-3 상자에서 임의의 주사위를 굴릴 때의 결과 확률 분포\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5.7 토의"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"- 베이지안 분석은 모두 분포에 대한 것이므로, 분포의 개념을 이해하기위해 이 장은 중요하다.\n",
"- 컴퓨터 관점에서,**분포**는 **값과 해당 확률을 표현하는 데이터 구조**다."
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"# python 문법 보충\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://docs.python.org/2/reference/datamodel.html#emulating-numeric-types \n",
"\n",
"https://wikidocs.net/89"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"my count = 2 입니다\n",
"my count = 3 입니다\n"
]
},
{
"data": {
"text/plain": [
"<__main__.Nemo instance at 0x0000000015B3F088>"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"class Nemo:\n",
" def __init__(self):\n",
" self.cnt =1\n",
" \n",
" def __add__(self, x):\n",
" self.cnt += x.cnt\n",
" print 'my count = ' + str(self.cnt) + ' 입니다'\n",
" return self\n",
" \n",
"n1 = Nemo()\n",
"n2 = Nemo()\n",
"n3 = Nemo()\n",
"\n",
"# n1 + n2\n",
"kk = n1 + n2 \n",
"kk + n3"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.9"
}
},
"nbformat": 4,
"nbformat_minor": 0
}