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 [ ]: