计算标准差
我需要做一个算法,通过蒙特卡罗方法来计算积分。为了模拟,我需要计算我程序中生成的样本的标准差。我的问题是,当我增加样本中的元素数量时,标准差并没有像我预期的那样减小。
起初我以为我的函数有问题,但我使用了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
难道在我增加样本数量时,标准差不应该减小吗?因为我需要这个标准差作为我模拟的停止标准,而我本来期待样本越大,标准差就越小。我的数学概念哪里出错了呢?
谢谢大家!
2 个回答
4
不,你的数学概念没有问题,标准差在样本量变大时是保持不变的。AHuman 正确指出,你应该避免使用保留字作为变量名:比如 list 是 Python 的一个保留字。你可以用 my_list 或者其他的变量名来代替。
[编辑] 因为计算出来的平均值是随机的,所以误差范围是无法使用的;你需要计算置信区间,这在这种情况下是一个概率误差范围。你可以在这里找到更多信息:http://planetmath.org/montecarlosimulation
8
一个分布的标准差跟样本的大小没有关系。对于均匀分布来说,标准差的计算公式是 (b - a)/sqrt(12)
,其中 a
和 b
是你分布的上下限。在你的例子中,a = 0
和 b = 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