User Tools

Site Tools


cs401r_w2016:lab3

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
cs401r_w2016:lab3 [2015/12/23 20:18]
admin
cs401r_w2016:lab3 [2021/06/30 23:42] (current)
Line 1: Line 1:
-===Objective:​===+====Objective:​====
  
 To understand how to sample from different distributions,​ and to To understand how to sample from different distributions,​ and to
Line 6: Line 6:
 a small library of random variable types. a small library of random variable types.
  
-===Deliverable:​===+---- 
 +====Deliverable:​====
  
 You should turn in an ipython notebook that implements and tests a You should turn in an ipython notebook that implements and tests a
Line 18: Line 19:
 {{:​cs401r_w2016:​lab3.png?​nolink|}} {{:​cs401r_w2016:​lab3.png?​nolink|}}
  
-{{:cs401r_w2016:​lab3.png?​direct&​200|}}+For multidimensional variables, your visualization should convey information in a natural way; you can either use 3d surfaces, or 2d contour plots:
  
-===Description:===+{{:cs401r_w2016:​lab3_2d.png?​nolink|}}
  
-You must implement:+---- 
 +====Description:====
  
-* The following one dimensional,​ continuous valued distributions.  For +You must implement seven random variable objects.  For each type, you should ​be able to sample from that distribution,​ and compute ​the log-likelihood ​of a particular value. ​ All of your classes should inherit from a base random variable ​object that supports ​the following methods:
-these, you should ​also plot the PDF of the random variable ​on the  +
-same plot; the curves should match.+
  
-  ​* ''​Beta (alpha=1, beta=3)''​+<code python>​ 
 + 
 +class RandomVariable:​ 
 +    def __init__( self ): 
 +        self.state = None 
 +        pass 
 + 
 +    def get( self ): 
 +        return self.state 
 + 
 +    def sample( self ): 
 +        pass 
 + 
 +    def log_likelihood( self ): 
 +        pass 
 + 
 +    def propose( self ): 
 +        pass 
 +         
 +</​code>​ 
 + 
 +You don't need to implement the ''​get''​ or ''​propose''​ methods yet.  For example, your univariate Gaussian class might look like this: 
 + 
 +<code python>​ 
 + 
 +class Gaussian( RandomVariable ): 
 +    def __init__( self, mu, sigma ): 
 +        self.mu = mu 
 +        self.sigma = sigma 
 +        self.state = 0 
 + 
 +    def sample( self ): 
 +        return self.mu + self.sigma * numpy.Random.randn() 
 + 
 +    def log_likelihood( self, X, mu, sigma ): 
 +        return -numpy.log( sigma*numpy.sqrt(2*pi) ) - (X-mu)**2/​(sigma**2) 
 +         
 +</​code>​ 
 + 
 +**Given that framework, you should implement:​** 
 + 
 +* The following one dimensional,​ continuous valued distributions. ​ To visualize 
 +these, you should plot a histogram of sampled values, and also plot the PDF of the random variable on the  
 +same axis; they should (roughly) match. //Note: it is **not** sufficient to let seaborn estimate the PDF using its built-in KDE estimator; you need to plot the true PDF.  In other words, you can't just use seaborn.kdeplot!//​ 
 + 
 +  ​* ''​Beta (a=1, b=3)''​
   * ''​Poisson (lambda=7)''​   * ''​Poisson (lambda=7)''​
   * ''​Univariate Gaussian (mean=2, variance=3)''​   * ''​Univariate Gaussian (mean=2, variance=3)''​
Line 34: Line 79:
 * The following discrete distributions. ​ For these, plot predicted and * The following discrete distributions. ​ For these, plot predicted and
 empirical histograms side-by-side:​ empirical histograms side-by-side:​
-  * ''​Bernoulli (p=0.7)''​ +  * ''​Bernoulli (p=0.7)'' ​(hint: you may need a uniform random number) 
-  * ''​Multinomial (theta=[0.1, 0.2, 0.7])''​+  * ''​Multinomial (pvals=[0.1, 0.2, 0.7])''​
  
-* The following multidimensional distributions. +* The following multidimensional distributions. ​For these, use a contour or surface plot to visualize the empirical distribution of samples vs. the PDF: 
-  * Two-dimensional ​Gaussian +  * ''​Multivariate ​Gaussian ​( mean=[2.0,​3.0],​ cov=[[1.0,​0.9],​[0.9,​1.0]] )''​ 
-  * 3-dimensional ​Dirichlet+  * ''​Dirichlet ​( alpha=[ 0.1, 0.2, 0.7 ] )''​
  
-===Hints:​===+**Important notes:** 
 + 
 +**You //may// use [[http://​docs.scipy.org/​doc/​numpy-1.10.0/​reference/​routines.random.html|numpy.random]] to sample from the appropriate distributions.** 
 + 
 +**You may //not// use any existing code to calculate the log-likelihoods.** ​ But you can, of course, use any online resources or the book to find the appropriate definition of each PDF. 
 + 
 +---- 
 +====Hints:====
  
 The following functions may be useful to you: The following functions may be useful to you:
  
 <code python> <code python>
 +
 +numpy.random
 +
 +matplotlib.pyplot.contour
 +
 +seaborn.kdeplot
 +
 +seaborn.jointplot
  
 hist( data, bins=50, normed=True ) hist( data, bins=50, normed=True )
Line 56: Line 116:
  
 </​code>​ </​code>​
- 
  
cs401r_w2016/lab3.1450901893.txt.gz · Last modified: 2021/06/30 23:40 (external edit)