scipy.stats.rvs_ratio_uniforms¶
- scipy.stats.rvs_ratio_uniforms(pdf, umax, vmin, vmax, size=1, c=0, random_state=None)[源代码]¶
使用均匀比方法从概率密度函数生成随机样本。
- 参数
- pdf可调用
带签名的函数 pdf(x) 这与分布的概率密度函数成正比。
- umax浮动
u方向上的边界矩形的上界。
- vmin浮动
v方向上的边界矩形的下界。
- vmax浮动
v方向上边界矩形的上界。
- size整型或整型元组,可选
定义随机变量的数量(默认值为1)。
- c浮动,可选。
均匀比法的偏移参数,请参见注释。默认值为0。
- random_state :{无,整型,
numpy.random.Generator
,{无,整型, 如果 seed 为无(或 np.random )、
numpy.random.RandomState
使用的是Singleton。如果 seed 是一个整型、一个新的RandomState
实例,其种子设定为 seed 。如果 seed 已经是一个Generator
或RandomState
实例,则使用该实例。
- 退货
- rvsndarray
随机变量根据PDF定义的概率分布分布。
注意事项
给定一个单变量概率密度函数 pdf 和一个常量 c ,定义集合
A = {{(u, v) : 0 < u <= sqrt(pdf(v/u + c))}}
。如果 (U, V) 是均匀分布在 A ,那么 V/U + c 遵循根据 pdf 。上述结果(请参见 [1], [2]) 可用于仅使用pdf对随机变量进行采样,即不需要对CDF求逆。典型的选择 c 为零或模式为 pdf 。布景 A 是矩形的子集。
R = [0, umax] x [vmin, vmax]
哪里umax = sup sqrt(pdf(x))
vmin = inf (x - c) sqrt(pdf(x))
vmax = sup (x - c) sqrt(pdf(x))
具体地说,如果满足以下条件,则这些值是有限的 pdf 是有界的,并且
x**2 * pdf(x)
是有界的(即次二次尾部)。一个人可以产生 (U, V) 统一启用 R 然后返回 V/U + c 如果 (U, V) 也在 A 这是可以直接验证的。如果替换了一个,则算法不会改变 pdf 按k* pdf 对于任何常数k>0。因此,通过删除不必要的归一化因子来处理与概率密度函数成比例的函数通常是方便的。
直观地说,该方法在以下情况下工作良好 A 填充大部分封闭矩形,以便概率很高, (U, V) 位于 A 每当它躺在 R 因为否则所需的迭代次数变得太大。更准确地说,请注意要绘制的预期迭代次数 (U, V) 均匀分布在 R 这样一来, (U, V) 也在 A 是由比率给出的
area(R) / area(A) = 2 * umax * (vmax - vmin) / area(pdf)
,在哪里 area(pdf) 是的积分 pdf (如果使用概率密度函数,则该值等于1,但是如果使用与密度成比例的函数,则该值可以采用其他值)。平等是成立的,因为这个地区 A 等于0.5*面积(Pdf)(定理7.1 [1]) 。如果采样在50000次迭代后未能生成单个随机变量(即没有一个抽签 A ),则会引发异常。如果未正确指定边界矩形(即,如果它不包含 A ),则该算法从不同于由所给出的分布的分布中抽样 pdf 。因此,建议执行如下测试
kstest
作为支票。参考文献
- 1(1,2)
德德罗耶,“非均匀随机变量生成”,Springer-Verlag,1986。
- 2
W.Hoermann和J.Leydold,“生成广义逆高斯随机变量”,“统计与计算”,24(4),第547-557页,2014年。
- 3
A.J.Kinderman和J.F.Monahan,“使用均匀偏差比的随机变量的计算机生成”,数学软件学报,3(3),第257-260页,1977。
示例
>>> from scipy import stats >>> rng = np.random.default_rng()
模拟正态分布的随机变量。在这种情况下,很容易显式计算边界矩形。为简单起见,我们去掉了密度的归一化因子。
>>> f = lambda x: np.exp(-x**2 / 2) >>> v_bound = np.sqrt(f(np.sqrt(2))) * np.sqrt(2) >>> umax, vmin, vmax = np.sqrt(f(0)), -v_bound, v_bound >>> rvs = stats.rvs_ratio_uniforms(f, umax, vmin, vmax, size=2500, ... random_state=rng)
K-S检验确认随机变量确实是正态分布(在5%显著性水平上不拒绝正态分布):
>>> stats.kstest(rvs, 'norm')[1] 0.250634764150542
指数分布提供了可以显式确定边界矩形的另一个示例。
>>> rvs = stats.rvs_ratio_uniforms(lambda x: np.exp(-x), umax=1, ... vmin=0, vmax=2*np.exp(-1), size=1000, ... random_state=rng) >>> stats.kstest(rvs, 'expon')[1] 0.21121052054580314