Python 为什么结果总是在2.87左右

Python 为什么结果总是在2.87左右,python,numpy,math,random,Python,Numpy,Math,Random,我有下面的代码 result=0 loop_n=10000 for i in range(loop_n): result+=np.random.rand(3,4,10).std() result=result/loop_n print(result) 据我所知,如果我多次运行,结果应该不同,因为结果来自随机,但实际上结果总是在0.287左右 这背后有什么理论吗?让我们看看你在做什么: 在每一步中,您都需要np生成120个介于0和1之间的随机值,并获得它们的标准偏差。它总是在0.288

我有下面的代码

result=0
loop_n=10000
for i in range(loop_n):
    result+=np.random.rand(3,4,10).std()
result=result/loop_n
print(result)
据我所知,如果我多次运行,结果应该不同,因为结果来自随机,但实际上结果总是在0.287左右


这背后有什么理论吗?

让我们看看你在做什么:

  • 在每一步中,您都需要
    np
    生成120个介于0和1之间的随机值,并获得它们的标准偏差。它总是在0.2887左右,有时更多,有时更少。解释见下文
  • 你把所有的标准差加起来,然后除以它们的计数。基本上,你得到了它们的平均值
  • 因为它们太多了,所以它们越来越接近预期值
    0.2887
说明:

如果您在Python控制台中执行
而1:np.random.rand(3,4,10).std()
,您会看到大量发出的数字(直到按下Ctrl-C),它们有时是
.266
,有时是
.297
等等

但它们是什么意思?标准偏差是(非常粗略地说)一组值与其平均值之间距离的平均值

  • 如果取
    [.5,5,5]
    ,则平均值为
    .5
    ,标准值为
    0
  • 但是对于
    [0,5,1]
    ,平均值也是
    .5
    ,但是标准值是
    .408248
  • 使用
    np.f64([.0,1,2,3,4,5,6,7,8,9,1]).std()
    ,您可以得到
    .316
  • 使用
    np.random.rand(300300300).std()
    ,您可以得到与您相同的结果:始终在
    .2887
    附近。 为什么期望值正好是
    .2887
    源自标准偏差的定义。本质上,它源于
    np.random.rand()
    产生的预期均匀分布

    • 让我们看看你在做什么:

      • 在每一步中,您都需要
        np
        生成120个介于0和1之间的随机值,并获得它们的标准偏差。它总是在0.2887左右,有时更多,有时更少。解释见下文
      • 你把所有的标准差加起来,然后除以它们的计数。基本上,你得到了它们的平均值
      • 因为它们太多了,所以它们越来越接近预期值
        0.2887
      说明:

      如果您在Python控制台中执行
      而1:np.random.rand(3,4,10).std()
      ,您会看到大量发出的数字(直到按下Ctrl-C),它们有时是
      .266
      ,有时是
      .297
      等等

      但它们是什么意思?标准偏差是(非常粗略地说)一组值与其平均值之间距离的平均值

      • 如果取
        [.5,5,5]
        ,则平均值为
        .5
        ,标准值为
        0
      • 但是对于
        [0,5,1]
        ,平均值也是
        .5
        ,但是标准值是
        .408248
      • 使用
        np.f64([.0,1,2,3,4,5,6,7,8,9,1]).std()
        ,您可以得到
        .316
      • 使用
        np.random.rand(300300300).std()
        ,您可以得到与您相同的结果:始终在
        .2887
        附近。 为什么期望值正好是
        .2887
        源自标准偏差的定义。本质上,它源于
        np.random.rand()
        产生的预期均匀分布

      这只是证明
      np.random.rand
      是一个很好的统一随机生成器。你有10000次观察到的分布的标准偏差遵循同样的规律。标准偏差是方差的平方根,因此理论(概率)标准偏差是一致的。你有一个相当大的样本量,因此观察到的估计值将接近理论标准偏差,即
      1/sqrt(12)
      ,约为0.2886759481287。但现在它变成了一个数学问题:-)



      假设[0,1]上均匀分布,概率(理论)平均值E(X)是[0-1]段上X的积分,即0.5。方差的定义是E((X-E(X))2),它可以计算为段[-0.5,0.5]上x2的积分,其平方根给出上面所写的结果。

      这只是证明
      np.rand.rand
      是一个很好的均匀随机生成器。你有10000次观察到的分布的标准偏差遵循同样的规律。标准偏差是方差的平方根,因此理论(概率)标准偏差是一致的。你有一个相当大的样本量,因此观察到的估计值将接近理论标准偏差,即
      1/sqrt(12)
      ,约为0.2886759481287。但现在它变成了一个数学问题:-)



      假设[0,1]上均匀分布,概率(理论)平均值E(X)是[0-1]段上X的积分,即0.5。方差的定义为E((X-E(X))2),可以计算为段[-0.5,0.5]上x2的积分,其平方根给出上述结果。

      numpy函数
      rand
      从均匀分布中提取一个随机数
      [0,1)
      ,这意味着获得0和1之间任何数字的概率相等。您的代码从该分布中提取120个随机数,并使用公式计算标准偏差的估计值

      std = sqrt(mean(abs(x - x.mean())**2))
      
      然后,您的代码计算标准偏差估计值的平均值,这将使估计值收敛到理论值


      为了计算理论值,我们可以对均匀分布的随机变量
      x
      使用
      variance(x)=1/12
      。这意味着
      std(x)=sqrt(1/12)=0.2887
      ,这接近模拟结果。

      numpy函数
      rand
      绘制了一个随机数
      loop_n=1000000
      result=0
      print_at = 1
      for i in range(1, loop_n+1):
          result+=np.random.rand(3,4,10).var(ddof=1)
          if i == print_at:
              print(math.sqrt(result/i))
              print_at *= 10
      
      print("...")
      print(math.sqrt(1/12))
      
      0.28103387158480164
      0.2952158859220745
      0.2902562660869275
      0.28882685146952614
      0.2887019908636715
      0.2886783761564752
      0.2886714244895549
      ...
      0.28867513459481287