numpy 均匀随机抽样不返回均匀样本(Scipy均匀)

kfgdxczn  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(108)

我在做一个实验需要10个变量均匀分布在-π和π之间。这应该是相当微不足道的,使用scipy
详细信息:Python 3.8.16 NumPy 1.24.2 SciPy 1.10.1
注意:Python版本不能超过3.8.16,因为使用了模块PsychoPy,它不能在Python的最新版本上运行。

import numpy as np
from scipy.stats import uniform

uni = uniform(-np.pi, np.pi)
variables = uni.rvs(10)

这应该返回均匀分布在-pi和pi之间的10个值,但是它没有。它很少返回任何大于0的值,几乎所有的值都是负数。举例来说:

>>> uni.rvs(10)

array([-0.03489156, -0.50000997, -2.98451371, -1.7355833 , -2.68861409,
       -2.03613316, -2.33966294, -0.52913401, -0.47277852, -2.27422887])

出于实验目的,我需要这些值中的一些在uni.rvs(10)的至少一些迭代中大于0.4。
即使在跑步时:

i=0

while i <=0.4:
    i = uni.rvs()

这个循环会无限循环下去。这表明使用rvs进行的采样实际上根本不均匀。我不确定这是我的疏忽,还是特定的环境迫使这个问题。
我尝试使用scipy.stats.uniform从均匀分布中抽取10个值。但是,返回的值似乎根本不是均匀采样的。

kg7wmglp

kg7wmglp1#

根据documentation,您可以传递locscale,以便在[loc, loc + scale]上进行采样。我相信你传递的参数被解释为locscale,因此你在[-np.pi, -np.pi + np.pi]上得到了均匀的采样,即。[-np.pi, 0]。只需将2*np.pi作为第二个参数传递即可。

import numpy as np
from scipy.stats import uniform

uni = uniform(loc=-np.pi, scale=2*np.pi)
variables = uni.rvs(20)
print(variables)

输出量:

[-2.06319644  1.04916367  3.07400506  1.03832226  1.01205737 -0.57139507
  2.80455874  3.10886192 -2.18827084 -1.49833546 -1.54547847 -3.06877181
  1.15691104  1.48957702  1.36562556  2.69624898  0.03550638 -1.92457988
 -0.32644606 -1.9145792 ]
ekqde3dh

ekqde3dh2#

如果你想确认一个直觉,你可以执行Kolmogorov检验:

import numpy as np
from scipy import stats

np.random.seed(1234)

X = stats.uniform(loc=-np.pi, scale=2.*np.pi)
x = X.rvs(10)

stats.kstest(x, X.cdf)

# KstestResult(statistic=0.2799758081188034, pvalue=0.34631541108571073, statistic_location=1.759139883937797, statistic_sign=-1)

我们不拒绝H0,我们可以假设样本(即使小到10)来自分布。
如果你检查你的第一个定义:

Xbad = stats.uniform(loc=-np.pi, scale=np.pi)
stats.kstest(x, Xbad.cdf)

# KstestResult(statistic=0.6, pvalue=0.0005681672000000005, statistic_location=0.7672320360752276, statistic_sign=-1)

我们可以以小于0.1%的错误风险拒绝H0。这证实了您的观察,您的配置在您期望的域上并不一致。
从统计学上证实scipy按预期工作总是令人欣慰的。

相关问题