Source code for mulearn.distributions


"""Mulearn distributions.

This module implements the kernel and fuzzifier distributions used in
randomized model selection.
"""

from scipy.stats import uniform
from scipy.stats import rv_continuous

from mulearn.kernel import GaussianKernel
from mulearn.fuzzifier import ExponentialFuzzifier


[docs]class GaussianKernelDistribution(rv_continuous): """Uniform distribution for gaussian kernels."""
[docs] def __init__(self, low=0, high=1): """Build an object of type `GaussianKernelDistribution`. :param low: Lower bound of the interval defining the support of the uniform distribution associated to the parameter $\sigma$ of a :class:`mulearn.kernel.GaussianKernel`, defaults to `0`. :type low: `float` :param high: Upper bound of the interval defining the support of the uniform distribution associated to the parameter $\sigma$ of a :class:`mulearn.kernel.GaussianKernel`, defaults to `1`. :type high: `float` :raises: ValueError if the arguments `low` and `high` do not define an interval (that is, `low` is not lower than `high`). """ super().__init__() if high <= low: raise ValueError(f"the provided upper extreme {high} is lower or" f"equal to the lower one {low}.") self.base_dist = uniform(loc=low, scale=high-low)
[docs] def rvs(self, *args, **kwargs): """Generate a Gaussian kernel with uniformly distributed parameter. :returns: :class:`mulearn.kernel.GaussianKernel` -- Gaussian kernel having a parameter uniformly chosen at random in the interval having `self.low` and `self.high` as extremes. """ return GaussianKernel(self.base_dist.rvs())
[docs]class ExponentialFuzzifierDistribution(rv_continuous): """Uniform distribution for gaussian kernels."""
[docs] def __init__(self, low=0, high=1): """Build an object of type `ExponentialFuzzifierDistribution`. :param low: Lower bound of the interval defining the support of the uniform distribution associated to the parameter $\alpha$ of a :class:`mulearn.fuzzifier.ExponentialFuzzifier`, defaults to `0`. :type low: `float` :param high: Upper bound of the interval defining the support of the uniform distribution associated to the parameter $\alpha$ of a :class:`mulearn.fuzzifier.ExponentialFuzzifier`, defaults to `1`. :type high: `float` :raises: ValueError if the arguments `low` and `high` do not define an interval (that is, `low` is not lower than `high`). """ super().__init__() self.base_dist = uniform(loc=low, scale=high-low)
[docs] def rvs(self, *args, **kwargs): """Generate an Exponential fuzzifier with uniformly distributed parameter. :returns: :class:`mulearn.fuzzifier.ExponentialFuzzifier` -- Exponential fuzzifier having a parameter uniformly chosen at random in the interval having `self.low` and `self.high` as extremes. """ return ExponentialFuzzifier(profile="alpha", alpha=self.base_dist.rvs())