class tf.contrib.distributions.Distribution
See the guide: Statistical Distributions (contrib) > Base classes
A generic probability distribution base class.
Distribution
is a base class for constructing and organizing properties (e.g., mean, variance) of random variables (e.g, Bernoulli, Gaussian).
Subclasses are expected to implement a leading-underscore version of the same-named function. The argument signature should be identical except for the omission of name="..."
. For example, to enable log_prob(value, name="log_prob")
a subclass should implement _log_prob(value)
.
Subclasses can append to public-level docstrings by providing docstrings for their method specializations. For example:
@distribution_util.AppendDocstring("Some other details.") def _log_prob(self, value): ...
would add the string "Some other details." to the log_prob
function docstring. This is implemented as a simple decorator to avoid python linter complaining about missing Args/Returns/Raises sections in the partial docstrings.
All distributions support batches of independent distributions of that type. The batch shape is determined by broadcasting together the parameters.
The shape of arguments to __init__
, cdf
, log_cdf
, prob
, and log_prob
reflect this broadcasting, as does the return value of sample
and sample_n
.
sample_n_shape = (n,) + batch_shape + event_shape
, where sample_n_shape
is the shape of the Tensor
returned from sample_n
, n
is the number of samples, batch_shape
defines how many independent distributions there are, and event_shape
defines the shape of samples from each of those independent distributions. Samples are independent along the batch_shape
dimensions, but not necessarily so along the event_shape
dimensions (depending on the particulars of the underlying distribution).
Using the Uniform
distribution as an example:
minval = 3.0 maxval = [[4.0, 6.0], [10.0, 12.0]] # Broadcasting: # This instance represents 4 Uniform distributions. Each has a lower bound at # 3.0 as the `minval` parameter was broadcasted to match `maxval`'s shape. u = Uniform(minval, maxval) # `event_shape` is `TensorShape([])`. event_shape = u.get_event_shape() # `event_shape_t` is a `Tensor` which will evaluate to []. event_shape_t = u.event_shape # Sampling returns a sample per distribution. `samples` has shape # (5, 2, 2), which is (n,) + batch_shape + event_shape, where n=5, # batch_shape=(2, 2), and event_shape=(). samples = u.sample_n(5) # The broadcasting holds across methods. Here we use `cdf` as an example. The # same holds for `log_cdf` and the likelihood functions. # `cum_prob` has shape (2, 2) as the `value` argument was broadcasted to the # shape of the `Uniform` instance. cum_prob_broadcast = u.cdf(4.0) # `cum_prob`'s shape is (2, 2), one per distribution. No broadcasting # occurred. cum_prob_per_dist = u.cdf([[4.0, 5.0], [6.0, 7.0]]) # INVALID as the `value` argument is not broadcastable to the distribution's # shape. cum_prob_invalid = u.cdf([4.0, 5.0, 6.0])
Some distributions do not have well-defined statistics for all initialization parameter values. For example, the beta distribution is parameterized by positive real numbers a
and b
, and does not have well-defined mode if a < 1
or b < 1
.
The user is given the option of raising an exception or returning NaN
.
a = tf.exp(tf.matmul(logits, weights_a)) b = tf.exp(tf.matmul(logits, weights_b)) # Will raise exception if ANY batch member has a < 1 or b < 1. dist = distributions.beta(a, b, allow_nan_stats=False) mode = dist.mode().eval() # Will return NaN for batch members with either a < 1 or b < 1. dist = distributions.beta(a, b, allow_nan_stats=True) # Default behavior mode = dist.mode().eval()
In all cases, an exception is raised if invalid parameters are passed, e.g.
# Will raise an exception if any Op is run. negative_a = -1.0 * a # beta distribution by definition has a > 0. dist = distributions.beta(negative_a, b, allow_nan_stats=True) dist.mean().eval()
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.dtype
The DType
of Tensor
s handled by this Distribution
.
is_continuous
is_reparameterized
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__(dtype, is_continuous, is_reparameterized, validate_args, allow_nan_stats, parameters=None, graph_parents=None, name=None)
Constructs the Distribution
.
This is a private method for subclass use.
dtype
: The type of the event samples. None
implies no type-enforcement.is_continuous
: Python boolean. If True
this Distribution
is continuous over its supported domain.is_reparameterized
: Python boolean. If True
this Distribution
can be reparameterized in terms of some standard distribution with a function whose Jacobian is constant for the support of the standard distribution.validate_args
: Python boolean. Whether to validate input with asserts. If validate_args
is False
, and the inputs are invalid, correct behavior is not guaranteed.allow_nan_stats
: Python boolean. If False
, raise an exception if a statistic (e.g., mean, mode) is undefined for any batch member. If True, batch members with valid parameters leading to undefined statistics will return NaN
for this statistic.parameters
: Python dictionary of parameters used to instantiate this Distribution
.graph_parents
: Python list of graph prerequisites of this Distribution
.name
: A name for this distribution. Default: subclass name.ValueError
: if any member of graph_parents is None
or not a Tensor
.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
).
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
).
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.
Defined in tensorflow/contrib/distributions/python/ops/distribution.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/Distribution