def transform_by_kumaraswamy(x, feature_ndims, example_ndims): """Apply a Kumaraswamy bijector to features.""" concentration1 = util.pad_shape_with_ones( self.concentration1, example_ndims, start=-(feature_ndims + 1)) concentration0 = util.pad_shape_with_ones( self.concentration0, example_ndims, start=-(feature_ndims + 1)) bij = kumaraswamy_cdf.KumaraswamyCDF( concentration1, concentration0, validate_args=validate_args) return bij.forward(x)
def __init__(self, concentration1=1., concentration0=1., validate_args=False, allow_nan_stats=True, name='Kumaraswamy'): """Initialize a batch of Kumaraswamy distributions. Args: concentration1: Positive floating-point `Tensor` indicating mean number of successes; aka 'alpha'. Implies `self.dtype` and `self.batch_shape`, i.e., `concentration1.shape = [N1, N2, ..., Nm] = self.batch_shape`. concentration0: Positive floating-point `Tensor` indicating mean number of failures; aka 'beta'. Otherwise has same semantics as `concentration1`. validate_args: Python `bool`, default `False`. When `True` distribution parameters are checked for validity despite possibly degrading runtime performance. When `False` invalid inputs may silently render incorrect outputs. allow_nan_stats: Python `bool`, default `True`. When `True`, statistics (e.g., mean, mode, variance) use the value '`NaN`' to indicate the result is undefined. When `False`, an exception is raised if one or more of the statistic's batch members are undefined. name: Python `str` name prefixed to Ops created by this class. """ parameters = dict(locals()) with tf.name_scope(name) as name: dtype = dtype_util.common_dtype([concentration1, concentration0], dtype_hint=tf.float32) concentration1 = tensor_util.convert_nonref_to_tensor( concentration1, name='concentration1', dtype=dtype) concentration0 = tensor_util.convert_nonref_to_tensor( concentration0, name='concentration0', dtype=dtype) self._kumaraswamy_cdf = kumaraswamy_cdf.KumaraswamyCDF( concentration1=concentration1, concentration0=concentration0, validate_args=validate_args) batch_shape = distribution_util.get_broadcast_shape( concentration1, concentration0) super(Kumaraswamy, self).__init__( # TODO(b/137665504): Use batch-adding meta-distribution to set the # batch shape instead of tf.zeros. distribution=uniform.Uniform( low=tf.zeros(batch_shape, dtype=dtype), high=tf.ones([], dtype=dtype), allow_nan_stats=allow_nan_stats), bijector=invert.Invert( self._kumaraswamy_cdf, validate_args=validate_args), parameters=parameters, name=name)