Source code for probpy.distributions.geometric
import numpy as np
import numba
from probpy.core import Distribution, RandomVariable, Parameter
[docs]class Geometric(Distribution):
"""Geometric distribution"""
probability = "probability"
[docs] @classmethod
def med(cls, probability: np.float = None) -> RandomVariable:
"""
:param probability: probability of success
:return: RandomVariable
"""
if probability is None:
_sample = Geometric.sample
_p = Geometric.p
else:
def _sample(size: int = 1): return Geometric.sample(probability, size)
def _p(x: np.ndarray): return Geometric.p(x, probability)
parameters = {
Geometric.probability: Parameter(shape=(), value=probability)
}
return RandomVariable(_sample, _p, shape=(), parameters=parameters, cls=cls)
@staticmethod
@numba.jit(nopython=False, forceobj=True)
def sample(probability: np.float, size: int = 1) -> np.ndarray:
return np.random.geometric(probability, size=size)
@staticmethod
def p(x: np.ndarray, probability: np.float) -> np.ndarray:
if type(x) != np.ndarray: x = np.array(x)
if type(probability) != np.ndarray: probability = np.array(probability)
if probability.ndim == 1: probability = probability.reshape(-1, 1)
return np.float_power(1 - probability, x - 1) * probability