Source code for chaospy.distributions.collection.generalized_extreme

"""Generalized extreme value distribution."""
import numpy
from scipy import special

from ..baseclass import SimpleDistribution, ShiftScaleDistribution


class generalized_extreme(SimpleDistribution):
    """Generalized extreme value distribution."""

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

    def _lower(self, c):
        out = numpy.where(c == 0, -3.5, -numpy.expm1(c * 3.5) / c)
        out = numpy.where(c < 0, 1.0 / c, out)
        return out

    def _upper(self, c):
        out = numpy.where(c == 0, 25, -numpy.expm1(-c * 25) / c)
        out = numpy.where(c > 0, 1.0 / c, out)
        return out

    def _pdf(self, x, c):
        cx = c * x
        logex2 = numpy.where(c == 0, 0.0, numpy.log1p(-cx))
        logpex2 = numpy.where(c == 0, -x, logex2 / c)
        pex2 = numpy.exp(logpex2)
        logpdf = numpy.where(
            (cx == 1) | (cx == -numpy.inf), -numpy.inf, -pex2 + logpex2 - logex2
        )
        numpy.putmask(logpdf, (c == 1) & (x == 1), 0.0)
        return numpy.exp(logpdf)

    def _cdf(self, x, c):
        loglogcdf = numpy.where(c == 0, -x, numpy.log1p(-c * x) / c)
        return numpy.exp(-numpy.exp(loglogcdf))

    def _ppf(self, q, c):
        x = -numpy.log(-numpy.log(q))
        return numpy.where(c == 0, x, -numpy.expm1(-c * x) / c)


[docs]class GeneralizedExtreme(ShiftScaleDistribution): """ Generalized extreme value distribution. Also known as the Fisher-Tippett distribution. Args: shape (float, Distribution): Shape parameter scale (float, Distribution): Scaling parameter loc (float, Distribution): Location parameter Example: >>> distribution = chaospy.GeneralizedExtreme(0.5) >>> distribution GeneralizedExtreme(0.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([-9.509, -0.537, 0.086, 0.571, 1.055, 2. ]) >>> numpy.allclose(distribution.fwd(xloc), uloc) True >>> distribution.pdf(xloc).round(3) array([0. , 0.254, 0.383, 0.429, 0.378, 0. ]) >>> distribution.sample(4).round(3) array([ 0.696, -0.941, 1.548, 0.292]) """
[docs] def __init__(self, shape=0, scale=1, shift=0): super(GeneralizedExtreme, self).__init__( dist=generalized_extreme(shape), scale=scale, shift=shift, repr_args=[shape], )