1.Почему так мало изменчивости?
Это закон больших чисел.Если вы выбираете случайную переменную достаточно часто, вы ожидаете получить хорошую оценку истинного среднего.
https://en.wikipedia.org/wiki/Law_of_large_numbers
2.Почему 0,287?
rand
возвращает равномерно распределенные числа от 0 до 1, поэтому истинное среднее значение равно 1/2, а истинная дисперсия равна целому [-1 / 2..1 / 2] x ^ 2 dx, чтоВы можете проверить, чтобы быть 1/12.Std является квадратным корнем этого ~0.289
.
3.Почему не совсем sqrt (1/12) ~ 0,289?
Но подождите, это немного не так.Зачем?Поскольку numpy
возвращает образец var / std, который является искаженной оценкой реальной вещи, он систематически недооценивает их.Когда вы производите выборку в сравнительно небольших партиях размером N=120
, это дает небольшую, но последовательную разницу.Как только мы добавим поправку N / (N-1) (в пересчете на стандартное значение), мы получим лучшее соответствие.Вы можете попробовать это в своем коде, передав ключевое слово ddof=1
std
.
4.Но с поправкой результат кажется слишком малым?
Это правильно.Поправочный коэффициент N/(N-1)
дает непредвзятую оценку для var
, но не для std
, в основном потому, что взятие среднего значения, а затем sqrt не совпадает с взятием sqrt и среднего значения.
Вы можете проверить это, используя var
(все еще с аргументом ddof=1
) вместо std
и взяв sqrt после получения среднего значения:
loop_n=1000000
result=0
print_at = 1
for i in range(1, loop_n+1):
result+=np.random.rand(3,4,10).var(ddof=1)
if i == print_at:
print(math.sqrt(result/i))
print_at *= 10
print("...")
print(math.sqrt(1/12))
Пример прогона:
0.28103387158480164
0.2952158859220745
0.2902562660869275
0.28882685146952614
0.2887019908636715
0.2886783761564752
0.2886714244895549
...
0.28867513459481287