计算标准差

4
我需要使用蒙特卡罗方法计算积分的算法,为了模拟目的,我需要计算程序生成的样本的标准差。我的问题是,当我增加样本元素的数量时,标准差并没有像我预期的那样衰减。起初我以为是函数有误,但使用numpy预定义的函数来计算标准差后,发现值是相同的,并且并没有像我预期的那样下降。所以我怀疑问题出在我的样本上,于是我进行了以下模拟来测试标准差是否会按照预期逐渐减小:
list = [random.uniform(0,1) for i in range(100)]
print np.std(list)

得到的标准差为:0.289

list = [random.uniform(0,1) for i in range(1000)]
print np.std(list)

得到的标准差为:0.287

随着样本量的增加,标准差不应该会减少吗?因为我需要将其作为模拟中的停止准则,并且我期望随着样本量的增加,它会减小。我的数学概念出了什么问题吗?

提前感谢!


不要将“list”用作变量,它用于创建列表。 - user2961646
那么我应该使用什么呢?数组? - Giiovanna
4
此问题似乎不适合这里,应该提交至 http://math.stackexchange.com/ 或者 http://stats.stackexchange.com/。我将为您进行翻译,尽量保持原意,并简化语言以便易懂。 - jonrsharpe
1
我的朋友,我刚刚计算了2个值。如果我多次这样做,一些值会随着n的增加而变得更大。 - Giiovanna
@inspectorG4dget,所有这样的列表(无论大小)都具有相同的标准差,误差由标准误差给出,并且具有相等(而不是低)的高于或低于实际总体标准偏差的概率,该值为1/sqrt(12)。更多信息请参见我的答案。 - askewchan
显示剩余3条评论
2个回答

8
分布的标准差与样本大小无关。对于均匀分布,标准差(b-a)/sqrt(12),其中ab是您的分布上下限。在您的情况下,a=0b=1,因此您应该期望任何样本大小的std=1/sqrt(12)=0.288675

也许您要找的是标准误差,其公式为std/sqrt(N),随着样本大小的增加而减小:

In [9]: sample = np.random.uniform(0, 1, 100)

In [10]: sample.std()/np.sqrt(sample.size)
Out[10]: 0.029738347511343809

In [11]: sample = np.random.uniform(0, 1, 1000)

In [12]: sample.std()/np.sqrt(sample.size)
Out[12]: 0.0091589707054713591

4
不,你的数学概念没有问题,标准偏差在n变大时保持不变。AHuman正确指出,你应该避免使用保留关键字作为变量名:list是Python保留关键字。请改用my_list或其他变量名。
【编辑】由于计算得到的平均值是随机的,误差边界将无法使用;您将不得不计算置信区间,这在本例中是概率性的误差边界。您可以在此处查找更多信息:http://planetmath.org/montecarlosimulation

好的,我在考虑使用标准差和样本均值之间的比率来停止我的模拟。这定义了一个相对误差,给定了这个相对误差,我想使用它来得到最佳的n和最佳的积分估计。但是,由于标准差将保持不变,所以这如何成为一个好的标准呢? - Giiovanna
我已经更改了我的列表名称,谢谢。 - Giiovanna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接