计算标准差

4 投票
2 回答
2463 浏览
提问于 2025-04-18 05:08

我需要做一个算法,通过蒙特卡罗方法来计算积分。为了模拟,我需要计算我程序中生成的样本的标准差。我的问题是,当我增加样本中的元素数量时,标准差并没有像我预期的那样减小。

起初我以为我的函数有问题,但我使用了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),其中 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

撰写回答