Source code for chaospy.distributions.collection.log_normal

"""Log-Normal probability distribution."""
import numpy
from scipy import special

from ..baseclass import SimpleDistribution, ShiftScaleDistribution


class log_normal(SimpleDistribution):
    def __init__(self, a=1):
        super(log_normal, self).__init__(dict(a=a))

    def _lower(self, a):
        return 0.0

    def _upper(self, a):
        return numpy.e ** (a * 6.37)

    def _pdf(self, x, a):
        out = (
            numpy.e ** (-numpy.log(x + (1 - x) * (x <= 0)) ** 2 / (2 * a * a))
            / ((x + (1 - x) * (x <= 0)) * a * numpy.sqrt(2 * numpy.pi))
            * (x > 0)
        )
        return out

    def _cdf(self, x, a):
        return special.ndtr(numpy.log(x + (1 - x) * (x <= 0)) / a) * (x > 0)

    def _ppf(self, x, a):
        return numpy.e ** (a * special.ndtri(x))

    def _mom(self, k, a):
        return numpy.e ** (0.5 * a * a * k * k)

    def _ttr(self, n, a):
        """Stieltjes-Wigert."""
        return (
            (numpy.e ** (n * a * a) * (numpy.e ** (a * a) + 1) - 1)
            * numpy.e ** (0.5 * (2 * n - 1) * a * a),
            (numpy.e ** (n * a * a) - 1) * numpy.e ** ((3 * n - 2) * a * a),
        )


[docs]class LogNormal(ShiftScaleDistribution): R""" Log-normal distribution Args: mu (float, Distribution): Mean in the normal distribution. Overlaps with scale by mu=log(scale) sigma (float, Distribution): Standard deviation of the normal distribution. shift (float, Distribution): Location of the lower bound. scale (float, Distribution): Scale parameter. Overlaps with mu by scale=e**mu Examples: >>> distribution = chaospy.LogNormal(0, 0.1) >>> distribution LogNormal(mu=0, sigma=0.1) >>> 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.919, 0.975, 1.026, 1.088, 1.891]) >>> numpy.allclose(distribution.fwd(xloc), uloc) True >>> distribution.pdf(xloc).round(3) array([0. , 3.045, 3.963, 3.767, 2.574, 0. ]) >>> distribution.sample(4).round(3) array([1.04 , 0.887, 1.179, 0.996]) >>> distribution.mom(1).round(3) 1.005 >>> distribution.ttr([0, 1, 2, 3]).round(3) array([[1.005, 1.035, 1.067, 1.098], [0. , 0.01 , 0.021, 0.033]]) """
[docs] def __init__(self, mu=0, sigma=1, shift=0, scale=1): dist = ShiftScaleDistribution(dist=log_normal(sigma), scale=numpy.e**mu) super(LogNormal, self).__init__( dist=dist, scale=scale, shift=shift, repr_args=["mu=%s" % mu, "sigma=%s" % sigma], )
class Gilbrat(ShiftScaleDistribution): """ Gilbrat distribution. Standard log-normal distribution Args: scale (float, Distribution): Scaling parameter shift (float, Distribution): Location parameter Examples: >>> distribution = chaospy.Gilbrat(scale=0.0015) >>> distribution Gilbrat(scale=0.0015) >>> 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.001, 0.001, 0.002, 0.003, 0.876]) >>> numpy.allclose(distribution.fwd(xloc), uloc) True >>> distribution.pdf(xloc).round(3) array([ 0. , 433.031, 331.825, 199.919, 80.444, 0. ]) >>> distribution.sample(4).round(4) array([0.0022, 0.0005, 0.0078, 0.0014]) >>> distribution.mom(1).round(8) 0.00247308 >>> distribution.ttr([0, 1, 2]).round(4) array([[0.0025, 0.0225, 0.178 ], [0. , 0. , 0.0008]]) """ def __init__(self, scale=1, shift=0): super(Gilbrat, self).__init__( dist=log_normal(1), scale=scale, shift=shift, repr_args=[], )