A generic discrete random variable class meant for subclassing.
rv_discrete is a base class to construct specific distribution classes and instances from for discrete random variables. rv_discrete can be used to construct an arbitrary distribution with defined by a list of support points and the corresponding probabilities.
Parameters : | a : float, optional
b : float, optional
moment_tol : float, optional
values : tuple of two array_like
inc : integer
badvalue : object, optional
name : str, optional
longname : str, optional
shapes : str, optional
extradoc : str, optional
|
---|
Notes
You can construct an arbitrary discrete rv where P{X=xk} = pk by passing to the rv_discrete initialization method (through the values=keyword) a tuple of sequences (xk, pk) which describes only those values of X (xk) that occur with nonzero probability (pk).
To create a new discrete distribution, we would do the following:
class poisson_gen(rv_continuous):
#"Poisson distribution"
def _pmf(self, k, mu):
...
and create an instance:
poisson = poisson_gen(name="poisson", shapes="mu",
longname='A Poisson')
The docstring can be created from a template.
Alternatively, the object may be called (as a function) to fix the shape and location parameters returning a “frozen” discrete RV object:
myrv = generic(<shape(s)>, loc=0)
- frozen RV object with the same methods but holding the given
shape and location fixed.
Examples
Custom made discrete distribution:
>>> import matplotlib.pyplot as plt
>>> from scipy import stats
>>> xk = np.arange(7)
>>> pk = (0.1, 0.2, 0.3, 0.1, 0.1, 0.1, 0.1)
>>> custm = stats.rv_discrete(name='custm', values=(xk, pk))
>>> h = plt.plot(xk, custm.pmf(xk))
Random number generation:
>>> R = custm.rvs(size=100)
Display frozen pmf:
>>> numargs = generic.numargs
>>> [ <shape(s)> ] = ['Replace with resonable value', ]*numargs
>>> rv = generic(<shape(s)>)
>>> x = np.arange(0, np.min(rv.dist.b, 3)+1)
>>> h = plt.plot(x, rv.pmf(x))
Here, rv.dist.b is the right endpoint of the support of rv.dist.
Check accuracy of cdf and ppf:
>>> prb = generic.cdf(x, <shape(s)>)
>>> h = plt.semilogy(np.abs(x-generic.ppf(prb, <shape(s)>))+1e-20)
Methods
generic.rvs(<shape(s)>, loc=0, size=1) | random variates |
generic.pmf(x, <shape(s)>, loc=0) | probability mass function |
logpmf(x, <shape(s)>, loc=0) | log of the probability density function |
generic.cdf(x, <shape(s)>, loc=0) | cumulative density function |
generic.logcdf(x, <shape(s)>, loc=0) | log of the cumulative density function |
generic.sf(x, <shape(s)>, loc=0) | survival function (1-cdf — sometimes more accurate) |
generic.logsf(x, <shape(s)>, loc=0, scale=1) | log of the survival function |
generic.ppf(q, <shape(s)>, loc=0) | percent point function (inverse of cdf — percentiles) |
generic.isf(q, <shape(s)>, loc=0) | inverse survival function (inverse of sf) |
generic.moment(n, <shape(s)>, loc=0) | non-central n-th moment of the distribution. May not work for array arguments. |
generic.stats(<shape(s)>, loc=0, moments=’mv’) | mean(‘m’, axis=0), variance(‘v’), skew(‘s’), and/or kurtosis(‘k’) |
generic.entropy(<shape(s)>, loc=0) | entropy of the RV |
generic.expect(func=None, args=(), loc=0, lb=None, ub=None, conditional=False) | Expected value of a function with respect to the distribution. Additional kwd arguments passed to integrate.quad |
generic.median(<shape(s)>, loc=0) | Median of the distribution. |
generic.mean(<shape(s)>, loc=0) | Mean of the distribution. |
generic.std(<shape(s)>, loc=0) | Standard deviation of the distribution. |
generic.var(<shape(s)>, loc=0) | Variance of the distribution. |
generic.interval(alpha, <shape(s)>, loc=0) | Interval that with alpha percent probability contains a random realization of this distribution. |
generic(<shape(s)>, loc=0) | calling a distribution instance returns a frozen distribution |