"""Levy distribution."""
import numpy
from scipy import special
from ..baseclass import SimpleDistribution, ShiftScaleDistribution
class levy(SimpleDistribution):
"""Levy distribution."""
def __init__(self):
super(levy, self).__init__()
def _pdf(self, x):
out = 1 / numpy.sqrt(2 * numpy.pi * x) / x * numpy.exp(-1 / (2 * x))
out[x == 0] = 0
return out
def _cdf(self, x):
return 2 * (1 - special.ndtr(1 / numpy.sqrt(x)))
def _ppf(self, q):
val = special.ndtri(1 - q / 2.0)
return 1.0 / (val * val)
def _upper(self):
return 1e12
def _lower(self):
return 0.0
[docs]class Levy(ShiftScaleDistribution):
"""
Levy distribution
Args:
scale (float, Distribution):
Scaling parameter
shift (float, Distribution):
Location parameter
Examples:
>>> distribution = chaospy.Levy()
>>> distribution
Levy()
>>> uloc = numpy.linspace(0, 1, 6)
>>> uloc
array([0. , 0.2, 0.4, 0.6, 0.8, 1. ])
>>> xloc = distribution.inv(uloc)
>>> xloc[:5].round(3)
array([ 0. , 0.609, 1.412, 3.636, 15.58 ])
>>> distribution.upper
array([1.e+12])
>>> numpy.allclose(distribution.fwd(xloc), uloc)
True
>>> distribution.pdf(xloc).round(3)
array([0. , 0.369, 0.167, 0.05 , 0.006, 0. ])
>>> distribution.sample(4).round(3)
array([ 4.965, 0.403, 257.22 , 2.025])
"""
[docs] def __init__(self, scale=1, shift=0):
super(Levy, self).__init__(
dist=levy(),
scale=scale,
shift=shift,
)