def test_sample_scipy(): p = S(2) / 3 x = Symbol('x', integer=True, positive=True) pdf = p * (1 - p)**(x - 1) # pdf of Geometric Distribution distribs_scipy = [ DiscreteRV(x, pdf, set=S.Naturals), Geometric('G', 0.5), Logarithmic('L', 0.5), NegativeBinomial('N', 5, 0.4), Poisson('P', 1), Skellam('S', 1, 1), YuleSimon('Y', 1), Zeta('Z', 2) ] size = 3 numsamples = 5 scipy = import_module('scipy') if not scipy: skip('Scipy is not installed. Abort tests for _sample_scipy.') else: with ignore_warnings( UserWarning ): ### TODO: Restore tests once warnings are removed z_sample = list( sample(Zeta("G", 7), size=size, numsamples=numsamples)) assert len(z_sample) == numsamples for X in distribs_scipy: samps = next(sample(X, size=size, library='scipy')) samps2 = next(sample(X, size=(2, 2), library='scipy')) for sam in samps: assert sam in X.pspace.domain.set for i in range(2): for j in range(2): assert samps2[i][j] in X.pspace.domain.set
def test_moment_generating_functions(): t = S('t') geometric_mgf = moment_generating_function(Geometric('g', S.Half))(t) assert geometric_mgf.diff(t).subs(t, 0) == 2 logarithmic_mgf = moment_generating_function(Logarithmic('l', S.Half))(t) assert logarithmic_mgf.diff(t).subs(t, 0) == 1 / log(2) negative_binomial_mgf = moment_generating_function( NegativeBinomial('n', 5, Rational(1, 3)))(t) assert negative_binomial_mgf.diff(t).subs(t, 0) == Rational(5, 2) poisson_mgf = moment_generating_function(Poisson('p', 5))(t) assert poisson_mgf.diff(t).subs(t, 0) == 5 skellam_mgf = moment_generating_function(Skellam('s', 1, 1))(t) assert skellam_mgf.diff(t).subs( t, 2) == (-exp(-2) + exp(2)) * exp(-2 + exp(-2) + exp(2)) yule_simon_mgf = moment_generating_function(YuleSimon('y', 3))(t) assert simplify(yule_simon_mgf.diff(t).subs(t, 0)) == Rational(3, 2) zeta_mgf = moment_generating_function(Zeta('z', 5))(t) assert zeta_mgf.diff(t).subs(t, 0) == pi**4 / (90 * zeta(5))
def test_precomputed_characteristic_functions(): import mpmath def test_cf(dist, support_lower_limit, support_upper_limit): pdf = density(dist) t = S('t') x = S('x') # first function is the hardcoded CF of the distribution cf1 = lambdify([t], characteristic_function(dist)(t), 'mpmath') # second function is the Fourier transform of the density function f = lambdify([x, t], pdf(x) * exp(I * x * t), 'mpmath') cf2 = lambda t: mpmath.nsum(lambda x: f(x, t), [support_lower_limit, support_upper_limit], maxdegree=10) # compare the two functions at various points for test_point in [2, 5, 8, 11]: n1 = cf1(test_point) n2 = cf2(test_point) assert abs(re(n1) - re(n2)) < 1e-12 assert abs(im(n1) - im(n2)) < 1e-12 test_cf(Geometric('g', Rational(1, 3)), 1, mpmath.inf) test_cf(Logarithmic('l', Rational(1, 5)), 1, mpmath.inf) test_cf(NegativeBinomial('n', 5, Rational(1, 7)), 0, mpmath.inf) test_cf(Poisson('p', 5), 0, mpmath.inf) test_cf(YuleSimon('y', 5), 1, mpmath.inf) test_cf(Zeta('z', 5), 1, mpmath.inf)
def test_moment_generating_functions(): t = S("t") geometric_mgf = moment_generating_function(Geometric("g", S.Half))(t) assert geometric_mgf.diff(t).subs(t, 0) == 2 logarithmic_mgf = moment_generating_function(Logarithmic("l", S.Half))(t) assert logarithmic_mgf.diff(t).subs(t, 0) == 1 / log(2) negative_binomial_mgf = moment_generating_function( NegativeBinomial("n", 5, Rational(1, 3)) )(t) assert negative_binomial_mgf.diff(t).subs(t, 0) == Rational(5, 2) poisson_mgf = moment_generating_function(Poisson("p", 5))(t) assert poisson_mgf.diff(t).subs(t, 0) == 5 skellam_mgf = moment_generating_function(Skellam("s", 1, 1))(t) assert skellam_mgf.diff(t).subs(t, 2) == (-exp(-2) + exp(2)) * exp( -2 + exp(-2) + exp(2) ) yule_simon_mgf = moment_generating_function(YuleSimon("y", 3))(t) assert simplify(yule_simon_mgf.diff(t).subs(t, 0)) == Rational(3, 2) zeta_mgf = moment_generating_function(Zeta("z", 5))(t) assert zeta_mgf.diff(t).subs(t, 0) == pi ** 4 / (90 * zeta(5))
def test_zeta(): s = S(5) x = Zeta("x", s) assert E(x) == zeta(s - 1) / zeta(s) assert ( simplify(variance(x)) == (zeta(s) * zeta(s - 2) - zeta(s - 1) ** 2) / zeta(s) ** 2 )
def test_sampling_methods(): distribs_numpy = [ Geometric('G', 0.5), Poisson('P', 1), Zeta('Z', 2) ] distribs_scipy = [ Geometric('G', 0.5), Logarithmic('L', 0.5), Poisson('P', 1), Skellam('S', 1, 1), YuleSimon('Y', 1), Zeta('Z', 2) ] distribs_pymc3 = [ Geometric('G', 0.5), Poisson('P', 1), ] size = 3 numpy = import_module('numpy') if not numpy: skip('Numpy is not installed. Abort tests for _sample_numpy.') else: with ignore_warnings(UserWarning): for X in distribs_numpy: samps = X.pspace.distribution._sample_numpy(size) for samp in samps: assert samp in X.pspace.domain.set scipy = import_module('scipy') if not scipy: skip('Scipy is not installed. Abort tests for _sample_scipy.') else: with ignore_warnings(UserWarning): for X in distribs_scipy: samps = next(sample(X, size=size)) for samp in samps: assert samp in X.pspace.domain.set pymc3 = import_module('pymc3') if not pymc3: skip('PyMC3 is not installed. Abort tests for _sample_pymc3.') else: with ignore_warnings(UserWarning): for X in distribs_pymc3: samps = X.pspace.distribution._sample_pymc3(size) for samp in samps: assert samp in X.pspace.domain.set
def test_sample_numpy(): distribs_numpy = [Geometric('G', 0.5), Poisson('P', 1), Zeta('Z', 2)] size = 3 numpy = import_module('numpy') if not numpy: skip('Numpy is not installed. Abort tests for _sample_numpy.') else: with ignore_warnings(UserWarning): for X in distribs_numpy: samps = next(sample(X, size=size, library='numpy')) for sam in samps: assert sam in X.pspace.domain.set raises(NotImplementedError, lambda: next(sample(Skellam('S', 1, 1), library='numpy'))) raises( NotImplementedError, lambda: Skellam('S', 1, 1).pspace.distribution. sample(library='tensorflow'))
def test_moment_generating_functions(): t = S('t') geometric_mgf = moment_generating_function(Geometric('g', S(1)/2))(t) assert geometric_mgf.diff(t).subs(t, 0) == 2 logarithmic_mgf = moment_generating_function(Logarithmic('l', S(1)/2))(t) assert logarithmic_mgf.diff(t).subs(t, 0) == 1/log(2) negative_binomial_mgf = moment_generating_function(NegativeBinomial('n', 5, S(1)/3))(t) assert negative_binomial_mgf.diff(t).subs(t, 0) == S(5)/2 poisson_mgf = moment_generating_function(Poisson('p', 5))(t) assert poisson_mgf.diff(t).subs(t, 0) == 5 yule_simon_mgf = moment_generating_function(YuleSimon('y', 3))(t) assert simplify(yule_simon_mgf.diff(t).subs(t, 0)) == S(3)/2 zeta_mgf = moment_generating_function(Zeta('z', 5))(t) assert zeta_mgf.diff(t).subs(t, 0) == pi**4/(90*zeta(5))