2016-01-08 7 views
2

EDITED2: Точный вопрос переформулирован. Редакция: опечатка в коде:numpy случайное использование действительность

Я хотел бы генерировать 1000 образцов 10 независимы случайной величины (здесь гауссы).

Являются ли эти 2 эквивалента математической точкой зрения (независимость между 10 случайными величинами).

direct: 1000 образцов из 10 случайных величин.

import numpy as np 
np.random.seed(123) 
x= np.random.normal(0,1 (10, 1000)) 

С Loop: Генерация образца на образце вектор 10 случайных величин.

import numpy as np 
np.random.seed(123) 
for(i in range(0,1000)): 
    x[:,i]= np.random.normal(0,1,(10, 1)) 

Причина сделать paralell отбор проб ... ли эти 2 метода генерируют 1000 проб 10 независим гауссовой случайной величины? (Не уверен, что образцы независимы).

Я изучил другие вопросы, нет никаких указаний о том, как Mersenne Twister реализован в numpy. Таким образом, вопросы относятся, если 2 последовательных вызова random.normal производят независимые значения (т.е. реализация random.normal).

(Представьте себе случай, что «вручную», я сбросить семя между вызовами ... это явно не независим ... (нет никакого интереса, чтобы сделать это).

Конечно, мы можем проверьте POSTERIORI, это может быть правдой, посмотрев статистику .... это не доказывает это ....

+3

Numpy реализует MT. http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.random.RandomState.html – Reti43

+0

Что вы подразумеваете под _there, нет никаких указаний о том, как Mersenne Twister реализован в 'numpy'_ ? Всегда есть [источник] (https://github.com/numpy/numpy/tree/master/numpy/random/mtrand)! –

ответ

3

Да, они статистически эквивалентны. Пока вы генерируете числа для одинакового нормального распределения, они будут иметь те же статистические характеристики, то есть среднее и стандартное отклонение должно быть очень близким к среднему и стандартизованному отклонению. Например,

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 не справится с задачей вашей проблемы, вы можете выбрать (и, возможно, реализовать) что-то другое. Однако, не зная, что вы пытаетесь сделать, невозможно дать более солидные советы.

+0

спасибо, я сделал опечатку в коде ... Я исправил с правильным –

+0

@quantCode Я пересмотрел свой ответ, чтобы соответствовать вашему обновленному вопросу. – Reti43

+0

Спасибо. но; Являются ли случайные числа независимыми друг от друга? (Я буду переформулировать свой вопрос в сообщении) –