示例#1
0
    def _sample_numpy(cls, dist, size, seed):
        """Sample from NumPy."""

        import numpy
        if seed is None or isinstance(seed, int):
            rand_state = numpy.random.default_rng(seed=seed)
        else:
            rand_state = seed
        numpy_rv_map = {
            'MultivariateNormalDistribution': lambda dist, size: rand_state.multivariate_normal(
                mean=matrix2numpy(dist.mu, float).flatten(),
                cov=matrix2numpy(dist.sigma, float), size=size),
            'MultivariateBetaDistribution': lambda dist, size: rand_state.dirichlet(
                alpha=list2numpy(dist.alpha, float).flatten(), size=size),
            'MultinomialDistribution': lambda dist, size: rand_state.multinomial(
                n=int(dist.n), pvals=list2numpy(dist.p, float).flatten(), size=size)
        }

        dist_list = numpy_rv_map.keys()

        if dist.__class__.__name__ not in dist_list:
            return None

        samples = numpy_rv_map[dist.__class__.__name__](dist, size)
        if samples.shape[0:len(size)] != size:
            samples = samples.reshape((size[0],) + samples.shape)
        return samples
示例#2
0
    def _sample_pymc3(cls, dist, size, seed):
        """Sample from PyMC3."""

        import pymc3
        pymc3_rv_map = {
            'MultivariateNormalDistribution': lambda dist:
                pymc3.MvNormal('X', mu=matrix2numpy(dist.mu, float).flatten(),
                cov=matrix2numpy(dist.sigma, float), shape=(1, dist.mu.shape[0])),
            'MultivariateBetaDistribution': lambda dist:
                pymc3.Dirichlet('X', a=list2numpy(dist.alpha, float).flatten()),
            'MultinomialDistribution': lambda dist:
                pymc3.Multinomial('X', n=int(dist.n),
                p=list2numpy(dist.p, float).flatten(), shape=(1, len(dist.p)))
        }

        dist_list = pymc3_rv_map.keys()

        if dist.__class__.__name__ not in dist_list:
            return None

        with pymc3.Model():
            pymc3_rv_map[dist.__class__.__name__](dist)
            samples = pymc3.sample(size, chains=1, progressbar=False, random_seed=seed)[:]['X']
            if samples.shape[0:len(size)] != size:
                samples = samples.reshape((size[0],) + samples.shape)
            return samples
示例#3
0
class SampleJointPymc:
    """Returns the sample from pymc3 of the given distribution"""

    def __new__(cls, dist, size):
        return cls._sample_pymc3(dist, size)

    pymc3_rv_map = {
        'MultivariateNormalDistribution': lambda dist:
            pymc3.MvNormal('X', mu=matrix2numpy(dist.mu, float).flatten(),
            cov=matrix2numpy(dist.sigma, float), shape=(1, dist.mu.shape[0])),
        'MultivariateBetaDistribution': lambda dist:
            pymc3.Dirichlet('X', a=list2numpy(dist.alpha, float).flatten()),
        'MultinomialDistribution': lambda dist:
            pymc3.Multinomial('X', n=int(dist.n),
            p=list2numpy(dist.p, float).flatten(), shape=(1, len(dist.p)))
    }

    @classmethod
    def _sample_pymc3(cls, dist, size):
        """Sample from PyMC3."""

        dist_list = cls.pymc3_rv_map.keys()

        if dist.__class__.__name__ not in dist_list:
            return None

        with pymc3.Model():
            cls.pymc3_rv_map[dist.__class__.__name__](dist)
            return pymc3.sample(size, chains=1, progressbar=False)[:]['X']
示例#4
0
class SampleJointNumpy:
    """Returns the sample from numpy of the given distribution"""

    def __new__(cls, dist, size):
        return cls._sample_numpy(dist, size)

    numpy_rv_map = {
        'MultivariateNormalDistribution': lambda dist, size: numpy.random.multivariate_normal(
            mean=matrix2numpy(dist.mu, float).flatten(),
            cov=matrix2numpy(dist.sigma, float), size=size),
        'MultivariateBetaDistribution': lambda dist, size: numpy.random.dirichlet(
            alpha=list2numpy(dist.alpha, float).flatten(), size=size),
        'MultinomialDistribution': lambda dist, size: numpy.random.multinomial(
            n=int(dist.n), pvals=list2numpy(dist.p, float).flatten(), size=size)
    }

    @classmethod
    def _sample_numpy(cls, dist, size):
        """Sample from NumPy."""

        dist_list = cls.numpy_rv_map.keys()

        if dist.__class__.__name__ not in dist_list:
            return None

        return cls.numpy_rv_map[dist.__class__.__name__](dist, size)
示例#5
0
class SampleJointScipy:
    """Returns the sample from scipy of the given distribution"""
    def __new__(cls, dist, size):
        return cls._sample_scipy(dist, size)

    scipy_rv_map = {
        'MultivariateNormalDistribution': lambda dist, size: scipy.stats.multivariate_normal.rvs(
            mean=matrix2numpy(dist.mu).flatten(),
            cov=matrix2numpy(dist.sigma), size=size),
        'MultivariateBetaDistribution': lambda dist, size: scipy.stats.dirichlet.rvs(
            alpha=list2numpy(dist.alpha, float).flatten(), size=size),
        'MultinomialDistribution': lambda dist, size: scipy.stats.multinomial.rvs(
            n=int(dist.n), p=list2numpy(dist.p, float).flatten(), size=size)
    }

    @classmethod
    def _sample_scipy(cls, dist, size):
        """Sample from SciPy."""

        dist_list = cls.scipy_rv_map.keys()

        if dist.__class__.__name__ not in dist_list:
            return None

        return cls.scipy_rv_map[dist.__class__.__name__](dist, size)
