-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathtest_continuous.py
102 lines (91 loc) · 2.94 KB
/
test_continuous.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
"""Testing module for continuous distributions."""
import numpy as np
from pytest import mark
from scipy import stats
from metasyn.distribution.continuous import (
ExponentialDistribution,
LogNormalDistribution,
NormalDistribution,
TruncatedNormalDistribution,
UniformDistribution,
)
@mark.parametrize(
"lower,upper",
[
(0, 1),
(-10, 2),
(0.01, 0.02),
]
)
def test_uniform(lower, upper):
"""Test the continuous uniform distribution."""
scale = upper-lower
values = stats.uniform(loc=lower, scale=scale).rvs(100)
dist = UniformDistribution.fit(values)
assert dist.lower <= values.min()
assert dist.upper >= values.max()
assert dist.information_criterion(values) < 2*np.log(len(values))-200*np.log((upper-lower)**-1)
assert isinstance(dist.draw(), float)
@mark.parametrize(
"mean,sd",
[
(0, 1),
(-10, 2),
(0.01, 0.02),
]
)
def test_normal(mean, sd):
"""Test the normal/Gaussian distribution."""
values = stats.norm(loc=mean, scale=sd).rvs(1000)
dist = NormalDistribution.fit(values)
dist_uniform = UniformDistribution.fit(values)
assert dist.information_criterion(values) < dist_uniform.information_criterion(values)
assert (dist.mean - mean)/sd < 0.5
assert (dist.sd - sd)/sd < 0.5
assert isinstance(dist.draw(), float)
@mark.parametrize(
"mean,sd",
[
(0, 1),
(-10, 2),
(0.01, 0.02),
]
)
def test_log_normal(mean, sd):
"""Test the log normal distribution."""
values = stats.lognorm(s=sd, loc=0, scale=np.exp(mean)).rvs(1000)
dist = LogNormalDistribution.fit(values)
dist_uniform = UniformDistribution.fit(values)
assert dist.information_criterion(values) < dist_uniform.information_criterion(values)
assert (dist.mean-mean)/sd < 1
assert (dist.sd-sd)/sd < 1
assert isinstance(dist.draw(), float)
@mark.parametrize(
"lower,upper,mean,sd",
[
(-0.5, 0.5, 0, 0.5),
(-10, -8, 0, 5),
(-5, 3, 2, 2),
(-0.01, 0.01, 0.01, 0.01),
]
)
def test_trunc_normal(lower, upper, mean, sd):
"""Test the truncated normal distribution."""
a, b = (lower-mean)/sd, (upper-mean)/sd
values = stats.truncnorm(a=a, b=b, loc=mean, scale=sd).rvs(5000)
dist = TruncatedNormalDistribution.fit(values)
dist_uniform = UniformDistribution.fit(values)
assert dist.information_criterion(values) < dist_uniform.information_criterion(values)
assert isinstance(dist.draw(), float)
@mark.parametrize(
"rate",
[0.1, 10, 100, 234.1234]
)
def test_exponential(rate):
"""Test the exponential distribution."""
values = stats.expon(loc=0, scale=1/rate).rvs(5000)
dist = ExponentialDistribution.fit(values)
dist_uniform = UniformDistribution.fit(values)
assert dist.information_criterion(values) < dist_uniform.information_criterion(values)
assert isinstance(dist.draw(), float)
assert (dist.rate - rate)/rate < 0.1