Source code for chaospy.distributions.operators.logarithm

"""Logarithm of another distribution."""
import numpy
import chaospy

from ..baseclass import Distribution, OperatorDistribution


[docs]class Logn(OperatorDistribution): """ Logarithm with base N. Args: dist (Distribution): Distribution to perform transformation on. base (int, float): the logarithm base. Example: >>> distribution = chaospy.Logn(chaospy.Uniform(1, 2), 3) >>> distribution Logn(Uniform(lower=1, upper=2), 3) >>> q = numpy.linspace(0,1,6)[1:-1] >>> distribution.inv(q).round(4) array([0.166 , 0.3063, 0.4278, 0.535 ]) >>> distribution.fwd(distribution.inv(q)).round(4) array([0.2, 0.4, 0.6, 0.8]) >>> distribution.pdf(distribution.inv(q)).round(4) array([1.3183, 1.5381, 1.7578, 1.9775]) >>> distribution.sample(4).round(4) array([0.4578, 0.0991, 0.608 , 0.3582]) >>> distribution.mom(1).round(4) 0.3516 """ _operator = lambda self, left, right: (numpy.log(left).T / numpy.log(right).T).T
[docs] def __init__(self, dist, base=2): assert isinstance(dist, Distribution) assert numpy.all(dist.lower > 0) assert base > 0 and base != 1 super(Logn, self).__init__( left=dist, right=base, repr_args=[dist, base], )
def _lower(self, idx, left, right, cache): return self._operator(left._get_lower(idx, cache), right) def _upper(self, idx, left, right, cache): return self._operator(left._get_upper(idx, cache), right) def _pdf(self, xloc, idx, left, right, cache): return ( left._get_pdf(right**xloc, idx, cache) * right**xloc * numpy.log(right) ) def _cdf(self, xloc, idx, left, right, cache): return left._get_fwd(right.item(0) ** xloc, idx, cache) def _ppf(self, uloc, idx, left, right, cache): return self._operator(left._get_inv(uloc, idx, cache), right) def _mom(self, kloc, left, right, cache): raise chaospy.UnsupportedFeature( "%s: Analytical moments for logarithm not supported", self ) def _ttr(self, kloc, idx, left, right, cache): raise chaospy.UnsupportedFeature( "%s: Analytical TTR for logarithm not supported", self )
[docs]class Log(Logn): """ Logarithm with base Euler's constant. Args: dist (Distribution): Distribution to perform transformation on. Example: >>> distribution = chaospy.Log(chaospy.Uniform(1, 2)) >>> distribution Log(Uniform(lower=1, upper=2)) """
[docs] def __init__(self, dist): super(Log, self).__init__(dist=dist, base=numpy.e) self._repr_args = [dist]
[docs]class Log10(Logn): """ Logarithm with base 10. Args: dist (Distribution): Distribution to perform transformation on. Example: >>> distribution = chaospy.Log10(chaospy.Uniform(1, 2)) >>> distribution Log10(Uniform(lower=1, upper=2)) """
[docs] def __init__(self, dist): super(Log10, self).__init__(dist=dist, base=10) self._repr_args = [dist]