Source code for mixem.distribution.distribution
import abc
[docs]class Distribution(object):
"""
Base class for a mixEM probability distribution.
To define your own new distribution, all methods of this class will have to be implemented.
"""
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
[docs] def log_density(self, data):
"""Compute the log-probability density :math:`\log P(x|\phi)`
:param data: The data :math:`x` to compute a probability density for. A :math:`(N \\times D)` :class:`numpy.ndarray` where N is the number of examples and D is the dimensionality of the data
:type data: numpy.ndarray
:returns: The log-probability for observing the data, given the probability distribution's parameters
:rtype: float
"""
raise NotImplementedError("Need to implement density calculation!")
@abc.abstractmethod
[docs] def estimate_parameters(self, data, weights):
"""Estimate the probabilities' parameters using weighted maximum-likelihood estimation and update parameters in-place.
:param data: The data :math:`x` to estimate parameters for. A :math:`(N \\times D)` :class:`numpy.ndarray` where N is the number of examples and D is the dimensionality of the data
:type data: numpy.ndarray
:param weights: The weights :math:`\gamma` for individual data points. A N-element :class:`numpy.ndarray` where N is the number of examples.
Choose those parameters :math:`\phi` that maximize the weighted log-likelihood function:
.. math::
ll_\gamma(x|\phi) = \sum_{n=1}^N \gamma_{n} \log [P(x|\phi)]
Generally, this will involve differentiating the log-likelihood function for all parameters.
You can set the derivative of the gradient to 0 and try to solve for the parameter to find
a closed-form solution for the maximum-likelihood estimate or use a numerical optimizer to
find the maximum-likelihood parameter.
Once parameter estimates are found, update the attributes *in place*.
"""
raise NotImplementedError("Need to implement parameter estimation!")
@abc.abstractmethod
def __repr__(self):
"""Create a string representation of the probability distribution"""
raise NotImplementedError("Need to implement string representation!")