我需要做一个算法,通过蒙特卡罗方法计算一个积分,为了模拟的目的,我需要计算在我的程序中生成的样本的标准差。我的问题是,当我增加我的样本元素的数量时,我的标准差不会像我所期望的那样衰减。首先,我认为我的函数是错误的,但是使用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增加吗?因为我需要在我的模拟中使用它作为停止准则,并且我例外地用一个更大的样本来减少这个值。我的数学概念有什么问题?
提前感谢!
发布于 2014-05-02 15:16:01
分布的标准差不取决于样本的大小。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发布于 2014-05-02 15:06:09
不,您的数学概念没有缺陷,对于较大的n,标准偏差保持不变。AHuman正确指出的是,您应该避免对变量名使用保留关键字: list是python关键字。使用my_list或其他变量名代替。
编辑,因为计算出的平均值是随机的,误差界将不起作用;您必须计算置信区间,在这种情况下,置信区间是概率错误界。您可以在这里查找更多信息:http://planetmath.org/montecarlosimulation
https://stackoverflow.com/questions/23431138
复制相似问题