我在做一个实验需要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个值。但是,返回的值似乎根本不是均匀采样的。
2条答案
按热度按时间kg7wmglp1#
根据documentation,您可以传递
loc
和scale
,以便在[loc, loc + scale]
上进行采样。我相信你传递的参数被解释为loc
和scale
,因此你在[-np.pi, -np.pi + np.pi]
上得到了均匀的采样,即。[-np.pi, 0]
。只需将2*np.pi
作为第二个参数传递即可。输出量:
ekqde3dh2#
如果你想确认一个直觉,你可以执行Kolmogorov检验:
我们不拒绝H0,我们可以假设样本(即使小到10)来自分布。
如果你检查你的第一个定义:
我们可以以小于0.1%的错误风险拒绝H0。这证实了您的观察,您的配置在您期望的域上并不一致。
从统计学上证实scipy按预期工作总是令人欣慰的。