Source code for lossmodels.frequency.binomial
import numpy as np
from ..utils.random import RNGLike, resolve_rng
from scipy.stats import binom
from .base import FrequencyModel
from ..utils.numeric import eval_dist
[docs]
class Binomial(FrequencyModel):
"""
Binomial frequency model.
Parameters
----------
n : int
Number of trials
p : float
Probability of success
"""
def __init__(self, n: int, p: float):
if n <= 0:
raise ValueError("n must be positive")
if not (0 <= p <= 1):
raise ValueError("p must be between 0 and 1")
self.n = n
self.p = p
[docs]
def sample(self, size: int = 1, rng: RNGLike = None) -> np.ndarray:
return resolve_rng(rng).binomial(self.n, self.p, size=size)
[docs]
def mean(self) -> float:
return self.n * self.p
[docs]
def variance(self) -> float:
return self.n * self.p * (1 - self.p)
[docs]
def pmf(self, k):
"""Probability mass function P(N = k)."""
return eval_dist(lambda v: binom.pmf(v, self.n, self.p), k)
[docs]
def cdf(self, k):
"""Cumulative distribution function P(N <= k)."""
return eval_dist(lambda v: binom.cdf(v, self.n, self.p), k)
def __repr__(self):
return f"Binomial(n={self.n}, p={self.p})"