当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy sampling.FastGeneratorInversion用法及代码示例


本文简要介绍 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。支持的发行版列表可以在注释部分找到。形状参数,locscale用于创建分布的必须是标量。例如,对于具有形状参数的 Gamma 分布p,p必须是浮点数,对于具有形状参数 (a, b) 的 beta 分布,a 和 b 都必须是浮点数。

domain 浮点数元组,可选

如果希望从截断/条件分布中采样,则必须指定域。默认值为“无”。在这种情况下,随机变量不会被截断,并且域是根据分布的支持推断的。

ignore_shape_range 布尔值,可选。

如果为 False,则形状参数超出有效值范围,以确保数值精度(请参阅注释)较高,引发 ValueError。如果为 True,则接受对分布有效的任何形状参数。这对于测试很有用。默认值为 False。

random_state {无,整数, numpy.random.Generator

NumPy 随机数生成器或底层 NumPy 随机数生成器的种子,用于生成均匀随机数流。如果 random_state 为 None,则使用 self.random_state 。如果 random_state 是 int,则使用np.random.default_rng(random_state)。如果 random_state 已经是GeneratorRandomState 实例,则使用该实例。

注意

该类为连续分布创建一个对象,指定为距离。方法rvs使用来自的生成器scipy.stats.sampling它是在对象实例化时创建的。此外,方法qrvsppf被添加。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,cdfpdfrv_frozen。使用此类的主要好处可概括如下: 一旦在设置步骤中创建了用于采样随机变量的生成器,就可以使用以下方法对 PPF 进行采样和评估:ppf速度非常快,并且性能本质上与分布无关。因此,如果需要大量随机变量,许多分布可以实现显著的加速。重要的是要知道这种快速采样是通过 CDF 的反转来实现的。因此,一个均匀随机变量被转换为非均匀变量,这对于多种模拟方法来说是一个优点,例如,当使用常见随机变量或对立变量的方差减少方法时([2])。

此外,反演使得可以 - 使用 QMC 生成器scipy.stats.qmc(方法qrvs), - 生成截断为区间的随机变量。例如,如果目标是从区间 (2, 4) 中采样标准正态随机变量,则可以通过使用参数轻松实现领域.

最初定义的位置和规模距离可以重置,而无需重新运行设置步骤来创建用于采样的生成器。分布关系Ylocscale到标准分布X(IE。,loc=0scale=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 浮点数

尺度参数。

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.stats.sampling.FastGeneratorInversion。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。