我需要做一个算法来通过蒙特卡罗方法计算积分,为了模拟的目的,我需要计算在我的程序中生成的样本的标准偏差。 我的问题是,当我增加样本元素的数量时,我的标准偏差不会像我预期的那样衰减。 首先我认为我的函数是错误的,但是使用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
当我的n增加时,这种减少不应该吗?因为我需要在模拟中使用它作为停止标准,并且除了更大的样本之外,我对此进行了减少。我的数学概念出了什么问题?
提前致谢!
答案 0 :(得分:8)
分布的标准偏差不取决于样本大小。 standard deviation for a uniform distribution为(b - a)/sqrt(12)
,其中a
和b
是您发布的限制。在您的情况下,a = 0
和b = 1
,您应该期望std = 1/sqrt(12) = 0.288675
适用于任何尺寸的样本。
您正在寻找的是standard error,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
给出,随着样本量的增加而减少:
{{1}}
答案 1 :(得分:4)
不,你的数学概念没有缺陷,标准偏差对于较大的n保持不变。 AHuman正确指出的是你应该避免为变量名使用保留关键字:list是python reserved关键字。请改用my_list或其他变量名称。
[edit]因为计算的均值是随机的,所以误差范围不起作用;你必须计算置信区间,在这种情况下是一个概率误差界限。您可以在此处查看更多信息:http://planetmath.org/montecarlosimulation