方差缩减——分层抽样
分成4个子区间
import numpy as np
n = 500
estimates = np.empty([100, 2])
def g(x):
if x >= 0 and x <= 1:
y = np.exp(-x) / (1 + x ** 2)
else:
y = 0
return y
def get_mean(X):
results = []
for x in X:
results.append(g(x))
return np.mean(results)
for i in range(100):
estimates[i, 0] = get_mean(np.random.uniform(0, 1, n))
t2 = []
t2.append(get_mean(np.random.uniform(0, 0.25, int(n / 4))))
t2.append(get_mean(np.random.uniform(0.25, 0.5, int(n / 4))))
t2.append(get_mean(np.random.uniform(0.5, 0.75, int(n / 4))))
t2.append(get_mean(np.random.uniform(0.75, 1, int(n / 4))))
estimates[i, 1] = np.mean(t2)
print(np.var(estimates, axis=0))
输出:[1.11658751e-04 8.00280336e-06]
分成100个子区间
import numpy as np
n = 500
estimates = np.empty([100, 2])
def g(x):
if x >= 0 and x <= 1:
y = np.exp(-x) / (1 + x ** 2)
else:
y = 0
return y
def get_mean(X):
results = []
for x in X:
results.append(g(x))
return np.mean(results)
intervals = np.linspace(0, 1, 100)
for i in range(100):
estimates[i, 0] = get_mean(np.random.uniform(0, 1, n))
t2 = []
for j in range(99):
t2.append(get_mean(np.random.uniform(intervals[j], intervals[j + 1], int(n / 100))))
estimates[i, 1] = np.mean(t2)
print(np.var(estimates, axis=0))
输出:[1.15212447e-04 1.57478224e-08]