Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- import random
- from typing import Tuple
- from tqdm import tqdm
- import typer
- def avgpos_bayes(l: int, r: int) -> float:
- return (l + 1) / (l + r + 2)
- def avgfreq_pos(l: int, r: int) -> float:
- return l / (l + r)
- def simulate_outcome(num_balls: int) -> Tuple[float, int]:
- first_ball = random.random()
- l = 0
- for _ in range(num_balls):
- if random.random() < first_ball:
- l += 1
- return first_ball, l
- def one_run(num_balls: int) -> Tuple[float, float]:
- actual_pos, l = simulate_outcome(num_balls)
- r = num_balls - l
- bayes_pos = avgpos_bayes(l, r)
- freq_pos = avgfreq_pos(l, r)
- bayes_diff = abs(actual_pos - bayes_pos)
- freq_diff = abs(actual_pos - freq_pos)
- return bayes_diff, freq_diff
- def main(num_balls: int, num_simulations: int = 1000000):
- bayes_diffs_sum = 0
- freq_diffs_sum = 0
- num_bayes_won = 0
- num_freq_won = 0
- for _ in tqdm(range(num_simulations)):
- bayes_diff, freq_diff = one_run(num_balls)
- bayes_diffs_sum += bayes_diff
- freq_diffs_sum += freq_diff
- num_bayes_won += bayes_diff < freq_diff
- num_freq_won += freq_diff < bayes_diff
- print(f"simulated {num_balls} balls {num_simulations} times")
- print(f"the Bayesian approach won over the Frequentist one {100 * num_bayes_won / num_simulations}% of the times")
- ties = num_simulations - (num_bayes_won + num_freq_won)
- if ties:
- print(f"{100 * ties / num_simulations}% of the simulations were ties, "
- f"so {100 * num_freq_won / num_simulations}% were Frequentist wins")
- print(f"the mean deviation from the real value for the Bayesian approach was:\t{bayes_diffs_sum / num_simulations}")
- print(f"the mean deviation from the real value for the Frequentist approach was:\t{freq_diffs_sum / num_simulations}")
- if __name__ == "__main__":
- typer.run(main)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement