代码之家  ›  专栏  ›  技术社区  ›  Pbro98

均匀随机抽样未返回均匀样本(Scipy Uniform)

  •  0
  • Pbro98  · 技术社区  · 2 年前

    我正在设置一个实验,要求10个变量在-pi和pi之间均匀分布。使用 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)

    但即使在跑步时:

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

    循环只是无限期地运行。这向我表明,使用 rvs 事实上一点也不统一。我不确定这是我的疏忽,还是特定的环境导致了这个问题。

    我尝试使用 scipy.stats.uniform 然而,返回的值似乎根本没有被均匀采样。

    2 回复  |  直到 2 年前
        1
  •  3
  •   jared    2 年前

    根据 documentation ,你可以通过 loc scale 以便开启采样 [loc, loc + scale] .我相信你所提出的论点被解释为 loc 规模 ,因此您可以在 [-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 ]
    
        2
  •  1
  •   jlandercy    2 年前

    如果你想确认直觉,你可以进行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)
    

    我们可以拒绝H0,错误的风险小于0.1%。这证实了你的观察,你的配置在你期望的域上并不一致。

    确认统计scipy按预期工作总是令人欣慰的。