Ejemplo n.º 1
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
Ejemplo n.º 2
0
    def _sample_scipy(cls, dist, size, seed):
        """Sample from SciPy."""

        from scipy import stats as scipy_stats
        import numpy
        scipy_rv_map = {
            'WishartDistribution':
            lambda dist, size, rand_state: scipy_stats.wishart.rvs(
                df=int(dist.n),
                scale=matrix2numpy(dist.scale_matrix, float),
                size=size),
            'MatrixNormalDistribution':
            lambda dist, size, rand_state: scipy_stats.matrix_normal.rvs(
                mean=matrix2numpy(dist.location_matrix, float),
                rowcov=matrix2numpy(dist.scale_matrix_1, float),
                colcov=matrix2numpy(dist.scale_matrix_2, float),
                size=size,
                random_state=rand_state)
        }

        dist_list = scipy_rv_map.keys()

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

        samples = []
        if seed is None or isinstance(seed, int):
            rand_state = numpy.random.default_rng(seed=seed)
        else:
            rand_state = seed
        for _ in range(size[0]):
            samp = scipy_rv_map[dist.__class__.__name__](
                dist, size[1] if len(size) > 1 else 1, rand_state)
            samples.append(samp)
        return samples
Ejemplo n.º 3
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
Ejemplo n.º 4
0
class SampleMatrixScipy:
    """Returns the sample from scipy of the given distribution"""
    def __new__(cls, dist, size):
        return cls._sample_scipy(dist, size)

    scipy_rv_map = {
        'WishartDistribution':
        lambda dist, size: scipy.stats.wishart.rvs(
            df=int(dist.n),
            scale=matrix2numpy(dist.scale_matrix, float),
            size=size),
        'MatrixNormalDistribution':
        lambda dist, size: scipy.stats.matrix_normal.rvs(
            mean=matrix2numpy(dist.location_matrix, float),
            rowcov=matrix2numpy(dist.scale_matrix_1, float),
            colcov=matrix2numpy(dist.scale_matrix_2, float),
            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)
Ejemplo n.º 5
0
    def _sample_pymc3(cls, dist, size, seed):
        """Sample from PyMC3."""

        import pymc3
        pymc3_rv_map = {
            'MatrixNormalDistribution':
            lambda dist: pymc3.MatrixNormal(
                'X',
                mu=matrix2numpy(dist.location_matrix, float),
                rowcov=matrix2numpy(dist.scale_matrix_1, float),
                colcov=matrix2numpy(dist.scale_matrix_2, float),
                shape=dist.location_matrix.shape),
            'WishartDistribution':
            lambda dist: pymc3.WishartBartlett(
                'X', nu=int(dist.n), S=matrix2numpy(dist.scale_matrix, float))
        }

        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)
            return pymc3.sample(size, chains=1, progressbar=False)[:]['X']
Ejemplo n.º 6
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']
Ejemplo n.º 7
0
class SampleMatrixPymc:
    """Returns the sample from pymc3 of the given distribution"""
    def __new__(cls, dist, size):
        return cls._sample_pymc3(dist, size)

    pymc3_rv_map = {
        'MatrixNormalDistribution':
        lambda dist: pymc3.MatrixNormal(
            'X',
            mu=matrix2numpy(dist.location_matrix, float),
            rowcov=matrix2numpy(dist.scale_matrix_1, float),
            colcov=matrix2numpy(dist.scale_matrix_2, float),
            shape=dist.location_matrix.shape),
        'WishartDistribution':
        lambda dist: pymc3.WishartBartlett(
            'X', nu=int(dist.n), S=matrix2numpy(dist.scale_matrix, float))
    }

    @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']
Ejemplo n.º 8
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)
Ejemplo n.º 9
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)
Ejemplo n.º 10
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
Ejemplo n.º 11
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))
Ejemplo n.º 12
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))
Ejemplo n.º 13
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)
Ejemplo n.º 14
0
    def _sample_pymc3(cls, dist, size, seed):
        """Sample from PyMC3."""

        import pymc3
        pymc3_rv_map = {
            'MatrixNormalDistribution':
            lambda dist: pymc3.MatrixNormal(
                'X',
                mu=matrix2numpy(dist.location_matrix, float),
                rowcov=matrix2numpy(dist.scale_matrix_1, float),
                colcov=matrix2numpy(dist.scale_matrix_2, float),
                shape=dist.location_matrix.shape),
            'WishartDistribution':
            lambda dist: pymc3.WishartBartlett(
                'X', nu=int(dist.n), S=matrix2numpy(dist.scale_matrix, float))
        }

        sample_shape = {
            'WishartDistribution': lambda dist: dist.scale_matrix.shape,
            'MatrixNormalDistribution': lambda dist: dist.location_matrix.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)
            samps = pymc3.sample(draws=prod(size),
                                 chains=1,
                                 progressbar=False,
                                 random_seed=seed,
                                 return_inferencedata=False,
                                 compute_convergence_checks=False)['X']
        return samps.reshape(size +
                             sample_shape[dist.__class__.__name__](dist))
Ejemplo n.º 15
0
    def _sample_scipy(cls, dist, size, seed):
        """Sample from SciPy."""

        from scipy import stats as scipy_stats
        import numpy
        scipy_rv_map = {
            'WishartDistribution':
            lambda dist, size, rand_state: scipy_stats.wishart.rvs(
                df=int(dist.n),
                scale=matrix2numpy(dist.scale_matrix, float),
                size=size),
            'MatrixNormalDistribution':
            lambda dist, size, rand_state: scipy_stats.matrix_normal.rvs(
                mean=matrix2numpy(dist.location_matrix, float),
                rowcov=matrix2numpy(dist.scale_matrix_1, float),
                colcov=matrix2numpy(dist.scale_matrix_2, float),
                size=size,
                random_state=rand_state)
        }

        sample_shape = {
            'WishartDistribution': lambda dist: dist.scale_matrix.shape,
            'MatrixNormalDistribution': lambda dist: dist.location_matrix.shape
        }

        dist_list = scipy_rv_map.keys()

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

        if seed is None or isinstance(seed, int):
            rand_state = numpy.random.default_rng(seed=seed)
        else:
            rand_state = seed
        samp = scipy_rv_map[dist.__class__.__name__](dist, prod(size),
                                                     rand_state)
        return samp.reshape(size + sample_shape[dist.__class__.__name__](dist))
Ejemplo n.º 16
0
    def _sample_scipy(cls, dist, size):
        """Sample from SciPy."""

        from scipy import stats as scipy_stats
        scipy_rv_map = {
            'WishartDistribution':
            lambda dist, size: scipy_stats.wishart.rvs(
                df=int(dist.n),
                scale=matrix2numpy(dist.scale_matrix, float),
                size=size),
            'MatrixNormalDistribution':
            lambda dist, size: scipy_stats.matrix_normal.rvs(
                mean=matrix2numpy(dist.location_matrix, float),
                rowcov=matrix2numpy(dist.scale_matrix_1, float),
                colcov=matrix2numpy(dist.scale_matrix_2, float),
                size=size)
        }

        dist_list = scipy_rv_map.keys()

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

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