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_min 或 u_max 是None
,这两个值都是用数值计算的。默认值为None
。- u_max: float, optional
设置边框的右边界。设置边界矩形的左边界,请参阅注释下的详细信息。如有必要,请考虑使用
scipy.optimize
。重要提示:必须提供边界dist.pdf(x - center)
。如果None
,将使用数值例程来求出界。此例程可能会失败,特别是当矩形没有边界时。注意:如果 u_min 或 u_max 是None
,这两个值都是用数值计算的。默认值为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 已经是一个Generator
或RandomState
实例,则使用该实例。
注意事项
如果
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()
方法:
rvs
\([size] )分发的样本。
set_random_state
\([random_state] )设置基础均匀随机数生成器。