scipy.stats.NaiveRatioUniforms

class scipy.stats.NaiveRatioUniforms(dist, *, center=0, domain=None, r=1.0, u_min=None, u_max=None, v_max=None, random_state=None)

朴素的制服比(NROU)法。

NROU是使用(最小)边界矩形的(广义)均匀比方法的一种实现 ([3], [5]) 。它使用正控制参数 r 用于将算法调整到给定分布以提高性能和/或使该方法适用。值较大的 r 以较高的拒绝常数为代价,增加该方法适用的分布类别。出于计算原因, r=1 如果可能的话,应该使用。

参数
dist对象

的类的实例 pdf 方法。

  • pdf :发行版的PDF格式。PDF的签名应为: def pdf(self, x: float) -> float 即,PDF应该接受Python浮点并返回Python浮点。它不需要集成到1,也就是说,PDF不需要标准化。

center浮动,可选

模式的近似位置或分布的平均值。此位置提供有关PDF主要部分的一些信息,用于避免数字问题。默认值为 None

domain长度为2的列表或元组,可选

发行版的支持。默认值为 None 。什么时候 None

  • 如果一个 support 方法由分发对象提供 dist ,用于设置分布的域。

  • 否则,假定支持为 \((-\infty, \infty)\)

r浮动,可选

设置参数 r > 0 对于广义均匀比方法。默认值为1.0。

u_min: float, optional

设置边界矩形的左边界,请参阅注释下的详细信息。如有必要,请考虑使用 scipy.optimize 。重要提示:必须提供边界 dist.pdf(x - center) 。如果 None ,将使用数值例程来求出界。此例程可能会失败,特别是当矩形没有边界时。注意:如果 u_minu_maxNone ,这两个值都是用数值计算的。默认值为 None

u_max: float, optional

设置边框的右边界。设置边界矩形的左边界,请参阅注释下的详细信息。如有必要,请考虑使用 scipy.optimize 。重要提示:必须提供边界 dist.pdf(x - center) 。如果 None ,将使用数值例程来求出界。此例程可能会失败,特别是当矩形没有边界时。注意:如果 u_minu_maxNone ,这两个值都是用数值计算的。默认值为 None

v_max: float, optional

设置边框的上边界。如果pdf的模式是已知的,就可以很容易地计算出来,详情请参阅注释。否则,请考虑使用 scipy.optimize 。如果 None ,将使用数值例程来求出界。此例程可能会失败,特别是当矩形没有边界时。默认值为 None

random_state :{无,整型, numpy.random.Generator{无,整型,

用于生成均匀随机数流的基础NumPy随机数生成器的NumPy随机数生成器或种子。如果 random_state 为无(或 np.random )、 numpy.random.RandomState 使用的是Singleton。如果 random_state 是一个整型、一个新的 RandomState 实例,其种子设定为 random_state 。如果 random_state 已经是一个 GeneratorRandomState 实例,则使用该实例。

注意事项

如果 r==1 ,则该方法的工作方式如下:对于给定的pdf和常量 center ,定义集合 A = {{(u, v) : 0 < v <= sqrt(pdf(u/v + center))}} 。如果(U,V)是均匀分布在A上的随机向量,则 U/V + center 遵循根据 dist.pdf

典型的选择 center 为零或模式为pdf。集合A是矩形的子集 R = [u_min, u_max] x [0, v_max] 哪里

  • v_max = sup_x sqrt(pdf(x))

  • u_min = inf_x (x - center) sqrt(pdf(x))

  • u_max = sup_x (x - center) sqrt(pdf(x))

特别地,如果pdf是有界的,并且这些值是有限的,则这些值是有限的。 x**2 * pdf(x) 是有界的(即次二次尾部)。可以在R上均匀地生成(U,V)并返回 U/V + center 如果(U,V)也在A中,可以直接验证。

如果用与PDF成比例的函数替换PDF,例如通过丢弃不必要的归一化因子,则算法不会改变。

直观地说,如果A填满了包围矩形的大部分,使得当(U,V)位于R中时(U,V)位于A的概率很高,否则所需的迭代次数变得太大,则该方法效果很好。更精确地说,要在R上均匀地绘制(U,V)使得(U,V)也在A中的期望迭代次数由比率给出 area(R) / area(A) = 2 * v_max * (u_max - u_min) / area(pdf) ,在哪里 area(pdf) 是pdf的积分(如果使用真实pdf,则等于1,但如果使用与真实pdf成比例的函数,则可以采用其他值)。由于A的面积等于 0.5 * area(pdf) (定理7.1在 [4]) 。

在一般情况下,接受区域被定义为 A = {{(u, v) : 0 < v <= (pdf(u/v**r + center))**(1/(r+1))}} 边界矩形由

  • v_max = sup_x pdf(x)**(1/(r+1))

  • u_min = inf_x (x - center) (pdf(x))**(r/(r+1))

  • u_max = sup_x (x - center) (pdf(x))**(r/(r+1))

拒绝常数由下式给出 (r+1) * v_max * (u_max - u_min) / area(pdf) 在一般情况下。

注意,在当前实现中,该生成方法的速度因以下事实而降低: dist 对于模拟的每个随机变量,即使pdf是矢量化的,也需要从C调用(要模拟N个随机变量,pdf的平均求值次数是拒绝常数的N倍)。

参考文献

1

联合国参考手册,第5.3.11节,“朴素制服比法”,http://statmath.wu.ac.at/software/unuran/doc/unuran.html#NROU

2

书名/作者:Reinessy,and G.Derflinger(2004),W.Hörmann,J.Leydold和G.非均匀随机变量自动生成,施普林格,柏林。

3

A.J.Kinderman和J.F.Monahan,“使用均匀偏差比的随机变量的计算机生成”,数学软件学报,3(3),第257-260页,1977。

4

德德罗耶,“非均匀随机变量生成”,Springer-Verlag,1986。

5

书名/作者声明:by J.C.韦克菲尔德、A.E.吉尔芬德和A.F.M.史密斯。“通过一致性比方法有效地生成随机变量。”“统计与计算”1.2,第129--133页,1991年。

示例

>>> from scipy.stats import NaiveRatioUniforms

假设我们想要生成正态分布的随机变量。在这种情况下,很容易显式计算边界矩形。请注意,我们去掉了密度的归一化因子。由于分布模式为零,因此无需更改参数的默认值 center

>>> urng = np.random.default_rng()
>>> class MyDist:
...     def pdf(self, x):
...         return np.exp(-0.5*x*x)
>>> dist = MyDist()
>>> u_bound = np.sqrt(dist.pdf(np.sqrt(2))) * np.sqrt(2)
>>> v_max = np.sqrt(dist.pdf(0))
>>> rng = NaiveRatioUniforms(dist, u_min=-u_bound, u_max=u_bound,
...                          v_max=v_max, random_state=urng)

一旦我们创建了生成器,我们就可以绘制正态分布的样本:

>>> import matplotlib.pyplot as plt
>>> rvs = rng.rvs(1000)
>>> x = np.linspace(rvs.min()-0.1, rvs.max()+0.1, 100)
>>> fx = dist.pdf(x) / np.sqrt(2*np.pi)
>>> plt.plot(x, fx, 'r-', lw=2, label='normal pdf')
>>> plt.hist(rvs, bins=20, density=True, alpha=0.8, label='random variates')
>>> plt.xlabel('x')
>>> plt.legend()
>>> plt.show()
../../_images/scipy-stats-NaiveRatioUniforms-1.png

方法:

rvs \([size] )

分发的样本。

set_random_state \([random_state] )

设置基础均匀随机数生成器。