Source code for chaospy.distributions.collection.double_weibull

"""Double Weibull distribution."""
import numpy
from scipy import special

from ..baseclass import SimpleDistribution, ShiftScaleDistribution


class double_weibull(SimpleDistribution):
    """Double weibull distribution."""

    def __init__(self, c):
        super(double_weibull, self).__init__(dict(c=c))

    def _pdf(self, x, c):
        ax = numpy.abs(x)
        Px = c / 2.0 * ax ** (c - 1.0) * numpy.exp(-(ax**c))
        return Px

    def _cdf(self, x, c):
        Cx1 = 0.5 * numpy.exp(-abs(x) ** c)
        return numpy.where(x > 0, 1 - Cx1, Cx1)

    def _ppf(self, q, c):
        q_ = numpy.where(q > 0.5, 1 - q, q)
        Cq1 = numpy.where(q_ == 0, self._upper(c), 1)
        Cq1 = numpy.where((q != 0) & (c != 0), (-numpy.log(2 * q_)) ** (1.0 / c), Cq1)
        return numpy.where(q > 0.5, Cq1, -Cq1)

    def _lower(self, c):
        return -((-numpy.log(2e-10)) ** (1.0 / c))

    def _upper(self, c):
        return (-numpy.log(2e-10)) ** (1.0 / c)


[docs]class DoubleWeibull(ShiftScaleDistribution): """ Double Weibull distribution. Args: shape (float, Distribution): Shape parameter scale (float, Distribution): Scaling parameter shift (float, Distribution): Location parameter Examples: >>> distribution = chaospy.DoubleWeibull(1.5) >>> distribution DoubleWeibull(1.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([-7.93 , -0.943, -0.368, 0.368, 0.943, 7.93 ]) >>> numpy.allclose(distribution.fwd(xloc), uloc) True >>> distribution.pdf(xloc).round(3) array([0. , 0.291, 0.364, 0.364, 0.291, 0. ]) >>> distribution.sample(4).round(3) array([ 0.513, -1.293, 1.747, -0.11 ]) """
[docs] def __init__(self, shape=1, scale=1, shift=0): super(DoubleWeibull, self).__init__( dist=double_weibull(shape), scale=scale, shift=shift, repr_args=[shape], )