Skip to content

Commit

Permalink
adding missing posterior means and fixing deltanormal (#41)
Browse files Browse the repository at this point in the history
* adding missing posterior means and fixing deltanormal
* adding tests
  • Loading branch information
Matt52 authored Jun 29, 2024
1 parent cbda98f commit 0d83395
Show file tree
Hide file tree
Showing 13 changed files with 288 additions and 169 deletions.
166 changes: 102 additions & 64 deletions README.md

Large diffs are not rendered by default.

42 changes: 41 additions & 1 deletion bayesian_testing/experiments/delta_lognormal.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,48 @@ def evaluate(
"sum_values",
"avg_values",
"avg_positive_values",
"posterior_mean",
"prob_being_best",
"expected_loss",
]
avg_values = [round(i[0] / i[1], 5) for i in zip(self.sum_values, self.totals)]
avg_pos_values = [round(i[0] / i[1], 5) for i in zip(self.sum_values, self.positives)]
a_posterior_ig = [i[0] + (i[1] / 2) for i in zip(self.a_priors_ig, self.positives)]
x_ig = [i[0] / i[1] for i in zip(self.sum_logs, self.positives)]
b_posterior_ig = [
(
i[6]
+ (1 / 2) * (i[1] - 2 * i[0] * i[3] + i[2] * (i[3] ** 2))
+ ((i[2] * i[5]) / (2 * (i[2] + i[5]))) * ((i[3] - i[4]) ** 2)
)
for i in zip(
self.sum_logs,
self.sum_logs_2,
self.positives,
x_ig,
self.m_priors,
self.w_priors,
self.b_priors_ig,
)
]
posterior_mean = [
round(
np.exp(((i[0] + i[3] * i[4]) / (i[1] + i[4])) + i[8] / (2 * i[7]))
* ((i[5] + i[1]) / (i[6] + i[2])),
5,
)
for i in zip(
self.sum_logs,
self.positives,
self.totals,
self.m_priors,
self.w_priors,
self.a_priors_beta,
self.b_priors_beta,
a_posterior_ig,
b_posterior_ig,
)
]
eval_pbbs, eval_loss = self.eval_simulation(sim_count, seed, min_is_best)
pbbs = list(eval_pbbs.values())
loss = list(eval_loss.values())
Expand All @@ -147,6 +184,7 @@ def evaluate(
[round(i, 5) for i in self.sum_values],
avg_values,
avg_pos_values,
posterior_mean,
pbbs,
loss,
]
Expand Down Expand Up @@ -202,8 +240,10 @@ def add_variant_data_agg(
raise ValueError("Both [a_prior_beta, b_prior_beta] have to be positive numbers.")
if m_prior < 0 or a_prior_ig < 0 or b_prior_ig < 0 or w_prior < 0:
raise ValueError("All priors of [m, a_ig, b_ig, w] have to be non-negative numbers.")
if positives == 0:
raise ValueError("Variant has to have some non-zero (positive) values.")
if positives < 0:
raise ValueError("Input variable 'positives' is expected to be non-negative integer.")
raise ValueError("Input variable 'positives' is expected to be a positive integer.")
if totals < positives:
raise ValueError("Not possible to have more positives that totals!")

Expand Down
18 changes: 17 additions & 1 deletion bayesian_testing/experiments/delta_normal.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,11 +126,24 @@ def evaluate(
"sum_values",
"avg_values",
"avg_non_zero_values",
"posterior_mean",
"prob_being_best",
"expected_loss",
]
avg_values = [round(i[0] / i[1], 5) for i in zip(self.sum_values, self.totals)]
avg_pos_values = [round(i[0] / i[1], 5) for i in zip(self.sum_values, self.non_zeros)]
posterior_mean = [
round(((i[0] + i[3] * i[4]) / (i[1] + i[4])) * ((i[5] + i[1]) / (i[6] + i[2])), 5)
for i in zip(
self.sum_values,
self.non_zeros,
self.totals,
self.m_priors,
self.w_priors,
self.a_priors_beta,
self.b_priors_beta,
)
]
eval_pbbs, eval_loss = self.eval_simulation(sim_count, seed, min_is_best)
pbbs = list(eval_pbbs.values())
loss = list(eval_loss.values())
Expand All @@ -141,6 +154,7 @@ def evaluate(
[round(i, 5) for i in self.sum_values],
avg_values,
avg_pos_values,
posterior_mean,
pbbs,
loss,
]
Expand Down Expand Up @@ -194,8 +208,10 @@ def add_variant_data_agg(
raise ValueError("Both [a_prior_beta, b_prior_beta] have to be positive numbers.")
if m_prior < 0 or a_prior_ig < 0 or b_prior_ig < 0 or w_prior < 0:
raise ValueError("All priors of [m, a_ig, b_ig, w] have to be non-negative numbers.")
if non_zeros == 0:
raise ValueError("Variant has to have some non-zero values.")
if non_zeros < 0:
raise ValueError("Input variable 'non_zeros' is expected to be non-zero integer.")
raise ValueError("Input variable 'non_zeros' is expected to be positive integer.")
if totals < non_zeros:
raise ValueError("Not possible to have more non_zero numbers that totals!")

Expand Down
18 changes: 17 additions & 1 deletion bayesian_testing/experiments/discrete.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,22 @@ def evaluate(
-------
res : List of dictionaries with results per variant.
"""
keys = ["variant", "concentration", "average_value", "prob_being_best", "expected_loss"]
keys = [
"variant",
"concentration",
"average_value",
"posterior_mean",
"prob_being_best",
"expected_loss",
]
posterior_alphas = [
list(np.array(i[0]) + np.array(i[1]))
for i in zip(self.concentrations, self.prior_alphas)
]
posterior_mean = [
round(sum(np.multiply(np.array(self.states), np.array(i[0]) / sum(np.array(i[0])))), 5)
for i in zip(posterior_alphas)
]
eval_pbbs, eval_loss = self.eval_simulation(sim_count, seed, min_is_best)
pbbs = list(eval_pbbs.values())
loss = list(eval_loss.values())
Expand All @@ -100,6 +115,7 @@ def evaluate(
self.variant_names,
[dict(zip(self.states, i)) for i in self.concentrations],
average_values,
posterior_mean,
pbbs,
loss,
]
Expand Down
2 changes: 1 addition & 1 deletion bayesian_testing/metrics/evaluation.py
Original file line number Diff line number Diff line change
Expand Up @@ -468,7 +468,7 @@ def eval_delta_normal_agg(
normal_samples = np.array(
[
normal_posteriors(
totals[i],
non_zeros[i],
sums[i],
sums_2[i],
sim_count,
Expand Down
Loading

0 comments on commit 0d83395

Please sign in to comment.