# tf.contrib.distributions.DirichletMultinomial

### class tf.contrib.distributions.DirichletMultinomial

DirichletMultinomial mixture distribution.

This distribution is parameterized by a vector alpha of concentration parameters for k classes and n, the counts per each class..

#### Mathematical details

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.

#### Examples

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]


## Properties

### 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.

#### Returns:

• allow_nan_stats: Python boolean.

### alpha

Parameter defining this distribution.

### alpha_sum

Summation of alpha parameter.

### dtype

The DType of Tensors handled by this Distribution.

### 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.

## Methods

### __init__(n, alpha, validate_args=False, allow_nan_stats=True, name='DirichletMultinomial')

Initialize a batch of DirichletMultinomial distributions.

#### Args:

• 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.

#### Args:

• name: name to give to the op

#### Returns:

• batch_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]


#### Args:

• value: float or double Tensor.
• name: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.

#### Returns:

• 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.

#### Args:

**override_parameters_kwargs: String/value dictionary of initialization arguments to override with new values.

#### Returns:

• 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.

#### Args:

• name: name to give to the op

#### Returns:

• event_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.

#### Returns:

• 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.

#### Returns:

• event_shape: TensorShape, possibly unknown.

### is_scalar_batch(name='is_scalar_batch')

Indicates that batch_shape == [].

#### Args:

• name: The name to give this op.

#### Returns:

• is_scalar_batch: Boolean scalar Tensor.

### is_scalar_event(name='is_scalar_event')

Indicates that event_shape == [].

#### Args:

• name: The name to give this op.

#### Returns:

• 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.

#### Args:

• value: float or double Tensor.
• name: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.

#### Returns:

• 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.

#### Args:

• value: float or double Tensor.
• name: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.

#### Returns:

• log_prob: a Tensor of shape sample_shape(x) + self.batch_shape with values of type self.dtype.

#### Raises:

• TypeError: if not is_continuous.

### log_pmf(value, name='log_pmf', **condition_kwargs)

Log probability mass function.

#### Args:

• value: float or double Tensor.
• name: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.

#### Returns:

• log_pmf: a Tensor of shape sample_shape(x) + self.batch_shape with values of type self.dtype.

#### Raises:

• 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.

#### Args:

• value: float or double Tensor.
• name: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.

#### Returns:

• 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.

#### Args:

• value: float or double Tensor.
• name: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.

#### Returns:

Tensor of shape sample_shape(x) + self.batch_shape with values of type self.dtype.

Mean.

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.

#### Args:

• sample_shape: Tensor or python list/tuple. Desired shape of a call to sample().
• name: name to prepend ops with.

#### Returns:

dict of parameter name to Tensor shapes.

### param_static_shapes(cls, sample_shape)

param_shapes with static (i.e. TensorShape) shapes.

#### Args:

• sample_shape: TensorShape or python list/tuple. Desired shape of a call to sample().

#### Returns:

dict of parameter name to TensorShape.

#### Raises:

• ValueError: if sample_shape is a TensorShape and is not fully defined.

### pdf(value, name='pdf', **condition_kwargs)

Probability density function.

#### Args:

• value: float or double Tensor.
• name: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.

#### Returns:

• prob: a Tensor of shape sample_shape(x) + self.batch_shape with values of type self.dtype.

#### Raises:

• TypeError: if not is_continuous.

### pmf(value, name='pmf', **condition_kwargs)

Probability mass function.

#### Args:

• value: float or double Tensor.
• name: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.

#### Returns:

• pmf: a Tensor of shape sample_shape(x) + self.batch_shape with values of type self.dtype.

#### Raises:

• 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.

#### Args:

• value: float or double Tensor.
• name: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.

#### Returns:

• 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.

#### Args:

• sample_shape: 0D or 1D int32 Tensor. Shape of the generated samples.
• seed: Python integer seed for RNG
• name: name to give to the op. **condition_kwargs: Named arguments forwarded to subclass implementation.

#### Returns:

• 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).


#### Args:

• value: float or double Tensor.
• name: The name to give this op. **condition_kwargs: Named arguments forwarded to subclass implementation.

#### Returns:

Tensorof shapesample_shape(x) + self.batch_shapewith values of typeself.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)
`