test_discrete_distns.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from __future__ import division, print_function, absolute_import
  2. from scipy.stats import hypergeom, bernoulli, boltzmann
  3. import numpy as np
  4. from numpy.testing import assert_almost_equal, assert_equal, assert_allclose
  5. def test_hypergeom_logpmf():
  6. # symmetries test
  7. # f(k,N,K,n) = f(n-k,N,N-K,n) = f(K-k,N,K,N-n) = f(k,N,n,K)
  8. k = 5
  9. N = 50
  10. K = 10
  11. n = 5
  12. logpmf1 = hypergeom.logpmf(k, N, K, n)
  13. logpmf2 = hypergeom.logpmf(n - k, N, N - K, n)
  14. logpmf3 = hypergeom.logpmf(K - k, N, K, N - n)
  15. logpmf4 = hypergeom.logpmf(k, N, n, K)
  16. assert_almost_equal(logpmf1, logpmf2, decimal=12)
  17. assert_almost_equal(logpmf1, logpmf3, decimal=12)
  18. assert_almost_equal(logpmf1, logpmf4, decimal=12)
  19. # test related distribution
  20. # Bernoulli distribution if n = 1
  21. k = 1
  22. N = 10
  23. K = 7
  24. n = 1
  25. hypergeom_logpmf = hypergeom.logpmf(k, N, K, n)
  26. bernoulli_logpmf = bernoulli.logpmf(k, K/N)
  27. assert_almost_equal(hypergeom_logpmf, bernoulli_logpmf, decimal=12)
  28. def test_boltzmann_upper_bound():
  29. k = np.arange(-3, 5)
  30. N = 1
  31. p = boltzmann.pmf(k, 0.123, N)
  32. expected = k == 0
  33. assert_equal(p, expected)
  34. lam = np.log(2)
  35. N = 3
  36. p = boltzmann.pmf(k, lam, N)
  37. expected = [0, 0, 0, 4/7, 2/7, 1/7, 0, 0]
  38. assert_allclose(p, expected, rtol=1e-13)
  39. c = boltzmann.cdf(k, lam, N)
  40. expected = [0, 0, 0, 4/7, 6/7, 1, 1, 1]
  41. assert_allclose(c, expected, rtol=1e-13)