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左右
这背后有什么理论吗?让我们看看你在做什么:
- 在每一步中,您都需要
生成120个介于0和1之间的随机值,并获得它们的标准偏差。它总是在0.2887左右,有时更多,有时更少。解释见下文np
- 你把所有的标准差加起来,然后除以它们的计数。基本上,你得到了它们的平均值
- 因为它们太多了,所以它们越来越接近预期值
0.2887
而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()
- 在每一步中,您都需要
生成120个介于0和1之间的随机值,并获得它们的标准偏差。它总是在0.2887左右,有时更多,有时更少。解释见下文np
- 你把所有的标准差加起来,然后除以它们的计数。基本上,你得到了它们的平均值
- 因为它们太多了,所以它们越来越接近预期值
0.2887
- 让我们看看你在做什么:
而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