示例#6
0
    def _sample_scipy(cls, dist, size, seed):
        """Sample from SciPy."""

        from scipy import stats as scipy_stats
        scipy_rv_map = {
            'MultivariateNormalDistribution':
            lambda dist, size: scipy_stats.multivariate_normal.rvs(
                mean=matrix2numpy(dist.mu).flatten(),
                cov=matrix2numpy(dist.sigma),
                size=size,
                random_state=seed),
            'MultivariateBetaDistribution':
            lambda dist, size: scipy_stats.dirichlet.rvs(alpha=list2numpy(
                dist.alpha, float).flatten(),
                                                         size=size,
                                                         random_state=seed),
            'MultinomialDistribution':
            lambda dist, size: scipy_stats.multinomial.rvs(
                n=int(dist.n),
                p=list2numpy(dist.p, float).flatten(),
                size=size,
                random_state=seed)
        }

        dist_list = scipy_rv_map.keys()

        if dist.__class__.__name__ not in dist_list:
            return None

        samples = scipy_rv_map[dist.__class__.__name__](dist, size)
        if samples.shape[0:len(size)] != size:
            samples = samples.reshape((size[0], ) + samples.shape)
        return samples
示例#7
0
    def _sample_pymc3(cls, dist, size, seed):
        """Sample from PyMC3."""

        import pymc3
        pymc3_rv_map = {
            'MultivariateNormalDistribution':
            lambda dist: pymc3.MvNormal('X',
                                        mu=matrix2numpy(dist.mu, float).
                                        flatten(),
                                        cov=matrix2numpy(dist.sigma, float),
                                        shape=(1, dist.mu.shape[0])),
            'MultivariateBetaDistribution':
            lambda dist: pymc3.Dirichlet(
                'X', a=list2numpy(dist.alpha, float).flatten()),
            'MultinomialDistribution':
            lambda dist: pymc3.Multinomial('X',
                                           n=int(dist.n),
                                           p=list2numpy(dist.p, float).flatten(
                                           ),
                                           shape=(1, len(dist.p)))
        }

        sample_shape = {
            'MultivariateNormalDistribution':
            lambda dist: matrix2numpy(dist.mu).flatten().shape,
            'MultivariateBetaDistribution':
            lambda dist: list2numpy(dist.alpha).flatten().shape,
            'MultinomialDistribution':
            lambda dist: list2numpy(dist.p).flatten().shape
        }

        dist_list = pymc3_rv_map.keys()

        if dist.__class__.__name__ not in dist_list:
            return None

        import logging
        logging.getLogger("pymc3").setLevel(logging.ERROR)
        with pymc3.Model():
            pymc3_rv_map[dist.__class__.__name__](dist)
            samples = pymc3.sample(draws=prod(size),
                                   chains=1,
                                   progressbar=False,
                                   random_seed=seed,
                                   return_inferencedata=False,
                                   compute_convergence_checks=False)[:]['X']
        return samples.reshape(size +
                               sample_shape[dist.__class__.__name__](dist))
示例#8
0
    def _sample_scipy(cls, dist, size, seed):
        """Sample from SciPy."""

        import numpy
        if seed is None or isinstance(seed, int):
            rand_state = numpy.random.default_rng(seed=seed)
        else:
            rand_state = seed
        from scipy import stats as scipy_stats
        scipy_rv_map = {
            'MultivariateNormalDistribution':
            lambda dist, size: scipy_stats.multivariate_normal.rvs(
                mean=matrix2numpy(dist.mu).flatten(),
                cov=matrix2numpy(dist.sigma),
                size=size,
                random_state=rand_state),
            'MultivariateBetaDistribution':
            lambda dist, size: scipy_stats.dirichlet.rvs(
                alpha=list2numpy(dist.alpha, float).flatten(),
                size=size,
                random_state=rand_state),
            'MultinomialDistribution':
            lambda dist, size: scipy_stats.multinomial.rvs(
                n=int(dist.n),
                p=list2numpy(dist.p, float).flatten(),
                size=size,
                random_state=rand_state)
        }

        sample_shape = {
            'MultivariateNormalDistribution':
            lambda dist: matrix2numpy(dist.mu).flatten().shape,
            'MultivariateBetaDistribution':
            lambda dist: list2numpy(dist.alpha).flatten().shape,
            'MultinomialDistribution':
            lambda dist: list2numpy(dist.p).flatten().shape
        }

        dist_list = scipy_rv_map.keys()

        if dist.__class__.__name__ not in dist_list:
            return None

        samples = scipy_rv_map[dist.__class__.__name__](dist, size)
        return samples.reshape(size +
                               sample_shape[dist.__class__.__name__](dist))
示例#9
0
    def _sample_numpy(cls, dist, size):
        """Sample from NumPy."""

        import numpy
        numpy_rv_map = {
            'MultivariateNormalDistribution': lambda dist, size: numpy.random.multivariate_normal(
                mean=matrix2numpy(dist.mu, float).flatten(),
                cov=matrix2numpy(dist.sigma, float), size=size),
            'MultivariateBetaDistribution': lambda dist, size: numpy.random.dirichlet(
                alpha=list2numpy(dist.alpha, float).flatten(), size=size),
            'MultinomialDistribution': lambda dist, size: numpy.random.multinomial(
                n=int(dist.n), pvals=list2numpy(dist.p, float).flatten(), size=size)
        }

        dist_list = numpy_rv_map.keys()

        if dist.__class__.__name__ not in dist_list:
            return None

        return numpy_rv_map[dist.__class__.__name__](dist, size)