You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.3 KiB
Python
77 lines
2.3 KiB
Python
from __future__ import division, print_function, absolute_import
|
|
|
|
from numpy import vectorize, deprecate
|
|
from numpy.random import random_sample
|
|
|
|
__all__ = ['randwppf', 'randwcdf']
|
|
|
|
# XXX: Are these needed anymore?
|
|
|
|
#####################################
|
|
# General purpose continuous
|
|
######################################
|
|
|
|
|
|
@deprecate(message="Deprecated in scipy 0.14.0, use "
|
|
"distribution-specific rvs() method instead")
|
|
def randwppf(ppf, args=(), size=None):
|
|
"""
|
|
returns an array of randomly distributed integers of a distribution
|
|
whose percent point function (inverse of the CDF or quantile function)
|
|
is given.
|
|
|
|
args is a tuple of extra arguments to the ppf function (i.e. shape,
|
|
location, scale), and size is the size of the output. Note the ppf
|
|
function must accept an array of q values to compute over.
|
|
|
|
"""
|
|
U = random_sample(size=size)
|
|
return ppf(*(U,)+args)
|
|
|
|
|
|
@deprecate(message="Deprecated in scipy 0.14.0, use "
|
|
"distribution-specific rvs() method instead")
|
|
def randwcdf(cdf, mean=1.0, args=(), size=None):
|
|
"""
|
|
Returns an array of randomly distributed integers given a CDF.
|
|
|
|
Given a cumulative distribution function (CDF) returns an array of
|
|
randomly distributed integers that would satisfy the CDF.
|
|
|
|
Parameters
|
|
----------
|
|
cdf : function
|
|
CDF function that accepts a single value and `args`, and returns
|
|
an single value.
|
|
mean : float, optional
|
|
The mean of the distribution which helps the solver. Defaults
|
|
to 1.0.
|
|
args : tuple, optional
|
|
Extra arguments to the cdf function (i.e. shape, location, scale)
|
|
size : {int, None}, optional
|
|
Is the size of the output. If None, only 1 value will be returned.
|
|
|
|
Returns
|
|
-------
|
|
randwcdf : ndarray
|
|
Array of random numbers.
|
|
|
|
Notes
|
|
-----
|
|
Can use the ``scipy.stats.distributions.*.cdf`` functions for the
|
|
`cdf` parameter.
|
|
|
|
"""
|
|
import scipy.optimize as optimize
|
|
|
|
def _ppfopt(x, q, *nargs):
|
|
newargs = (x,)+nargs
|
|
return cdf(*newargs) - q
|
|
|
|
def _ppf(q, *nargs):
|
|
return optimize.fsolve(_ppfopt, mean, args=(q,)+nargs)
|
|
|
|
_vppf = vectorize(_ppf)
|
|
U = random_sample(size=size)
|
|
return _vppf(*(U,)+args)
|