``````

In [19]:

import thinkbayes2
import thinkplot

``````
``````

In [78]:

class Socks(thinkbayes2.Suite):

def __init__(self, hypos):
"""Inits a Sock object.

hypos: sequence or map of number of pairs in the drawer

matched: number of matched socks that have been picked
unmatched: number of unmatched socks that have been picked
"""
thinkbayes2.Suite.__init__(self, hypos)
self.matched = 0
self.unmatched = 0

def Update(self, data):
"""Updates the suite based on data.

data: 'u' if we picked an unmatched sock, 'm' otherwise
"""
thinkbayes2.Suite.Update(self, data)
if data == 'u':
self.unmatched += 1
else:
self.matched += 1

def Likelihood(self, data, hypo):
"""Computes the likelihood of the data under the hypothesis.

data: 'u' if we picked an unmatched sock, 'm' otherwise
hypo: hypothetical number of pairs
"""
n_pairs = hypo
n_socks = 2 * n_pairs - self.matched - self.unmatched
if n_socks <= 0:
return 0

n_singletons = self.unmatched - self.matched
p = n_singletons / n_socks

like = 1-p if data == 'u' else p
return like

``````
``````

In [79]:

prior_n_pairs = thinkbayes2.MakePoissonPmf(12, 30)
suite = Socks(prior_n_pairs)
thinkplot.Hist(suite)
thinkplot.Config(xlabel='# pairs', ylabel='PMF', xlim=[0, 30])

``````
``````

``````
``````

In [80]:

suite = Socks(hypos)
for datum in 'u' * 11:
suite.Update('u')
thinkplot.Hist(suite)
thinkplot.Config(xlabel='# pairs', ylabel='PMF', xlim=[0, 30])

``````
``````

``````
``````

In [91]:

class Socks2(Socks, thinkbayes2.Joint):

def Likelihood(self, data, hypo):
"""Computes the likelihood of the data under the hypothesis.

data: 'u' if we picked an unmatched sock, 'm' otherwise
hypo: hypothetical number of pairs, number of odds
"""
n_pairs, n_odds = hypo
n_socks = 2 * n_pairs + n_odds - self.matched - self.unmatched
if n_socks <= 0:
return 0

n_singletons = self.unmatched - self.matched
p = n_singletons / n_socks

like = 1-p if data == 'u' else p
return like

``````
``````

In [92]:

prior_n_odds = thinkbayes2.MakePoissonPmf(3, 30)
thinkplot.Hist(prior_n_odds)
thinkplot.Config(xlabel='# odds', ylabel='PMF', xlim=[0, 30])

``````
``````

``````
``````

In [93]:

joint = thinkbayes2.MakeJoint(prior_n_pairs, prior_n_odds)
suite = Socks2(joint)
for datum in 'u' * 11:
suite.Update('u')

``````
``````

In [94]:

post_n_pairs = suite.Marginal(0)
thinkplot.Hist(post_n_pairs)
thinkplot.Config(xlabel='# pairs', ylabel='PMF', xlim=[0, 30])

``````
``````

``````
``````

In [96]:

post_n_odds = suite.Marginal(1)
thinkplot.Hist(post_n_odds)
thinkplot.Config(xlabel='# odds', ylabel='PMF', xlim=[0, 30])

``````
``````

``````
``````

In [ ]:

``````