1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- from __future__ import division, print_function, absolute_import
- from scipy.stats import hypergeom, bernoulli, boltzmann
- import numpy as np
- from numpy.testing import assert_almost_equal, assert_equal, assert_allclose
- def test_hypergeom_logpmf():
- # symmetries test
- # f(k,N,K,n) = f(n-k,N,N-K,n) = f(K-k,N,K,N-n) = f(k,N,n,K)
- k = 5
- N = 50
- K = 10
- n = 5
- logpmf1 = hypergeom.logpmf(k, N, K, n)
- logpmf2 = hypergeom.logpmf(n - k, N, N - K, n)
- logpmf3 = hypergeom.logpmf(K - k, N, K, N - n)
- logpmf4 = hypergeom.logpmf(k, N, n, K)
- assert_almost_equal(logpmf1, logpmf2, decimal=12)
- assert_almost_equal(logpmf1, logpmf3, decimal=12)
- assert_almost_equal(logpmf1, logpmf4, decimal=12)
- # test related distribution
- # Bernoulli distribution if n = 1
- k = 1
- N = 10
- K = 7
- n = 1
- hypergeom_logpmf = hypergeom.logpmf(k, N, K, n)
- bernoulli_logpmf = bernoulli.logpmf(k, K/N)
- assert_almost_equal(hypergeom_logpmf, bernoulli_logpmf, decimal=12)
- def test_boltzmann_upper_bound():
- k = np.arange(-3, 5)
- N = 1
- p = boltzmann.pmf(k, 0.123, N)
- expected = k == 0
- assert_equal(p, expected)
- lam = np.log(2)
- N = 3
- p = boltzmann.pmf(k, lam, N)
- expected = [0, 0, 0, 4/7, 2/7, 1/7, 0, 0]
- assert_allclose(p, expected, rtol=1e-13)
- c = boltzmann.cdf(k, lam, N)
- expected = [0, 0, 0, 4/7, 6/7, 1, 1, 1]
- assert_allclose(c, expected, rtol=1e-13)
|