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:10]
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|}}
  
 +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.+
  
-''​ +<code python>​ 
-Beta (alpha=1, beta=3) + 
-Poisson (lambda=7) +class RandomVariable:​ 
-Univariate Gaussian (mean=2, variance=3) +    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)''​ 
 +  * ''​Univariate Gaussian (mean=2, variance=3)''​
  
 * 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)''​ (hint: you may need a uniform random number) 
 +  * ''​Multinomial (pvals=[0.1,​ 0.2, 0.7])''​
  
-''​ +* The following multidimensional distributions. For these, use a contour or surface plot to visualize the empirical distribution of samples vs. the PDF: 
-Bernoulli ​(p=0.7+  * ''​Multivariate Gaussian ​mean=[2.0,3.0], cov=[[1.0,​0.9],​[0.9,​1.0]] ​)''​ 
-Multinomial ​(theta=[0.1, 0.2, 0.7]) +  * ''​Dirichlet ​alpha=[ 0.1, 0.2, 0.7 ] )''​
-''​+
  
-The following multidimensional distributions.+**Important notes:**
  
-Two-dimensional Gaussian +**You //may// use [[http://​docs.scipy.org/​doc/​numpy-1.10.0/​reference/​routines.random.html|numpy.random]] to sample from the appropriate distributions.**
-3-dimensional Dirichlet+
  
-===Hints:​===+**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 61: Line 116:
  
 </​code>​ </​code>​
- 
  
cs401r_w2016/lab3.1450901443.txt.gz · Last modified: 2021/06/30 23:40 (external edit)