Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
test_rng.py
Go to the documentation of this file.
1import numpy as np
2import pandas as pd
3import matplotlib.pyplot as plt
4from math import sqrt, pi, exp
5
6
7rng = np.random.default_rng(42)
8
9def generate_correlated(R, n_samples, rng):
10 R = np.asarray(R, dtype=float)
11 L = np.linalg.cholesky(R)
12 z = rng.standard_normal(size=(n_samples, R.shape[0]))
13 y = z @ L.T
14 return y, L
15
16def summarize_case(name, R, n_samples=50000):
17 y, L = generate_correlated(R, n_samples, rng)
18 sample_corr = np.corrcoef(y, rowvar=False)
19 err = sample_corr - R
20 means = y.mean(axis=0)
21 stds = y.std(axis=0, ddof=1)
22 summary = {
23 "case": name,
24 "n": R.shape[0],
25 "samples": n_samples,
26 "max|corr_error|": float(np.max(np.abs(err))),
27 "mean|corr_error|": float(np.mean(np.abs(err))),
28 "max|mean|": float(np.max(np.abs(means))),
29 "max|std-1|": float(np.max(np.abs(stds - 1.0))),
30 "min_cholesky_diag": float(np.min(np.diag(np.linalg.cholesky(R)))),
31 }
32 return y, L, sample_corr, err, means, stds, summary
33
34def equicorrelation(n, rho):
35 R = np.full((n, n), rho, dtype=float)
36 np.fill_diagonal(R, 1.0)
37 return R
38
39cases = [
40 ("Identity (no correlation)", np.eye(3)),
41 ("Equicorrelation rho=0.5", equicorrelation(3, 0.5)),
42 ("Block: rho12=0.8, var3 indep", np.array([[1.0, 0.8, 0.0],
43 [0.8, 1.0, 0.0],
44 [0.0, 0.0, 1.0]], dtype=float)),
45 ("Nearly singular equicorr rho=0.999", equicorrelation(3, 0.999)),
46]
47
48all_summaries = []
49results = {}
50
51for name, R in cases:
52 y, L, sample_corr, err, means, stds, summary = summarize_case(name, R, n_samples=60000)
53 all_summaries.append(summary)
54 results[name] = {
55 "R": R,
56 "L": L,
57 "y": y,
58 "sample_corr": sample_corr,
59 "err": err,
60 "means": means,
61 "stds": stds,
62 }
63
64summary_df = pd.DataFrame(all_summaries).set_index("case")
65
66for name in results:
67 df_corr = pd.DataFrame(results[name]["sample_corr"])
68 df_err = pd.DataFrame(results[name]["err"])
69
70for name, data in results.items():
71 sample_corr = data["sample_corr"]
72 y = data["y"]
73 R = data["R"]
74
75 plt.figure()
76 plt.imshow(sample_corr, vmin=-1, vmax=1)
77 plt.title(f"Empirical correlation matrix – {name}")
78 plt.colorbar()
79 plt.tight_layout()
80 plt.show()
81
82 plt.figure()
83 plt.imshow(R, vmin=-1, vmax=1)
84 plt.title(f"Target correlation matrix – {name}")
85 plt.colorbar()
86 plt.tight_layout()
87 plt.show()
88
89 subset = y[:5000, :]
90 plt.figure()
91 plt.scatter(subset[:, 0], subset[:, 1], s=5)
92 plt.title(f"Scatter: y1 vs y2 – {name}")
93 plt.xlabel("y1")
94 plt.ylabel("y2")
95 plt.tight_layout()
96 plt.show()
97
98 vals = y[:, 0]
99 plt.figure()
100 plt.hist(vals, bins=60, density=True)
101 xs = np.linspace(vals.min(), vals.max(), 400)
102 pdf = (1.0 / sqrt(2 * pi)) * np.exp(-0.5 * xs * xs)
103 plt.plot(xs, pdf)
104 plt.title(f"Histogram of y1 (with N(0,1) pdf) – {name}")
105 plt.xlabel("y1")
106 plt.ylabel("density")
107 plt.tight_layout()
108 plt.show()
equicorrelation(n, rho)
Definition test_rng.py:34
generate_correlated(R, n_samples, rng)
Definition test_rng.py:9
summarize_case(name, R, n_samples=50000)
Definition test_rng.py:16