本文简要介绍 python 语言中 scipy.stats.sampling.FastGeneratorInversion
的用法。
用法:
class scipy.stats.sampling.FastGeneratorInversion(dist, *, domain=None, ignore_shape_range=False, random_state=None)#
通过 CDF 的数值反转对
scipy.stats
中的一大类连续分布进行快速采样。- dist: rv_frozen 对象
冻结分布对象来自
scipy.stats
。支持的发行版列表可以在注释部分找到。形状参数,loc
和scale
用于创建分布的必须是标量。例如,对于具有形状参数的 Gamma 分布p,p必须是浮点数,对于具有形状参数 (a, b) 的 beta 分布,a 和 b 都必须是浮点数。- domain: 浮点数元组,可选
如果希望从截断/条件分布中采样,则必须指定域。默认值为“无”。在这种情况下,随机变量不会被截断,并且域是根据分布的支持推断的。
- ignore_shape_range: 布尔值,可选。
如果为 False,则形状参数超出有效值范围,以确保数值精度(请参阅注释)较高,引发 ValueError。如果为 True,则接受对分布有效的任何形状参数。这对于测试很有用。默认值为 False。
- random_state: {无,整数,
numpy.random.Generator
, numpy.random.RandomState
}, optionalNumPy 随机数生成器或底层 NumPy 随机数生成器的种子,用于生成均匀随机数流。如果
random_state
为 None,则使用self.random_state
。如果random_state
是 int,则使用np.random.default_rng(random_state)
。如果random_state
已经是Generator
或RandomState
实例,则使用该实例。
参数 ::
注意:
该类为连续分布创建一个对象,指定为距离。方法
rvs
使用来自的生成器scipy.stats.sampling
它是在对象实例化时创建的。此外,方法qrvs
和ppf
被添加。qrvs
根据 quasi-random 数字生成样本scipy.stats.qmc
.ppf
是基于数值反演方法的PPF[1](scipy.stats.sampling.NumericalInversePolynomial)用于生成随机变量。支持的发行版(远程名称) 是:
alpha
,anglit
,argus
,beta
,betaprime
,bradford
,burr
,burr12
,cauchy
,chi
,chi2
,cosine
,crystalball
,expon
,gamma
,gennorm
,geninvgauss
,gumbel_l
,gumbel_r
,hypsecant
,invgamma
,invgauss
,invweibull
,laplace
,logistic
,maxwell
,moyal
,norm
,pareto
,powerlaw
,t
,rayleigh
,semicircular
,wald
,weibull_max
,weibull_min
.rvs
依赖于数值反演的精度。如果使用非常极端的形状参数,数值反演可能不起作用。然而,对于所有实现的分布,允许的形状参数已经过测试,如果用户提供超出允许范围的值,则会出现错误。对于所有有效参数,u-error 不应超过 1e-10。请注意,即使实例化对象时参数在有效范围内,也可能会引发警告。要检查数值准确性,可以使用方法evaluate_error
。请注意,所有已实现的发行版也是
scipy.stats
,以及创建的对象FastGeneratorInversion
依赖于类似的方法ppf
,cdf和pdf从rv_frozen。使用此类的主要好处可概括如下: 一旦在设置步骤中创建了用于采样随机变量的生成器,就可以使用以下方法对 PPF 进行采样和评估:ppf
速度非常快,并且性能本质上与分布无关。因此,如果需要大量随机变量,许多分布可以实现显著的加速。重要的是要知道这种快速采样是通过 CDF 的反转来实现的。因此,一个均匀随机变量被转换为非均匀变量,这对于多种模拟方法来说是一个优点,例如,当使用常见随机变量或对立变量的方差减少方法时([2])。此外,反演使得可以 - 使用 QMC 生成器
scipy.stats.qmc
(方法qrvs
), - 生成截断为区间的随机变量。例如,如果目标是从区间 (2, 4) 中采样标准正态随机变量,则可以通过使用参数轻松实现领域.最初定义的位置和规模距离可以重置,而无需重新运行设置步骤来创建用于采样的生成器。分布关系Y和
loc
和scale
到标准分布X(IE。,loc=0
和scale=1
) 是(谁)给的Y = loc + scale * X
.参考:
[1]德弗林格、格哈德、沃尔夫冈·霍曼和约瑟夫·莱多德。 “当仅知道密度时,通过数值反演生成随机变量。” ACM 建模和计算机仿真汇刊 (TOMACS) 20.4 (2010):1-25。
[2]霍曼、沃尔夫冈、约瑟夫·莱多德和格哈德·德弗林格。 “自动非均匀随机数生成。”施普林格,2004。
例子:
>>> import numpy as np >>> from scipy import stats >>> from scipy.stats.sampling import FastGeneratorInversion
让我们从一个简单的例子开始来说明主要函数:
>>> gamma_frozen = stats.gamma(1.5) >>> gamma_dist = FastGeneratorInversion(gamma_frozen) >>> r = gamma_dist.rvs(size=1000)
平均值应约等于形状参数 1.5:
>>> r.mean() 1.52423591130436 # may vary
同样,我们可以根据quasi-random数字抽取样本:
>>> r = gamma_dist.qrvs(size=1000) >>> r.mean() 1.4996639255942914 # may vary
将 PPF 与近似值
ppf
进行比较。>>> q = [0.001, 0.2, 0.5, 0.8, 0.999] >>> np.max(np.abs(gamma_frozen.ppf(q) - gamma_dist.ppf(q))) 4.313394796895409e-08
为了确认数值反演的准确性,我们评估近似误差(u-error),该误差应低于1e-10(更多详细信息,请参阅
evaluate_error
的文档):>>> gamma_dist.evaluate_error() (7.446320551265581e-11, nan) # may vary
请注意,可以更改位置和比例,而无需实例化新的生成器:
>>> gamma_dist.loc = 2 >>> gamma_dist.scale = 3 >>> r = gamma_dist.rvs(size=1000)
平均值应约为 2 + 3*1.5 = 6.5。
>>> r.mean() 6.399549295242894 # may vary
我们还说明如何应用截断:
>>> trunc_norm = FastGeneratorInversion(stats.norm(), domain=(3, 4)) >>> r = trunc_norm.rvs(size=1000) >>> 3 < r.min() < r.max() < 4 True
检查平均值:
>>> r.mean() 3.250433367078603 # may vary
>>> stats.norm.expect(lb=3, ub=4, conditional=True) 3.260454285589997
在这种特殊情况下,
scipy.stats.truncnorm
也可用于生成截断的正态随机变量。- loc: 浮点数
位置参数。
- random_state: {
numpy.random.Generator
,numpy.random.RandomState
} rvs
等相关方法中使用的随机状态(除非另一个random_state
作为参数传递给这些方法)。- scale: 浮点数
尺度参数。
属性 ::
相关用法
- Python SciPy sampling.DiscreteAliasUrn用法及代码示例
- Python SciPy sampling.DiscreteGuideTable用法及代码示例
- Python SciPy sampling.RatioUniforms用法及代码示例
- Python SciPy sampling.TransformedDensityRejection用法及代码示例
- Python SciPy sampling.SimpleRatioUniforms用法及代码示例
- Python SciPy sampling.NumericalInverseHermite用法及代码示例
- Python SciPy sampling.NumericalInversePolynomial用法及代码示例
- Python SciPy stats.anderson用法及代码示例
- Python SciPy stats.iqr用法及代码示例
- Python SciPy special.exp1用法及代码示例
- Python SciPy special.expn用法及代码示例
- Python SciPy signal.czt_points用法及代码示例
- Python SciPy signal.chirp用法及代码示例
- Python SciPy stats.genpareto用法及代码示例
- Python SciPy signal.residue用法及代码示例
- Python SciPy special.ncfdtri用法及代码示例
- Python SciPy special.gamma用法及代码示例
- Python SciPy signal.iirdesign用法及代码示例
- Python SciPy special.y1用法及代码示例
- Python SciPy special.y0用法及代码示例
- Python SciPy special.ellip_harm_2用法及代码示例
- Python SciPy signal.max_len_seq用法及代码示例
- Python SciPy sparse.isspmatrix用法及代码示例
- Python SciPy signal.kaiser_atten用法及代码示例
- Python SciPy stats.skewnorm用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.stats.sampling.FastGeneratorInversion。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。