-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_smc_samplers.py
90 lines (72 loc) · 3.03 KB
/
test_smc_samplers.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
import dense_nn
import numpy as np
import smc_samplers
import copy
def test_gen_data_splits():
N = 300
ncolumns = 3
ndata = int(N / ncolumns)
inputs = np.random.normal(loc=0.0, scale=1, size=N).reshape(ndata, ncolumns)
target = np.random.normal(loc=0.0, scale=1, size=ndata).reshape(ndata, 1)
start_points, end_points = smc_samplers.gen_data_splits(ndata, packet_size=9)
assert len(start_points) == len(end_points)
# Test the concatenation of the inputs
data = []
for s, e in zip(start_points, end_points):
data.extend(target[s:e])
assert np.all(np.array(data) == target)
# Test the concatenation of the targets
data = []
for s, e in zip(start_points, end_points):
data.extend(inputs[s:e])
assert np.all(np.array(data) == inputs)
def test_calc_weights_geometric():
"""
Make sure that the weights are being updated correctly for the geometric SMC method.
"""
# Creata a quick NN:
N = 200
ncolumns = 2
ndata = int(N / ncolumns)
inputs = np.random.normal(loc=0.0, scale=1, size=N).reshape(ndata, ncolumns)
target = np.random.normal(loc=0.0, scale=1, size=ndata).reshape(ndata, 1)
nn = dense_nn.GaussianDenseNN(inputs, target, (ncolumns, 5, 1), prior_weight_scale=0.5, prior_error_scale=0.5)
# Create some initial weights
nreplicas = 3
replica_unknowns = [nn.unknowns] * nreplicas
initial_weights = np.repeat(1 / nreplicas, nreplicas)
log_weights = np.log(initial_weights)
initial_log_weights = log_weights.copy()
lam1 = 0.1
lam2 = 0.5
dlam = lam2 - lam1
# Calculate the new weights
new_log_weights, weights = smc_samplers.calc_weights_geometric(nn, dlam, replica_unknowns, log_weights)
# Calculate what the difference between the old and new weights should be:
diff_log_weights = float(nn.batch_log_like(replica_unknowns[0], nn.inputs, nn.targets, lam=lam2)) - \
float(nn.batch_log_like(replica_unknowns[0], nn.inputs, nn.targets, lam=lam1))
assert np.abs(new_log_weights[0] - initial_log_weights[0] - diff_log_weights) < 0.0001
def test_generate_replicas():
"""
Make sure SMC particles/replicas gel with the NN.
"""
# Creata a quick NN:
N = 50
ncolumns = 2
ndata = int(N / ncolumns)
inputs = np.random.normal(loc=0.0, scale=1, size=N).reshape(ndata, ncolumns)
target = np.random.normal(loc=0.0, scale=1, size=ndata).reshape(ndata, 1)
nn = dense_nn.GaussianDenseNN(inputs, target, (ncolumns, 5, 1), prior_weight_scale=0.5, prior_error_scale=0.5)
nreplicas = 3
seed = 0
old_seed = copy.deepcopy(seed)
replica_unknowns, seed = smc_samplers.generate_replicas(nn, nreplicas, seed)
assert seed != old_seed
energies = []
for i in range(nreplicas):
nn.unknowns = replica_unknowns[i]
energies.append(nn.energy(nn.unknowns))
energies = np.array(energies)
assert np.all(np.isreal(energies))
assert replica_unknowns[0].shape == nn.unknowns.shape
assert np.all(replica_unknowns[0] != replica_unknowns[1])