-
Notifications
You must be signed in to change notification settings - Fork 0
/
margin_prob_distr.py
146 lines (126 loc) · 4.35 KB
/
margin_prob_distr.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
from chi2xipolesAP import chi2xipoles, covmat
import numpy as np
from scipy import integrate
# boundsae = [(0.5, 1.5), (-0.5, 0.5)]
# bounds used during minimization
amax = 1.5
amin = 0.5
emax = 0.5
emin = -0.5
def chi2alpha_integrand(epsilon, alpha):
'''
integrand for marginalization over alpha so we can calculate chi2(alpha)
:param epsilon:
:param alpha:
:return: chi2(alpha, epsilon) with correct arguments position for integration
'''
chi2 = chi2xipoles(alpha, epsilon)
return chi2
def chi2epsilon_integrand(alpha, epsilon):
'''
integrand for marginalization over alpha so we can calculate chi2(alpha)
:param alpha:
:param epsilon:
:return: chi2(alpha, epsilon) with correct arguments position for integration
'''
chi2 = chi2xipoles(alpha, epsilon)
return chi2
def chi2alpha(alpha):
'''
Gives the chi2 funcion marginalized over epsilon parameter
:param alpha:
:return: chi2(alpha)
'''
margchi2 = integrate.quadrature(chi2alpha_integrand,
emin, emax,
args=alpha,
vec_func=False
)
weight = emax - emin
weighted = margchi2[0] / weight
return weighted
def chi2epsilon(epsilon):
'''
Gives the chi2 function marginalized over alpha parameter
:param epsilon:
:return: chi2(epsilon)
'''
margchi2 = integrate.quadrature(chi2epsilon_integrand,
amin, amax,
args=epsilon,
vec_func=False)
weight = amax - amin
weighted = margchi2[0] / weight
return weighted
def posteriori(alpha, epsilon):
'''
Posteriori probab distribution associated to Gaussian Likelihood for alpha, epsilon, assuming flat priors
:param alpha:
:param epsilon:
:return: P(alpha, epsilon | data ) = Prior(alpha, epsilon) * Likelihood(d|alpha, epsilon)
'''
detcov = np.linalg.det(covmat)
deltaalpha = amax - emin
deltaepsilon = emax - emin
priors = (1 / deltaalpha) * (1 / deltaepsilon)
L0 = 2 * np.pi * np.sqrt(detcov)
chi2 = chi2xipoles(alpha, epsilon)
likelihood = np.exp(- chi2 / 2)
return priors * likelihood / L0
def Palpha_integrand(epsilon, alpha):
'''
integrand for marginalization over epsilon values so we can calculate P(alpha|data)
:param epsilon: values of epsilon
:param alpha: values of alpha
:return: exp(-chi2(alpha, epsilon)/2)
'''
chi2 = chi2xipoles(alpha, epsilon)
integrand = np.exp(-chi2 / 2)
return integrand
def Pepsilon_integrand(alpha, epsilon):
'''
integrand for marginalization over alpha values so we can calculate P(epsilon|data)
:param epsilon: values of epsilon
:param alpha: values of alpha
:return: exp(-chi2(alpha, epsilon)/2)
'''
chi2 = chi2xipoles(alpha, epsilon)
integrand = np.exp(-chi2 / 2)
return integrand
def probdist_alpha(alpha):
'''
Marginalized 1-D probab distribution for alpha assuming flat priors and gaussian likelihood
:param alpha:
:return: P(alpha|data)
'''
detcov = np.linalg.det(covmat)
deltaalpha = amax - emin
deltaepsilon = emax - emin
priors = (1 / deltaalpha) * (1 / deltaepsilon)
L0 = 2 * np.pi * np.sqrt(detcov)
marginalized_alpha = integrate.quadrature(Palpha_integrand,
emin, emax,
args=alpha,
vec_func=False)
f1 = priors / L0
f2 = marginalized_alpha[0]
return f1 * f2
def probdist_epsilon(epsilon):
'''
Marginalized 1-D probab distribution for epsilon assuming flat priors and gaussian likelihood
:param epsilon:
:return: P(epsilon|data)
'''
detcov = np.linalg.det(covmat)
deltaalpha = amax - emin
deltaepsilon = emax - emin
priors = (1 / deltaalpha) * (1 / deltaepsilon)
L0 = 2 * np.pi * np.sqrt(detcov)
marginalized_epsilon = integrate.quadrature(Pepsilon_integrand,
amin, amax,
args=epsilon,
vec_func=False)
f1 = priors / L0
f2 = marginalized_epsilon[0]
return f1 / f2
print(chi2alpha(1.1))