提交 000307f1 authored 作者: Pascal Lamblin's avatar Pascal Lamblin

Fix estimation of variance for small sample sizes

上级 b59294ce
...@@ -307,7 +307,7 @@ def basictest(f, steps, sample_size, prefix="", allow_01=False, inputs=None, ...@@ -307,7 +307,7 @@ def basictest(f, steps, sample_size, prefix="", allow_01=False, inputs=None,
if inputs is None: if inputs is None:
inputs = [] inputs = []
dt = 0.0 dt = 0.0
avg_std = 0.0 avg_var = 0.0
for i in xrange(steps): for i in xrange(steps):
t0 = time.time() t0 = time.time()
...@@ -317,16 +317,14 @@ def basictest(f, steps, sample_size, prefix="", allow_01=False, inputs=None, ...@@ -317,16 +317,14 @@ def basictest(f, steps, sample_size, prefix="", allow_01=False, inputs=None,
ival = numpy.asarray(ival) ival = numpy.asarray(ival)
if i == 0: if i == 0:
mean = numpy.array(ival, copy=True) mean = numpy.array(ival, copy=True)
#avg_std = numpy.std(ival) avg_var = numpy.mean((ival - target_avg) ** 2)
avg_std = numpy.sqrt(numpy.mean((ival - target_avg) ** 2))
min_ = ival.min() min_ = ival.min()
max_ = ival.max() max_ = ival.max()
else: else:
alpha = 1.0 / (1 + i) alpha = 1.0 / (1 + i)
mean = alpha * ival + (1 - alpha) * mean mean = alpha * ival + (1 - alpha) * mean
#avg_std = alpha * numpy.std(ival) + (1-alpha)*avg_std avg_var = (alpha * numpy.mean((ival - target_avg) ** 2)
avg_std = alpha * numpy.sqrt(numpy.mean((ival - target_avg) ** 2 + (1 - alpha) * avg_var)
)) + (1 - alpha) * avg_std
min_ = min(min_, ival.min()) min_ = min(min_, ival.min())
max_ = max(max_, ival.max()) max_ = max(max_, ival.max())
if not allow_01: if not allow_01:
...@@ -343,10 +341,13 @@ def basictest(f, steps, sample_size, prefix="", allow_01=False, inputs=None, ...@@ -343,10 +341,13 @@ def basictest(f, steps, sample_size, prefix="", allow_01=False, inputs=None,
#print prefix, 'mean', mean #print prefix, 'mean', mean
assert abs(mean - target_avg) < mean_rtol, 'bad mean? %f %f' % ( assert abs(mean - target_avg) < mean_rtol, 'bad mean? %f %f' % (
numpy.mean(mean), target_avg) numpy.mean(mean), target_avg)
#print prefix, 'std', avg_std
std = numpy.sqrt(avg_var)
#print prefix, 'var', avg_var
#print prefix, 'std', std
if target_std is not None: if target_std is not None:
assert abs(avg_std - target_std) < .01, 'bad std? %f %f' % (avg_std, assert abs(std - target_std) < .01, 'bad std? %f %f' % (std,
target_std) target_std)
#print prefix, 'time', dt #print prefix, 'time', dt
#print prefix, 'elements', steps * sample_size[0] * sample_size[1] #print prefix, 'elements', steps * sample_size[0] * sample_size[1]
#print prefix, 'samples/sec', steps * sample_size[0] * sample_size[1] / dt #print prefix, 'samples/sec', steps * sample_size[0] * sample_size[1] / dt
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论