我已经编写了一个蒙特卡洛程序来集成函数f(x)。
我现在被要求计算百分比误差。
进行了快速文献搜索后,我发现可以用公式%error =(sqrt(var [f(x)] / n))* 100给出,其中n是我使用的随机点数得出我的答案。
但是,当我运行集成代码时,我的百分比误差大于此公式给出的误差。
我有正确的公式吗?
任何帮助将不胜感激。谢谢x
答案 0 :(得分:1)
这是一个简单的例子-使用Monte-Carlo估计区间[0 ... 1]上线性函数的积分。要估算误差,您必须先收集第二个动量(值的平方),然后计算方差,标准偏差和(假设CLT),以原始单位和%为单位的模拟误差。
代码,Python 3.7,Anaconda,Win10 64x
import numpy as np
def f(x): # linear function to integrate
return x
np.random.seed(312345)
N = 100000
x = np.random.random(N)
q = f(x) # first momentum
q2 = q*q # second momentum
mean = np.sum(q) / float(N) # compute mean explicitly, not using np.mean
var = np.sum(q2) / float(N) - mean * mean # variance as E[X^2] - E[X]^2
sd = np.sqrt(var) # std.deviation
print(mean) # should be 1/2
print(var) # should be 1/12
print(sd) # should be 0.5/sqrt(3)
print("-----------------------------------------------------")
sigma = sd / np.sqrt(float(N)) # assuming CLT, error estimation in original units
print("result = {0} with error +- {1}".format(mean, sigma))
err_pct = sigma / mean * 100.0 # error estimate in percents
print("result = {0} with error +- {1}%".format(mean, err_pct))
请注意,我们计算了一个西格玛误差,并且(即使不是在谈论它本身就是随机值),仅在68%的运行中,真实结果在打印的均值+误差范围内。您可以打印mean + -2 * error,这表示在95%的情况下,真实结果在该区域内,而mean + -3 * error正确的结果在该区域内的运行占99.7%,以此类推。 >
更新
对于抽样方差估计,存在一个称为Bias in the estimator的已知问题。基本上,我们低估了位采样方差,应采用适当的校正(贝塞尔校正)
var = np.sum(q2) / float(N) - mean * mean # variance as E[X^2] - E[X]^2
var *= float(N)/float(N-1)
在许多情况下(和许多示例中),由于N很大,因此忽略了校正,因此省略了它-fe,如果您的统计误差为1%,但N为数百万,则校正没有实际用途。 / p>