scipy.stats.sampling.

快速生成器反转#

class scipy.stats.sampling.FastGeneratorInversion(dist, *, domain=None, ignore_shape_range=False, random_state=None)[源代码][源代码]#

通过数值反演法对 scipy.stats 中一大类连续分布的CDF进行快速采样。

参数:
distrv_frozen 对象

来自 scipy.stats 的冻结分布对象。支持的分布列表可以在注释部分找到。用于创建分布的形状参数 locscale 必须是标量。例如,对于形状参数为 p 的 Gamma 分布,p 必须是浮点数,而对于形状参数为 (a, b) 的 beta 分布,a 和 b 都必须是浮点数。

领域浮点数元组,可选

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

ignore_shape_range布尔值,可选。

如果为 False,形状参数如果超出确保数值精度(见注释)的值的有效范围,则会引发 ValueError。如果为 True,则接受分布有效的任何形状参数。这在测试时可能很有用。默认值为 False。

random_state{None, int,}

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

属性:
loc浮动

位置参数。

random_statetoctree 是一个 reStructuredText 指令 ,这是一个非常多功能的标记。指令可以有参数、选项和内容。

在相关方法中使用的随机状态,如 rvs`(除非将另一个 `random_state 作为参数传递给这些方法)。

比例浮动

比例参数。

方法

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 中的生成器。此外,还添加了 qrvsppf 方法。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 中的 ppfcdfpdf 等方法。使用此类的主要好处可以总结如下:一旦在设置步骤中创建了采样随机变量的生成器,使用 ppf 进行采样和 PPF 评估都非常快,并且性能基本上与分布无关。因此,如果需要大量随机变量,对于许多分布可以实现显著的速度提升。重要的是要知道,这种快速采样是通过 CDF 的反演实现的。因此,一个均匀随机变量被转换为非均匀变量,这对于几种模拟方法是一个优势,例如,当使用常见的随机变量或对立变量的方差减少方法时([2])。

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

最初由 dist 定义的位置和尺度可以在不重新运行设置步骤以创建用于采样的生成器的情况下重置。分布 Ylocscale 相对于标准分布 X`(即 ``loc=0`scale=1)的关系由 Y = loc + scale * X 给出。

参考文献

[1]

Derflinger, Gerhard, Wolfgang Hörmann, 和 Josef Leydold. “仅知密度时的数值反演随机变量生成.” ACM 建模与计算机模拟交易 (TOMACS) 20.4 (2010): 1-25.

[2]

Hörmann, Wolfgang, Josef Leydold 和 Gerhard Derflinger。《自动非均匀随机数生成》。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-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 也可以用来生成截断正态随机变量。