This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
cs401r_w2016:lab3 [2015/12/23 20:44] 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 22: | Line 23: | ||
{{:cs401r_w2016:lab3_2d.png?nolink|}} | {{:cs401r_w2016:lab3_2d.png?nolink|}} | ||
- | ===Description:=== | + | ---- |
+ | ====Description:==== | ||
- | You must implement: | + | 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: |
- | * The following one dimensional, continuous valued distributions. For | + | <code python> |
- | these, you should also plot the PDF of the random variable on the | + | |
- | same plot; the curves should 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!// | + | 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 (alpha=1, beta=3)'' | + | * ''Beta (a=1, b=3)'' |
* ''Poisson (lambda=7)'' | * ''Poisson (lambda=7)'' | ||
* ''Univariate Gaussian (mean=2, variance=3)'' | * ''Univariate Gaussian (mean=2, variance=3)'' | ||
Line 36: | 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. For these, | + | * 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 | matplotlib.pyplot.contour | ||
Line 64: | Line 116: | ||
</code> | </code> | ||
- | |||