Да, они статистически эквивалентны. Пока вы генерируете числа для одинакового нормального распределения, они будут иметь те же статистические характеристики, то есть среднее и стандартное отклонение должно быть очень близким к среднему и стандартизованному отклонению. Например,
import numpy as np
mu, sigma = 2.0, 0.5
# A and B will have different seeds and so different numbers
A = np.random.normal(mu, sigma, size=(1000, 1000))
B = np.random.normal(mu, sigma, size=(1000, 1000))
# But their statistical characteristics should be similar enough
print(mu, np.mean(A), np.mean(B))
print(sigma, np.std(A), np.std(B))
Произвольные случайные числа, начинающиеся с одного и того же семени, всегда будут одинаковыми, предполагая, конечно, что мы используем ту же функцию, что и в этом случае. Итак, это означает, что ваши два массива будут содержать одни и те же элементы, но не в том же порядке. Мы можем наблюдать это с помощью небольшого примера, подходящего нашему экрану.
size = (3, 5)
def method1():
np.random.seed(123)
return np.random.normal(0, 1, size)
def method2():
np.random.seed(123)
x = np.zeros(size, dtype=float)
for i in range(size[1]):
x[:,i] = np.random.normal(0, 1, size[0])
return x
Выход
# method 1
array([[-1.0856306 , 0.99734545, 0.2829785 , -1.50629471, -0.57860025],
[ 1.65143654, -2.42667924, -0.42891263, 1.26593626, -0.8667404 ],
[-0.67888615, -0.09470897, 1.49138963, -0.638902 , -0.44398196]])
#method 2
array([[-1.0856306 , -1.50629471, -2.42667924, -0.8667404 , 1.49138963],
[ 0.99734545, -0.57860025, -0.42891263, -0.67888615, -0.638902 ],
[ 0.2829785 , 1.65143654, 1.26593626, -0.09470897, -0.44398196]])
Оба метода генерируют одни и те же 3 * 5 чисел. Однако первый метод помещает первые 5 в первую строку, следующие 5 во второй строке и т. Д. Хотя второй метод помещает первые 3 в первый столбец, следующие 3 во втором столбце и т. Д. Фактически, если method2()
был переписан следующим образом, он поместил числа одинаково (по строкам) как method1()
.
# same result as `method1()`
def method3():
np.random.seed(123)
x = np.zeros(size, dtype=float)
for i in range(size[0]):
x[i,:] = np.random.normal(0, 1, size[1])
return x
Само собой разумеется, что если каждый метод генерирует одни и те же номера, но в другом порядке, статистические характеристики каждой строки/столбца между ними не будет одинаковым (так как они имеют разные номера). Однако, если выборки для каждой строки/столбца достаточно велики, то есть размер, они должны подчиняться статистической характеристике распределения, из которого они были взяты.
Edit: Отбор проб индепендентство
Из documentation см мы, что NumPy реализует алгоритм Мерсенна Twister (MT). Он создает контейнер, который использует все другие дистрибутивы, такие как normal()
, exponential()
и т. Д.
MT - широко используемый PRNG и широко изучен. Любой PRNG, достойный его соли, будет хорошо работать против батареи тестов, которые проверяют статистические свойства алгоритма. Читайте об Diehard tests и TestU01. Найдите ключевые слова normal и форму (т. Е. Независимо) на этих страницах, чтобы прочитать о конкретных тестах.
Вы также можете прочитать this post о теоретическом подходе к генератору случайных чисел.
Нижняя линия, используемые нами генераторы, мы используем их, потому что они считаются достаточно хорошими за то, что мы хотим сделать. Если вы беспокоитесь о том, что MT не справится с задачей вашей проблемы, вы можете выбрать (и, возможно, реализовать) что-то другое. Однако, не зная, что вы пытаетесь сделать, невозможно дать более солидные советы.
Numpy реализует MT. http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.random.RandomState.html – Reti43
Что вы подразумеваете под _there, нет никаких указаний о том, как Mersenne Twister реализован в 'numpy'_ ? Всегда есть [источник] (https://github.com/numpy/numpy/tree/master/numpy/random/mtrand)! –