class tf.contrib.distributions.DirichletMultinomial
See the guide: Statistical Distributions (contrib) > Multivariate distributions
DirichletMultinomial mixture distribution.
This distribution is parameterized by a vector alpha
of concentration parameters for k
classes and n
, the counts per each class..
The Dirichlet Multinomial is a distribution over k-class count data, meaning for each k-tuple of non-negative integer counts = [c_1,...,c_k]
, we have a probability of these draws being made from the distribution. The distribution has hyperparameters alpha = (alpha_1,...,alpha_k)
, and probability mass function (pmf):
pmf(counts) = N! / (n_1!...n_k!) * Beta(alpha + c) / Beta(alpha)
where above N = sum_j n_j
, N!
is N
factorial, and Beta(x) = prod_j Gamma(x_j) / Gamma(sum_j x_j)
is the multivariate beta function.
This is a mixture distribution in that M
samples can be produced by: 1. Choose class probabilities p = (p_1,...,p_k) ~ Dir(alpha)
2. Draw integers m = (n_1,...,n_k) ~ Multinomial(N, p)
This class provides methods to create indexed batches of Dirichlet Multinomial distributions. If the provided alpha
is rank 2 or higher, for every fixed set of leading dimensions, the last dimension represents one single Dirichlet Multinomial distribution. When calling distribution functions (e.g. dist.pmf(counts)
), alpha
and counts
are broadcast to the same shape (if possible). In all cases, the last dimension of alpha/counts represents single Dirichlet Multinomial distributions.
alpha = [1, 2, 3] n = 2 dist = DirichletMultinomial(n, alpha)
Creates a 3-class distribution, with the 3rd class is most likely to be drawn. The distribution functions can be evaluated on counts.
# counts same shape as alpha. counts = [0, 0, 2] dist.pmf(counts) # Shape [] # alpha will be broadcast to [[1, 2, 3], [1, 2, 3]] to match counts. counts = [[1, 1, 0], [1, 0, 1]] dist.pmf(counts) # Shape [2] # alpha will be broadcast to shape [5, 7, 3] to match counts. counts = [[...]] # Shape [5, 7, 3] dist.pmf(counts) # Shape [5, 7]
Creates a 2-batch of 3-class distributions.
alpha = [[1, 2, 3], [4, 5, 6]] # Shape [2, 3] n = [3, 3] dist = DirichletMultinomial(n, alpha) # counts will be broadcast to [[2, 1, 0], [2, 1, 0]] to match alpha. counts = [2, 1, 0] dist.pmf(counts) # Shape [2]
allow_nan_stats
Python boolean describing behavior when a stat is undefined.
Stats return +/- infinity when it makes sense. E.g., the variance of a Cauchy distribution is infinity. However, sometimes the statistic is undefined, e.g., if a distribution's pdf does not achieve a maximum within the support of the distribution, the mode is undefined. If the mean is undefined, then by definition the variance is undefined. E.g. the mean for Student's T for df = 1 is undefined (no clear way to say it is either + or - infinity), so the variance = E[(X - mean)^2] is also undefined.
allow_nan_stats
: Python boolean.alpha
Parameter defining this distribution.
alpha_sum
Summation of alpha parameter.
dtype
The DType
of Tensor
s handled by this Distribution
.
is_continuous
is_reparameterized
n
Parameter defining this distribution.
name
Name prepended to all ops created by this Distribution
.
parameters
Dictionary of parameters used to instantiate this Distribution
.
validate_args
Python boolean indicated possibly expensive checks are enabled.
__init__(n, alpha, validate_args=False, allow_nan_stats=True, name='DirichletMultinomial')
Initialize a batch of DirichletMultinomial distributions.
n
: Non-negative floating point tensor, whose dtype is the same as alpha
. The shape is broadcastable to [N1,..., Nm]
with m >= 0
. Defines this as a batch of N1 x ... x Nm
different Dirichlet multinomial distributions. Its components should be equal to integer values.alpha
: Positive floating point tensor, whose dtype is the same as n
with shape broadcastable to [N1,..., Nm, k]
m >= 0
. Defines this as a batch of N1 x ... x Nm
different k
class Dirichlet multinomial distributions.validate_args
: Boolean
, default False
. Whether to assert valid values for parameters alpha
and n
, and x
in prob
and log_prob
. If False
, correct behavior is not guaranteed.allow_nan_stats
: Boolean
, default True
. If False
, raise an exception if a statistic (e.g. mean/mode/etc...) is undefined for any batch member. If True
, batch members with valid parameters leading to undefined statistics will return NaN for this statistic.name
: The name to prefix Ops created by this distribution class.Examples:
# Define 1-batch of 2-class Dirichlet multinomial distribution, # also known as a beta-binomial. dist = DirichletMultinomial(2.0, [1.1, 2.0]) # Define a 2-batch of 3-class distributions. dist = DirichletMultinomial([3., 4], [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
batch_shape(name='batch_shape')
Shape of a single sample from a single event index as a 1-D Tensor
.
The product of the dimensions of the batch_shape
is the number of independent distributions of this kind the instance represents.
name
: name to give to the opbatch_shape
: Tensor
.cdf(value, name='cdf', **condition_kwargs)
Cumulative distribution function.
Given random variable X
, the cumulative distribution function cdf
is:
cdf(x) := P[X <= x]
value
: float
or double
Tensor
.name
: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.cdf
: a Tensor
of shape sample_shape(x) + self.batch_shape
with values of type self.dtype
.copy(**override_parameters_kwargs)
Creates a deep copy of the distribution.
Note: the copy distribution may continue to depend on the original intialization arguments.
**override_parameters_kwargs: String/value dictionary of initialization arguments to override with new values.
distribution
: A new instance of type(self)
intitialized from the union of self.parameters and override_parameters_kwargs, i.e., dict(self.parameters, **override_parameters_kwargs)
.entropy(name='entropy')
Shannon entropy in nats.
event_shape(name='event_shape')
Shape of a single sample from a single batch as a 1-D int32 Tensor
.
name
: name to give to the opevent_shape
: Tensor
.get_batch_shape()
Shape of a single sample from a single event index as a TensorShape
.
Same meaning as batch_shape
. May be only partially defined.
batch_shape
: TensorShape
, possibly unknown.get_event_shape()
Shape of a single sample from a single batch as a TensorShape
.
Same meaning as event_shape
. May be only partially defined.
event_shape
: TensorShape
, possibly unknown.is_scalar_batch(name='is_scalar_batch')
Indicates that batch_shape == []
.
name
: The name to give this op.is_scalar_batch
: Boolean
scalar
Tensor
.is_scalar_event(name='is_scalar_event')
Indicates that event_shape == []
.
name
: The name to give this op.is_scalar_event
: Boolean
scalar
Tensor
.log_cdf(value, name='log_cdf', **condition_kwargs)
Log cumulative distribution function.
Given random variable X
, the cumulative distribution function cdf
is:
log_cdf(x) := Log[ P[X <= x] ]
Often, a numerical approximation can be used for log_cdf(x)
that yields a more accurate answer than simply taking the logarithm of the cdf
when x << -1
.
value
: float
or double
Tensor
.name
: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.logcdf
: a Tensor
of shape sample_shape(x) + self.batch_shape
with values of type self.dtype
.log_pdf(value, name='log_pdf', **condition_kwargs)
Log probability density function.
value
: float
or double
Tensor
.name
: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.log_prob
: a Tensor
of shape sample_shape(x) + self.batch_shape
with values of type self.dtype
.TypeError
: if not is_continuous
.log_pmf(value, name='log_pmf', **condition_kwargs)
Log probability mass function.
value
: float
or double
Tensor
.name
: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.log_pmf
: a Tensor
of shape sample_shape(x) + self.batch_shape
with values of type self.dtype
.TypeError
: if is_continuous
.log_prob(value, name='log_prob', **condition_kwargs)
Log probability density/mass function (depending on is_continuous
).
Additional documentation from DirichletMultinomial
:
For each batch of counts [n_1,...,n_k]
, P[counts]
is the probability that after sampling n
draws from this Dirichlet Multinomial distribution, the number of draws falling in class j
is n_j
. Note that different sequences of draws can result in the same counts, thus the probability includes a combinatorial coefficient.
Note that input, "counts", must be a non-negative tensor with dtype dtype
and whose shape can be broadcast with self.alpha
. For fixed leading dimensions, the last dimension represents counts for the corresponding Dirichlet Multinomial distribution in self.alpha
. counts
is only legal if it sums up to n
and its components are equal to integer values.
value
: float
or double
Tensor
.name
: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.log_prob
: a Tensor
of shape sample_shape(x) + self.batch_shape
with values of type self.dtype
.log_survival_function(value, name='log_survival_function', **condition_kwargs)
Log survival function.
Given random variable X
, the survival function is defined:
log_survival_function(x) = Log[ P[X > x] ] = Log[ 1 - P[X <= x] ] = Log[ 1 - cdf(x) ]
Typically, different numerical approximations can be used for the log survival function, which are more accurate than 1 - cdf(x)
when x >> 1
.
value
: float
or double
Tensor
.name
: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.Tensor
of shape sample_shape(x) + self.batch_shape
with values of type self.dtype
.
mean(name='mean')
Mean.
mode(name='mode')
Mode.
param_shapes(cls, sample_shape, name='DistributionParamShapes')
Shapes of parameters given the desired shape of a call to sample()
.
Subclasses should override static method _param_shapes
.
sample_shape
: Tensor
or python list/tuple. Desired shape of a call to sample()
.name
: name to prepend ops with.dict
of parameter name to Tensor
shapes.
param_static_shapes(cls, sample_shape)
param_shapes with static (i.e. TensorShape) shapes.
sample_shape
: TensorShape
or python list/tuple. Desired shape of a call to sample()
.dict
of parameter name to TensorShape
.
ValueError
: if sample_shape
is a TensorShape
and is not fully defined.pdf(value, name='pdf', **condition_kwargs)
Probability density function.
value
: float
or double
Tensor
.name
: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.prob
: a Tensor
of shape sample_shape(x) + self.batch_shape
with values of type self.dtype
.TypeError
: if not is_continuous
.pmf(value, name='pmf', **condition_kwargs)
Probability mass function.
value
: float
or double
Tensor
.name
: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.pmf
: a Tensor
of shape sample_shape(x) + self.batch_shape
with values of type self.dtype
.TypeError
: if is_continuous
.prob(value, name='prob', **condition_kwargs)
Probability density/mass function (depending on is_continuous
).
Additional documentation from DirichletMultinomial
:
For each batch of counts [n_1,...,n_k]
, P[counts]
is the probability that after sampling n
draws from this Dirichlet Multinomial distribution, the number of draws falling in class j
is n_j
. Note that different sequences of draws can result in the same counts, thus the probability includes a combinatorial coefficient.
Note that input, "counts", must be a non-negative tensor with dtype dtype
and whose shape can be broadcast with self.alpha
. For fixed leading dimensions, the last dimension represents counts for the corresponding Dirichlet Multinomial distribution in self.alpha
. counts
is only legal if it sums up to n
and its components are equal to integer values.
value
: float
or double
Tensor
.name
: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.prob
: a Tensor
of shape sample_shape(x) + self.batch_shape
with values of type self.dtype
.sample(sample_shape=(), seed=None, name='sample', **condition_kwargs)
Generate samples of the specified shape.
Note that a call to sample()
without arguments will generate a single sample.
sample_shape
: 0D or 1D int32
Tensor
. Shape of the generated samples.seed
: Python integer seed for RNGname
: name to give to the op. **condition_kwargs: Named arguments forwarded to subclass implementation.samples
: a Tensor
with prepended dimensions sample_shape
.std(name='std')
Standard deviation.
survival_function(value, name='survival_function', **condition_kwargs)
Survival function.
Given random variable X
, the survival function is defined:
survival_function(x) = P[X > x] = 1 - P[X <= x] = 1 - cdf(x).
value
: float
or double
Tensor
.name
: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.Tensorof shape
sample_shape(x) + self.batch_shapewith values of type
self.dtype`.
variance(name='variance')
Variance.
Additional documentation from DirichletMultinomial
:
The variance for each batch member is defined as the following:
Var(X_j) = n * alpha_j / alpha_0 * (1 - alpha_j / alpha_0) * (n + alpha_0) / (1 + alpha_0)
where alpha_0 = sum_j alpha_j
.
The covariance between elements in a batch is defined as:
Cov(X_i, X_j) = -n * alpha_i * alpha_j / alpha_0 ** 2 * (n + alpha_0) / (1 + alpha_0)
Defined in tensorflow/contrib/distributions/python/ops/dirichlet_multinomial.py
.
© 2017 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/contrib/distributions/DirichletMultinomial