Probability test
from typing import Tuple
import math as m
import pandas as pd
import numpy as np
$ p = \frac {1 + \text{erf} \ z ( \frac {x - \mu} {\sqrt{2} \sigma} )} {2} $
where
$ \text{erf} \ z = \frac {2} {\sqrt{\pi}} \ \int_0^z e^{-t^2} dt $
is the error function.
def calc_normal_cdf(x: float, mu: float = 0, sigma: float = 1) -> float:
return (1 + m.erf((x - mu) / m.sqrt(2) / sigma)) / 2
normal_probability_below = calc_normal_cdf
for i in [n / 10 for n in range(-10, 10 + 1, 1)]:
print("\t".join([str(i), f"{normal_probability_below(i):.4f}"]))
def normal_probability_above(lo: float, mu: float = 0, sigma: float = 1) -> float:
return 1 - normal_probability_below(lo, mu, sigma)
for i in [n / 10 for n in range(-10, 10 + 1, 1)]:
print("\t".join([str(i), f"{normal_probability_above(i):.4f}"]))
domain = np.arange(-10, 10 + 1, 2) / 10
domain
def normal_probability_between(lo: float, hi: float, mu: float = 0, sigma: float = 1) -> float:
return normal_probability_below(hi, mu, sigma) - normal_probability_below(lo, mu, sigma)
probabilities_between = pd.DataFrame()
for i in domain:
for j in domain:
probabilities_between.loc[i, j] = normal_probability_between(i, j)
probabilities_between = pd.DataFrame(np.triu(probabilities_between), index=domain,
columns=domain).replace(0, np.NaN)
for i in domain:
probabilities_between.loc[i, i] = 0
probabilities_between
def normal_probability_outside(lo: float, hi: float, mu: float = 0, sigma: float = 1) -> float:
return 1 - normal_probability_between(lo, hi, mu, sigma)
probabilities_outside = pd.DataFrame()
for i in domain:
for j in domain:
probabilities_outside.loc[i, j] = normal_probability_outside(i, j)
pd.DataFrame(np.triu(probabilities_outside), index=domain, columns=domain).replace(0, np.NaN)