Source code for chaospy.distributions.collection.generalized_exponential

"""Generalized exponential distribution."""
import numpy
from scipy import special
import chaospy

from ..baseclass import SimpleDistribution, ShiftScaleDistribution


class generalized_exponential(SimpleDistribution):
    """Generalized exponential distribution."""

    def __init__(self, a=1, b=1, c=1):
        super(generalized_exponential, self).__init__(dict(a=a, b=b, c=c))

    def _pdf(self, x, a, b, c):
        return (a + b * (-numpy.expm1(-c * x))) * numpy.exp(
            (-a - b) * x + b * (-numpy.expm1(-c * x)) / c
        )

    def _cdf(self, x, a, b, c):
        output = -numpy.expm1((-a - b) * x + b * (-numpy.expm1(-c * x)) / c)
        output = numpy.where(x > 0, output, 0)
        return output

    def _lower(self, a, b, c):
        return 0.0

    def _upper(self, a, b, c):
        qloc, a, b, c = numpy.broadcast_arrays(1 - 1e-12, a, b, c)
        return chaospy.approximate_inverse(
            distribution=self,
            idx=0,
            qloc=qloc,
            parameters=dict(a=a, b=b, c=c),
            bounds=(0.0, 500.0 / a / b / c),
            tolerance=1e-15,
        )


[docs]class GeneralizedExponential(ShiftScaleDistribution): """ Generalized exponential distribution. Args: a (float, Distribution): First shape parameter b (float, Distribution): Second shape parameter c (float, Distribution): Third shape parameter scale (float, Distribution): Scaling parameter shift (float, Distribution): Location parameter Note: "An Extension of Marshall and Olkin's Bivariate Exponential Distribution", H.K. Ryu, Journal of the American Statistical Association, 1993. "The Exponential Distribution: Theory, Methods and Applications", N. Balakrishnan, Asit P. Basu. Examples: >>> distribution = chaospy.GeneralizedExponential(3, 4, 5) >>> distribution GeneralizedExponential(3, 4, 5) >>> uloc = numpy.linspace(0, 1, 6) >>> uloc array([0. , 0.2, 0.4, 0.6, 0.8, 1. ]) >>> xloc = distribution.inv(uloc) >>> xloc.round(3) array([0. , 0.063, 0.127, 0.204, 0.321, 4.062]) >>> numpy.allclose(distribution.fwd(xloc), uloc) True >>> distribution.pdf(xloc).round(3) array([3. , 3.26 , 2.925, 2.223, 1.24 , 0. ]) >>> distribution.sample(4).round(3) array([0.08 , 0.316, 0.318, 0.003]) """
[docs] def __init__(self, a=1, b=1, c=1, scale=1, shift=0): super(GeneralizedExponential, self).__init__( dist=generalized_exponential(a, b, c), scale=scale, shift=shift, repr_args=[a, b, c], )