FastGeneratorInversion#
- class scipy.stats.sampling.FastGeneratorInversion(dist, *, domain=None, ignore_shape_range=False, random_state=None)[源代码]#
通过数值反演 CDF,为
scipy.stats
中的一大类连续分布进行快速采样。- 参数:
- distrv_frozen 对象
来自
scipy.stats
的冻结分布对象。 支持的分布列表可以在 Notes 部分找到。 用于创建分布的形状参数loc
和scale
必须是标量。 例如,对于形状参数为 *p* 的 Gamma 分布,*p* 必须是一个浮点数;对于形状参数为 (a, b) 的 beta 分布,a 和 b 都必须是浮点数。- domainfloat 元组,可选
如果希望从截断/条件分布中采样,则必须指定 domain。 默认为 None。 在这种情况下,随机变量不会被截断,并且域是从分布的支持推断出来的。
- ignore_shape_range布尔值,可选。
如果为 False,则形状参数超出有效值范围以确保数值精度(请参阅 Notes),则会引发 ValueError。 如果为 True,则接受对分布有效的所有形状参数。 这对于测试很有用。 默认为 False。
- random_state{None, int,
numpy.random.Generator
, 用于生成均匀随机数流的底层 NumPy 随机数生成器或种子。 如果
random_state
为 None,则使用self.random_state
。 如果random_state
是一个 int,则使用np.random.default_rng(random_state)
。 如果random_state
已经是一个Generator
或RandomState
实例,则使用该实例。
- 属性:
- locfloat
位置参数。
- random_state{
numpy.random.Generator
,numpy.random.RandomState
} 在相关方法(例如
rvs
)中使用的随机状态(除非另一个random_state
作为参数传递给这些方法)。- scalefloat
比例参数。
方法
evaluate_error
([size, random_state, x_error])评估反演的数值精度(u 误差和 x 误差)。
ppf
(q)分布的非常快的 PPF(逆 CDF),它是对精确 PPF 值的非常接近的近似值。
qrvs
([size, d, qmc_engine])给定分布的准随机变量。
rvs
([size])通过反演从分布中采样。
support
()分布的支持。
cdf
注释
该类创建一个由 *dist* 指定的连续分布对象。 方法
rvs
使用来自scipy.stats.sampling
的生成器,该生成器在实例化对象时创建。 此外,还添加了方法qrvs
和ppf
。qrvs
基于来自scipy.stats.qmc
的准随机数生成样本。ppf
是基于 [1] 中的数值反演方法(NumericalInversePolynomial
)的 PPF,该方法用于生成随机变量。支持的分布(*distname*)是:
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 误差不应超过 1e-10。 请注意,即使参数在实例化对象时在有效范围内,也可能会引发警告。 要检查数值精度,可以使用方法evaluate_error
。请注意,所有已实现的分布也是
scipy.stats
的一部分,并且由FastGeneratorInversion
创建的对象依赖于来自 *rv_frozen* 的方法(如ppf
、*cdf* 和 *pdf*)。 使用此类的主要好处可以总结如下:一旦在设置步骤中创建了用于对随机变量进行采样的生成器,使用ppf
进行采样和 PPF 的评估非常快,并且性能基本上与分布无关。 因此,如果需要大量的随机变量,则可以为许多分布实现显着的加速。 重要的是要知道,这种快速采样是通过 CDF 的反演来实现的。 因此,一个均匀随机变量被转换为一个非均匀变量,这对于几种模拟方法来说是一个优势,例如,当使用公共随机变量或对立变量的方差减少方法时([2])。此外,反演使得可以 - 使用来自
scipy.stats.qmc
的 QMC 生成器(方法qrvs
), - 生成截断为间隔的随机变量。 例如,如果目的是从区间 (2, 4) 中抽取标准正态随机变量,则可以通过使用参数 *domain* 轻松实现。最初由 *dist* 定义的位置和比例可以重置,而无需重新运行设置步骤来创建用于采样的生成器。 分布 *Y* 与
loc
和scale
与标准分布 *X*(即,loc=0
和scale=1
)的关系由Y = loc + scale * X
给出。参考文献
[1]Derflinger, Gerhard, Wolfgang Hörmann, and Josef Leydold. “Random variate generation by numerical inversion when only the density is known.” ACM Transactions on Modeling and Computer Simulation (TOMACS) 20.4 (2010): 1-25.
[2]Hörmann, Wolfgang, Josef Leydold and Gerhard Derflinger. “Automatic nonuniform random number generation.” Springer, 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
类似地,我们可以基于准随机数绘制样本
>>> 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 误差),该误差应低于 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
来生成截断的正态随机变量。