Example: AveragesΒΆ
1# Example of how samples can be combined to compute averages of functions of symmetric matrices with given margins.
2# In this case the average product of two off-diagonal entries is computed.
3
4from __future__ import annotations
5
6import numpy as np
7
8import matrix_count as mc
9
10samples = []
11entropies = []
12log_correlators = []
13
14correlator_sum = 0
15total_prop = 0
16num_samples = 10000
17
18for _t in range(num_samples):
19 sample, entropy = mc.sample_symmetric_matrix([20, 11, 3])
20 samples.append(sample)
21 entropies.append(entropy)
22 log_correlators.append(np.log(sample[0, 1] * sample[1, 2]))
23
24entropies = np.array(entropies)
25log_correlators = np.array(log_correlators)
26
27# Expectations can be calculated as E[f(A)] = 1/(\sum_{A_i} 1/Q(A_i))\sum_{A_i} f(A_i)/Q(A_i)
28# where Q(A_i) = exp(-entropy(A_i))
29log_correlator = mc.log_sum_exp(log_correlators + entropies) - mc.log_sum_exp(entropies)
30log_correlator_squared = mc.log_sum_exp(2 * log_correlators + entropies) - mc.log_sum_exp(
31 entropies
32)
33log_correlator_std = 0.5 * (
34 np.log(np.exp(0) - np.exp(2 * log_correlator - log_correlator_squared))
35 + log_correlator_squared
36)
37
38log_correlator_err_est = np.exp(
39 log_correlator_std - 0.5 * np.log(len(entropies)) - log_correlator
40)
41
42print(
43 f"Range of correlator: {np.exp(log_correlator)} +/- {np.exp(log_correlator)*log_correlator_err_est}"
44)