def test_select_proportional_to_weight(self): """ Tests that multinomial_wo_replacement selects elements, on average, proportional to the their probabilities """ th_rng = RandomStreams(12345) p = tensor.fmatrix() n = tensor.iscalar() m = th_rng.multinomial_wo_replacement(pvals=p, n=n) f = function([p, n], m, allow_input_downcast=True) n_elements = 100 n_selected = 10 mean_rtol = 0.0005 numpy.random.seed(12345) pvals = numpy.random.randint(1, 100, (1, n_elements)).astype(config.floatX) pvals /= pvals.sum(1) avg_pvals = numpy.zeros((n_elements,), dtype=config.floatX) for rep in range(10000): res = f(pvals, n_selected) res = numpy.squeeze(res) avg_pvals[res] += 1 avg_pvals /= avg_pvals.sum() avg_diff = numpy.mean(abs(avg_pvals - pvals)) assert avg_diff < mean_rtol
def test_select_proportional_to_weight(self): """ Tests that multinomial_wo_replacement selects elements, on average, proportional to the their probabilities """ th_rng = RandomStreams(12345) p = tensor.fmatrix() n = tensor.iscalar() m = th_rng.multinomial_wo_replacement(pvals=p, n=n) f = function([p, n], m, allow_input_downcast=True) n_elements = 100 n_selected = 10 mean_rtol = 0.0005 numpy.random.seed(12345) pvals = numpy.random.randint(1, 100, (1, n_elements)).astype(config.floatX) pvals /= pvals.sum(1) avg_pvals = numpy.zeros((n_elements, ), dtype=config.floatX) for rep in range(10000): res = f(pvals, n_selected) res = numpy.squeeze(res) avg_pvals[res] += 1 avg_pvals /= avg_pvals.sum() avg_diff = numpy.mean(abs(avg_pvals - pvals)) assert avg_diff < mean_rtol
class RVal(Elem, TensorWrapped, Masked): # random value def __init__(self, seed=None, **kw): super(RVal, self).__init__(**kw) if seed is None: seed = np.random.randint(0, 1e6) self.rng = RandomStreams(seed=seed) self.value = None def binomial(self, shape, n=1, p=0.5, ndim=None, dtype="int32"): if isinstance(shape, Elem): shape = shape.d self.value = self.rng.binomial(shape, n, p, ndim, dtype) return self def normal(self, shape, avg=0.0, std=1.0, ndim=None, dtype=None): if isinstance(shape, Elem): shape = shape.d self.value = self.rng.normal(shape, avg, std, ndim, dtype) return self def multinomial(self, shape, n=1, pvals=None, without_replacement=False, ndim=None, dtype="int32"): if isinstance(shape, Elem): shape = shape.d if without_replacement: self.value = self.rng.multinomial_wo_replacement(shape, n, pvals, ndim, dtype) else: self.value = self.rng.multinomial(shape, n, pvals, ndim, dtype) return self def gumbel(self, shape, eps=1e-10): if isinstance(shape, Elem): shape = shape.d x = self.rng.uniform(shape, 0.0, 1.0) self.value = -theano.tensor.log(-theano.tensor.log(x + eps) + eps) return self @property def d(self): return self.value @property def v(self): return self.value.eval() @property def allparams(self): return set() @property def allupdates(self): return {} @property def all_extra_outs(self): return {}
def test_target_parameter(): srng = MRG_RandomStreams() pvals = np.array([[.98, .01, .01], [.01, .49, .50]]) def basic_target_parameter_test(x): f = theano.function([], x) assert isinstance(f(), np.ndarray) basic_target_parameter_test(srng.uniform((3, 2), target='cpu')) basic_target_parameter_test(srng.binomial((3, 2), target='cpu')) basic_target_parameter_test(srng.multinomial(pvals=pvals.astype('float32'), target='cpu')) basic_target_parameter_test(srng.choice(p=pvals.astype('float32'), replace=False, target='cpu')) basic_target_parameter_test(srng.multinomial_wo_replacement(pvals=pvals.astype('float32'), target='cpu'))
def test_target_parameter(): srng = MRG_RandomStreams() pvals = np.array([[.98, .01, .01], [.01, .49, .50]]) def basic_target_parameter_test(x): f = theano.function([], x) assert isinstance(f(), np.ndarray) basic_target_parameter_test(srng.uniform((3, 2), target='cpu')) basic_target_parameter_test(srng.binomial((3, 2), target='cpu')) basic_target_parameter_test( srng.multinomial(pvals=pvals.astype('float32'), target='cpu')) basic_target_parameter_test( srng.choice(p=pvals.astype('float32'), replace=False, target='cpu')) basic_target_parameter_test( srng.multinomial_wo_replacement(pvals=pvals.astype('float32'), target='cpu'))
def test_fail_select_alot(self): # Tests that multinomial_wo_replacement fails when asked to sample more # elements than the actual number of elements th_rng = RandomStreams(12345) p = tensor.fmatrix() n = tensor.iscalar() m = th_rng.multinomial_wo_replacement(pvals=p, n=n) f = function([p, n], m, allow_input_downcast=True) n_elements = 100 n_selected = 200 np.random.seed(12345) pvals = np.random.randint(1, 100, (1, n_elements)).astype(config.floatX) pvals /= pvals.sum(1) self.assertRaises(ValueError, f, pvals, n_selected)
def test_target_parameter(): srng = MRG_RandomStreams() pvals = np.array([[0.98, 0.01, 0.01], [0.01, 0.49, 0.50]]) def basic_target_parameter_test(x): f = theano.function([], x) assert isinstance(f(), np.ndarray) basic_target_parameter_test(srng.uniform((3, 2), target="cpu")) basic_target_parameter_test(srng.normal((3, 2), target="cpu")) basic_target_parameter_test(srng.truncated_normal((3, 2), target="cpu")) basic_target_parameter_test(srng.binomial((3, 2), target="cpu")) basic_target_parameter_test( srng.multinomial(pvals=pvals.astype("float32"), target="cpu")) basic_target_parameter_test( srng.choice(p=pvals.astype("float32"), replace=False, target="cpu")) basic_target_parameter_test( srng.multinomial_wo_replacement(pvals=pvals.astype("float32"), target="cpu"))
def test_select_distinct(self): # Tests that multinomial_wo_replacement always selects distinct elements th_rng = RandomStreams(12345) p = tensor.fmatrix() n = tensor.iscalar() m = th_rng.multinomial_wo_replacement(pvals=p, n=n) f = function([p, n], m, allow_input_downcast=True) n_elements = 1000 all_indices = range(n_elements) np.random.seed(12345) for i in [5, 10, 50, 100, 500, n_elements]: pvals = np.random.randint(1, 100, (1, n_elements)).astype(config.floatX) pvals /= pvals.sum(1) res = f(pvals, i) res = np.squeeze(res) assert len(res) == i assert np.all(np.in1d(np.unique(res), all_indices)), res