当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy stats.rvs_ratio_uniforms用法及代码示例


本文简要介绍 python 语言中 scipy.stats.rvs_ratio_uniforms 的用法。

用法:

scipy.stats.rvs_ratio_uniforms(pdf, umax, vmin, vmax, size=1, c=0, random_state=None)

使用 ratio-of-uniforms 方法从概率密度函数生成随机样本。

参数

pdf 可调用的

具有签名 pdf(x) 的函数,与分布的概率密度函数成比例。

umax 浮点数

u-direction 中边界矩形的上限。

vmin 浮点数

v-direction 中边界矩形的下界。

vmax 浮点数

v-direction 中边界矩形的上限。

size int 或整数元组,可选

定义随机变量的数量(默认为 1)。

c 浮点数,可选。

ratio-of-uniforms 方法的移位参数,请参见注释。默认值为 0。

random_state {无,整数, numpy.random.Generator

如果种子是无(或np.random), 这numpy.random.RandomState使用单例。如果种子是一个 int,一个新的RandomState使用实例,播种种子.如果种子已经是一个Generator或者RandomState实例然后使用该实例。

返回

rvs ndarray

随机变量根据 pdf 定义的概率分布分布。

注意

给定一个单变量概率密度函数pdf和一个常数c, 定义集合A = {(u, v) : 0 < u <= sqrt(pdf(v/u + c))}.如果(紫外线)是一个均匀分布的随机向量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)是有界的(即次二次尾部)。一个可以生成(紫外线)一致地R并返回V/U + c如果(紫外线)也在A可以直接验证。

如果对于任何常数 k > 0 将 pdf 替换为 k * pdf,则算法不会改变。因此,通过删除不必要的归一化因子来使用与概率密度函数成比例的函数通常很方便。

直观地说,如果A填满大部分封闭矩形,使得概率很高(紫外线)在于A每当它位于R因为否则所需的迭代次数会变得太大。更准确地说,请注意要绘制的预期迭代次数(紫外线)均匀分布在R这样(紫外线)也在A由比率给出area(R) / area(A) = 2 * umax * (vmax - vmin) / area(pdf),其中面积(pdf)是积分pdf(如果使用概率密度函数,则等于一,但如果使用与密度成比例的函数,则可以取其他值)。等式成立,因为面积A等于 0.5 * 面积(pdf)(定理 7.1 in[1])。如果采样在 50000 次迭代后未能生成单个随机变量(即没有一次抽签在A),引发异常。

如果未正确指定边界矩形(即,如果它不包含A),算法从不同于下式给出的分布中采样pdf.因此,建议执行测试,例如scipy.stats.kstest作为支票。

参考

1 (1,2)

L. Devroye,“非均匀随机变量生成”,Springer-Verlag,1986 年。

2

W. Hoermann 和 J. Leydold,“生成广义逆高斯随机变量”,统计与计算,24(4),p。 547-557,2014 年。

3

A.J. Kinderman 和 J.F. Monahan,“使用均匀偏差比率的随机变量的计算机生成”,ACM Transactions on Mathematical Software,3(3),p。 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

index 分布提供了另一个可以明确确定边界矩形的示例。

>>> 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

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.stats.rvs_ratio_uniforms。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。